kubernetes(k8s) 学习 (三) pod的生命周期(测试init容器和探针)

本文深入探讨Kubernetes中Pod的生命周期,包括初始化容器的作用、生命周期钩子的使用、容器探测机制,以及Pod从创建到终止的全过程。同时,介绍了Pod的五种状态,通过实例演示了初始化容器和探针实验的具体操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

pod的生命周期

Pod 是 kubernetes 系统的基础单元,是由用户创建或部署的最小组件,也是 kubernetes 系统上运行容器化应用的资源对象。
Kubernetes 集群中其他资源对象都是为 pod 这个资源对象做支撑来实现 kubernetes 管理应用服务的目的

因此了解pod就显得尤为重要。
在这里插入图片描述
一、初始化容器
初始化容器即 pod 内主容器启动之前要运行的容器,主要是做一些前置工作,初始化容器具有以下特征:

1.初始化容器必须首先执行,若初始化容器运行失败,集群会一直重启初始化容器直至完成,注意,如果 pod 的重启策略为 Never,那初始化容器启动失败后就不会重启。

2.初始化容器必须按照定义的顺序执行,初始化容器可以通过 pod 的 spec.initContainers 进行定义。

在这里插入图片描述在这里插入图片描述

二、声明周期钩子函数

Kubernetes 为容器提供了两种生命周期钩子:
Poststart:于容器创建完成之后立即运行的钩子程序。
preStop:容器终止之前立即运行的程序,是以同步方式的进行,因此其完成之前会阻塞 删除容器的调用

备注:钩子程序的执行方式有“Exec”和“HTTP”两种。

三、容器探测

容器探测分为存活性探测和就绪性探测容器探测是kubelet对容器健康状态进行诊断,容器探测的方式主要以下三种:

ExecAction:在容器中执行命令,根据返回的状态码判断容器健康状态,
返回0即表示成功,否则为失败。

TCPSocketAction: 通过与容器的某TCP端口尝试建立连接进行诊断,
端口能打开即为表示成功,否则失败。

HTTPGetAction:向容器指定 URL 发起 HTTP GET 请求,
响应码为2xx或者是3xx为成功,否则失败。

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
四、Pod终止过程

终止过程主要分为如下几个步骤:

 1.  用户发出删除 pod 命令
 2. Pod 对象随着时间的推移更新,在宽限期(默认情况下30秒),pod 被视为“dead”状态
 3.  将 pod 标记为“Terminating”状态
 4. 第三步同时运行,监控到 pod 对象为“Terminating”状态的同时启动 pod 关闭过程 5.第三步同时进行,endpoints 控制器监控到 pod 对象关闭,将pod与service匹配的 endpoints 列表中删除
 5. 如果 pod 中定义了 preStop 钩子处理程序,则 pod 被标记为“Terminating”状态时以同步的方式启动执行;若宽限期结束后,preStop 仍未执行结束,第二步会重新执行并额外获得一个2秒的小宽限期
 6.   Pod 内对象的容器收到 TERM 信号
 7.  宽限期结束之后,若存在任何一个运行的进程,pod 会收到 SIGKILL 信号
 8.  Kubelet 请求 API Server 将此 Pod 资源宽限期设置为0从而完成删除操作

此外 kubelet 除了启动之外,kubelet 中还有 cAdvisor,用于收集容器 CPU、内存、文件系统和网络使用情况等信息,与 prometheus 结合实现对集群内 pod 监控

pod的5种状态

Pod 的所有状态总共有 5 种,分别如下:
  1. 挂起(Pending):Pod 已被 Kubernetes 系统接受,但有一个或者多个容器
   镜像尚未创建。等待时间包括调度 Pod 的时间和通过网络下载镜像的时间,
   这可能需要花点时间。
 
  2. 运行中(Running):该 Pod 已经绑定到了一个节点上,Pod 中所有的容器
  都已被创建。至少有一个容器正在运行,或者正处于启动或重启状态。
    
  3.成功(Succeeded):Pod 中的所有容器都被成功终止,并且不会再重启。
  4.  失败(Failed):Pod 中的所有容器都已终止了,并且至少有一个容器是因为失败终止。也就是说,容器以非0状态退出或者被系统终止。
  5.  未知(Unknown):因为某些原因无法取得 Pod 的状态,通常是因为与 Pod 所在主机通信失败。

init容器实验

1.实验环境

主机名(IP) 	服务
ser1(172.25.2.2) 	harbor仓库
ser2(172.25.2.3) 	master
ser3(172.25.2.4) 	node1
ser4(172.25.2.5) 	node2

关闭上述主机的防火墙,selinx,设置每台主机可以上网

在这里插入图片描述

题外话:
在这里插入图片描述
在这里插入图片描述
1.先写一个简单的资源清单,里面没有定义init容器

在这里插入图片描述在这里插入图片描述可以看出,这个资源清单里只运行了一个容器。
在这里插入图片描述
2.在这里插入图片描述在这里插入图片描述3.一些概念
在这里插入图片描述在这里插入图片描述在这里插入图片描述4.创建测试pod的资源清单
在这里插入图片描述
在这里插入图片描述进行转义即可,用纯vi去掉缩进

在这里插入图片描述在这里插入图片描述
在这里插入图片描述5.创建pod,查看pod的状态
在这里插入图片描述在这里插入图片描述6.查看详细信息时发现
在这里插入图片描述

在这里插入图片描述7.进入pod中的init容器
在这里插入图片描述在这里插入图片描述8.创建一个service
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述8.init容器初始化成功,退出
在这里插入图片描述在这里插入图片描述
9.访问myapp-pod容器

在这里插入图片描述10.进入容器,查看dns解析
在这里插入图片描述在这里插入图片描述

探针实验

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
用户运行容器的过程
在这里插入图片描述

liveness测试,检测存活

1.删除之前实验时创建的myservice服务
在这里插入图片描述2.在这里插入图片描述在这里插入图片描述3.在这里插入图片描述4.在这里插入图片描述5.在这里插入图片描述6.
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

readiness探针测试,检测就绪

1.在这里插入图片描述2.
在这里插入图片描述在这里插入图片描述3.查看pod的日志时
在这里插入图片描述在这里插入图片描述因为nginx的发布目录里,找不到test.html文件

4.查看pod的详细信息时,发现404报错
在这里插入图片描述5.将test文件写入,通过探针的就绪检测
在这里插入图片描述在这里插入图片描述6.删除test.html文件
在这里插入图片描述在这里插入图片描述

<think>嗯,用户之前问过关于Pod异常状态的问题,现在他们想知道Kubernetes源码中Pod的状态有哪些。我需要从源码的角度来解释,而不仅仅是用户层面的状态。 首先,我得回忆一下KubernetesPod的状态是如何定义的。用户之前了解的是运行时的状态,比如ImagePullBackOff、CrashLoopBackOff等,但现在他们需要源码中的具体状态字段。 在Kubernetes的API中,Pod的状态主要由PodStatus结构体表示,里面包含phase、conditions、message等字段。Phase包括Pending、Running、Succeeded、Failed、Unknown这些。而Conditions则更详细,比如PodScheduled、Ready、Initialized等。 用户可能想知道源码里具体有哪些状态定义,而不仅仅是表面看到的状态。需要解释每个字段的含义,比如phaseconditions的区别,以及它们是如何在源码中实现的。 另外,用户可能对如何查看这些状态或者源码中的结构感兴趣,可能需要提到源码中的位置,比如pkg/apis/core/types.go里的PodStatus结构体。不过用户可能不需要具体的代码行数,但需要知道这些状态是如何组织的。 还要注意区分用户之前的问题,这次是从源码角度,所以需要更深入一些,但不要过于技术化。需要保持回答的结构清晰,分点说明,比如Phase、Conditions、ContainerStatuses等部分。 可能需要提到每个Phase的可能值,Conditions的类型,以及容器状态的细节。同时,需要说明这些状态是如何被Kubelet控制器管理的,比如Kubelet更新状态,控制器根据条件进行决策。 还要注意用户可能的实际需求,比如调试或开发时了解源码中的状态定义,所以需要给出一些实际的例子或如何查看这些状态的方法,比如kubectl describe的输出对应源码中的哪些部分。 最后,总结一下,确保回答覆盖了源码中Pod状态的主要部分,并与用户之前的问题区分开来,提供新的有价值的信息。</think>以下是 **Kubernetes 源码中 Pod 状态的详细解析**,从源码层面拆解其核心状态定义及管理逻辑: --- ### **1. Pod 状态的源码结构** Pod 状态定义在 Kubernetes API 的 `PodStatus` 结构体中(源码路径:`pkg/apis/core/types.go`),核心字段如下: ```go type PodStatus struct { Phase PodPhase // Pod 整体阶段(如 Running) Conditions []PodCondition // 详细状态条件(如 Ready) Message string // 人类可读的状态描述 Reason string // 机器可读的状态原因(如 CrashLoopBackOff) HostIP string // Pod 所在节点 IP PodIP string // Pod 的 IP StartTime *metav1.Time // Pod 启动时间 ContainerStatuses []ContainerStatus // 容器详细状态 // 其他字段省略... } ``` --- ### **2. Pod 核心状态详解** #### **(1) Phase(阶段)** 定义在 `PodPhase` 类型中,表示 Pod 的**整体生命周期阶段**: ```go type PodPhase string const ( PodPending PodPhase = "Pending" // 等待调度或资源准备 PodRunning PodPhase = "Running" // 至少一个容器在运行 PodSucceeded PodPhase = "Succeeded" // 所有容器正常退出(Job/CronJob) PodFailed PodPhase = "Failed" // 至少一个容器异常退出 PodUnknown PodPhase = "Unknown" // 无法获取状态(节点失联等) ) ``` #### **(2) Conditions(状态条件)** 通过 `PodCondition` 描述 Pod 的**详细健康状态**(每个条件包含 `type`, `status`, `reason`, `message`): ```go type PodCondition struct { Type PodConditionType // 条件类型 Status ConditionStatus // True/False/Unknown // 其他字段... } // 常见条件类型: const ( PodScheduled PodConditionType = "PodScheduled" // 是否已调度到节点 ContainersReady PodConditionType = "ContainersReady"// 所有容器准备就绪 Initialized PodConditionType = "Initialized" // Init 容器是否完成 Ready PodConditionType = "Ready" // 是否可对外服务 ) ``` #### **(3) ContainerStatuses(容器状态)** 记录**每个容器的详细状态**: ```go type ContainerStatus struct { Name string // 容器名称 State ContainerState // 当前状态(Waiting/Running/Terminated) LastTerminationState ContainerState // 上次终止状态 Ready bool // 是否通过就绪探针 RestartCount int32 // 重启次数 Image string // 使用的镜像 ImageID string // 镜像 ID(哈希值) // 其他字段... } // 容器状态类型: type ContainerState struct { Waiting *ContainerStateWaiting // 等待启动(如镜像拉取) Running *ContainerStateRunning // 运行中 Terminated *ContainerStateTerminated // 已终止 } ``` --- ### **3. 状态更新机制** - **Kubelet 负责上报状态**: 每个节点上的 Kubelet 周期性地通过 `PodStatusManager` 更新 Pod 状态到 API Server。 - **控制器决策依据**: Deployment、StatefulSet 等控制器根据 `PodPhase` `Conditions` 决定是否触发替换或修复操作。 --- ### **4. 状态转换示例** ```plaintext 1. Pod 创建 → Phase=Pending - Condition: PodScheduled=False(等待调度) 2. 调度完成 → PodScheduled=True - 开始拉取镜像 → Phase 仍为 Pending 3. 镜像拉取成功 → 容器启动 - Phase=Running - Condition: ContainersReady=False(未通过就绪探针) 4. 就绪探针通过 → ContainersReady=True + Ready=True - Pod 进入可用状态 ``` --- ### **5. 调试技巧** - **查看完整状态**: ```bash kubectl get pod <pod-name> -o yaml # 查看 status 字段的完整结构 ``` - **源码定位**: - 状态定义:`pkg/apis/core/types.go` - 状态管理:`pkg/kubelet/status/status_manager.go` --- 通过理解源码中的状态结构,可以更精准地定位问题(例如区分 `Phase=Running` 但 `Ready=False` 的场景),这对开发自定义控制器或深度调试集群问题至关重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值