-
1.1 Pod生命周期
1.1.1 过程及状态
Pod 的生命周期管理是 Kubernetes 集群中非常重要的一部分,它涉及到 Pod 从创建到销毁的整个过程。下面是 Pod 生命周期中各个阶段的简要说明:
-
Pod 创建过程:当一个 Pod 被创建时,Kubernetes 会为它分配资源并开始调度过程。
-
运行初始化容器(Init Container):在 Pod 的主容器启动之前,可以定义一个或多个初始化容器。这些容器会先于主容器运行,通常用于执行一些初始化操作,比如设置配置文件或等待其他服务就绪。
-
运行主容器(Main Container):初始化容器完成后,Pod 中的主容器会启动。主容器是 Pod 的核心部分,它负责执行应用程序的主要逻辑。
-
容器启动后钩子(Post Start Hook):这是 Kubernetes 提供的一种回调机制,当容器创建并启动后,会调用这个钩子。可以在这个钩子中执行一些容器启动后需要立即进行的操作。
-
容器终止前钩子(Pre Stop Hook):当容器即将被终止时,Kubernetes 会调用这个钩子。这允许容器进行一些清理工作,比如保存状态、释放资源等。
-
容器的存活性探测(Liveness Probe):Kubernetes 会定期检查容器的存活性,以确保容器仍在正常运行。如果探测失败,Kubernetes 会重启该容器。
-
就绪性探测(Readiness Probe):与存活性探测类似,就绪性探测用于确定容器是否已经准备好接收流量。如果探测失败,Kubernetes 会将该容器从服务的端点列表中移除,直到它再次就绪。
-
Pod 终止过程:当 Pod 被标记为需要终止时,Kubernetes 会停止所有的容器,并进行清理工作。在 Pod 被完全终止之前,可能会执行一些终止前的操作,比如保存状态或执行其他必要的清理任务。
Pod 的状态确实可以反映其当前的生命周期阶段。以下是 Pod 的五种状态(相位)的详细解释:
-
挂起(Pending):这个阶段表示 Pod 已经被 Kubernetes API 服务器创建,但尚未被调度到任何节点上。这可能是因为没有合适的节点可供调度,或者因为 Pod 正在等待某些依赖的资源(如 ConfigMaps、Secrets 或者容器镜像)。
-
运行中(Running):在这个状态中,Pod 已经被调度到节点上,并且所有的容器都已经被创建。至少有一个容器正在运行,或者正在启动或重启。
-
成功(Succeeded):当 Pod 中的所有容器都正常运行并成功退出(返回了退出代码 0),并且不会被重启时,Pod 就会进入成功状态。这通常用于表示批处理任务已经完成。
-
失败(Failed):如果 Pod 中的所有容器都终止了,但至少有一个容器是因为失败而终止的(即返回了非零的退出代码),Pod 就会进入失败状态。这表明 Pod 没有成功完成任务。
-
未知(Unknown):当 Kubernetes 控制平面无法获取到 Pod 的状态信息时,Pod 就会进入未知状态。这通常是由于与 Pod 所在节点的通信失败导致的。如果节点长时间无法与控制平面通信,可能会认为节点及其上的 Pods 处于未知状态。
1.1.2 创建和终止
1.1.2.1 Pod创建过程
Pod 的创建过程可以简写为以下几个步骤:
-
提交请求:用户通过
kubectl
或 API 客户端向 API 服务器提交创建 Pod 的请求。 -
创建对象:API 服务器创建 Pod 对象并存储到 etcd,然后向客户端确认创建成功。
-
监听变化:其他组件通过 watch 机制监听 API 服务器上的 Pod 对象变化。
-
调度决策:调度器为 Pod 选择节点,并将调度结果更新到 API 服务器。
-
启动容器:节点上的 kubelet 启动容器,并将状态回传给 API 服务器。
-
状态更新:API 服务器更新 etcd 中的 Pod 状态信息。
1.1.2.2 Pod终止过程
-
发送删除命令:用户通过
kubectl
或 API 客户端向 API 服务器发送删除 Pod 对象的命令。 -
宽限期:API 服务器开始等待宽限期(默认为 30 秒),在此期间 Pod 被视为 "dead",但尚未被立即删除。
-
标记为终止:Pod 被标记为
terminating
状态,告知系统它正在被删除。 -
Kubelet 启动关闭过程:节点上的 kubelet 监控到 Pod 状态变为
terminating
,开始关闭 Pod。 -
端点控制器移除:端点控制器发现 Pod 正在关闭,将其从所有相关服务的端点列表中移除。
-
PreStop 钩子:如果 Pod 定义了
preStop
钩子,这些钩子会被触发并同步执行,以进行清理操作。 -
停止容器:Pod 中的容器进程收到停止信号,开始正常关闭。
-
强制终止:如果宽限期结束,仍有进程在运行,kubelet 会发送信号强制终止这些进程。
-
完成删除:Kubelet 请求 API 服务器将 Pod 的宽限期设置为 0,完成删除操作,此时 Pod 对用户不可见。
1.1.3 初始化容器
初始化容器(Init Container)在 Kubernetes 中用于执行 Pod 中主容器启动前的一些初始化任务。
-
必须成功完成:每个初始化容器必须运行成功直至结束。如果某个初始化容器失败,Kubernetes 会尝试重启该容器,直到它成功完成。这确保了在主容器启动之前,所有的初始化工作都已经正确执行。
-
顺序执行:初始化容器按照在 Pod 定义中出现的顺序执行。只有当前一个初始化容器成功完成后,下一个才会开始执行。这允许复杂的初始化逻辑被分解成有序的步骤。
1.1.3.1 应用场景
-
环境检查:初始化容器可以用于检查外部服务是否可用,例如数据库或配置服务器,然后才启动应用容器。
-
数据加载:在启动应用之前,可能需要从外部源加载数据或配置文件到 Pod 中。
-
权限设置:有时需要在启动主容器之前设置文件权限或创建必要的目录结构。
-
依赖安装:安装主容器运行所需的依赖库或工具,特别是当这些依赖不包含在主容器镜像中时。
-
资源等待:等待某些资源(如 PersistentVolume 卷)准备就绪。
-
健康检查:对系统进行健康检查,确保所有依赖服务都处于健康状态,然后才启动应用。
-
自定义脚本执行:运行自定义脚本,执行如数据库迁移或缓存预热等操作。
1.1.3.2 测试
-
创建一个包含两个初始化容器的 Pod,其中一个初始化容器用于检查 MySQL 服务是否可达,另一个用于检查 Redis 服务是否可达。只有在两个服务都可达的情况下,主容器(Nginx)才会启动。
[root@K8s-master ~]# vim pod-initcontainer.yaml --- apiVersion: v1 kind: Pod metadata: name: pod-initcontainer namespace: test spec: containers: - name: main-container image: nginx:1.17.1 ports: - name: nginx-port &n
-
Kubernetes最小单元Pod的生命周期
最新推荐文章于 2024-10-03 19:34:49 发布