Pod与容器的关系
Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。Pod是一组容器(一个或多个),这些容器共享存储、网络、以及怎样运行这些容器的声明。Pod 的共享上下文包括一组 Linux 名字空间、控制组(cgroup)和可能一些其他的隔离方面, 这些也是用来隔离 Docker 容器的技术,就 Docker 概念的术语而言,Pod 类似于共享namespace和文件系统卷的一组 Docker 容器。
Kubernetes 集群中的 Pod 主要有两种用法:
- 运行单个容器的 Pod。"每个 Pod 一个容器" 模型是最常见的 Kubernetes 用例; 在这种情况下,可以将 Pod 看作单个容器的包装器,并且 Kubernetes 直接管理 Pod,而不是容器。
- 运行多个协同工作的容器的 Pod。 Pod 可能封装由多个紧密耦合且需要共享资源的共处容器组成的应用程序。 这些位于同一位置的容器可能形成单个内聚的服务单元 ,比如:一个容器将文件从共享卷提供给公众, 而另一个单独的 sidecar容器则刷新或更新这些文件。 Pod 将这些容器和存储资源打包为一个可管理的实体。
Pod的创建过程
- 用户通过 kubectl 提交包含Pod Spec信息的创建Pod请求给 API Server。
- API Server 将 Pod 对象信息存入 etcd 中,待写入操作执行完成,APServer 即会返回确认信息至客户端。
- 基于k8s的list-watch机制(发布 - 订阅模式),API Service组件Watch着etcd的变化,而Scheduler和Kubelet组件Watch着API Server组件。当新的pod对象信息写入etcd后,Scheduler调度器通过Api Server感知到了要调度机器初步创建新的Pod。
- Scheduler 为 Pod 挑选一个Node节点并将结果信息更新至 API Server,由API Server将调度结果信息更新至 etcd 存储。
- Kubelet通过watch着API Server感知到了调度结果,调度结果中对应的Node节点就会尝试调用 Docker 启动容器。
- 容器启动成功后,Kubelet通过API Server 将 Pod 状态信息存入 etcd 系统中,并将确认信息发送至相关的kubelet。
Pod的生命周期
Pod的整个生命周期分为如下阶段:
- Pending:API Server创建了Pod资源对象并已存入etcd中,但容器还未创建完成,或者仍处于从仓库下载镜像的过程中。
- Running:Pod已经被调度至某节点,并且所有容器都已经被kubelet创建完成。
- Succeeded:Pod中的所有容器都已经成功终止并且不会被重启,通常这个状态会很短。
- Failed:所有容器都已经终止,但至少有一个容器终止失败,即容器返回了非0值的退出状态或已经被系统终止。
- Unknown:API Server无法正常获取到Pod对象的状态信息,通常是由于其无法与所在工作节点的kubelet通信所致。
K8s 会跟踪 Pod 中每个容器的状态:
- Waiting:表示容器仍在运行启动所需要的操作,例如拉取镜像。 使用kubectl describe pod查看pod中的容器状态,其中Reason字段给出了容器处于等待状态的原因。
- Running:表明容器正在运行中的状态,并且没有问题发生。 如果配置了 postStart 回调,那么该回调已经执行且已完成。
- Terminated:容器已经执行完正常结束或者因为某些原因失败,使用kubectl describe pod命令可查看进入此状态的原因以及容器执行期间的起止时间。 如果容器配置了preStop 回调,则该回调会在容器进入Terminated状态之前执行。