Kubernetes最小单元Pod的生命周期

  • 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 被完全终止之前,可能会执行一些终止前的操作,比如保存状态或执行其他必要的清理任务。

    image-20240509100139686

    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 状态信息。

    image-20240509100813009

    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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值