1. Pod配置文件详解
使用配置文件创建 Pod,编写 nginx-demo.yaml
内容如下:
apiVersion: v1 # api 文档版本
kind: Pod # 资源对象类型,也可以配置为像Deployment、StatefulSet这一类的对象
metadata: # Pod 相关的元数据,用于描述 Pod 的数据
name: nginx-demo # Pod 的名称
labels: # 定义 Pod 的标签
type: app # 自定义label标签,名字为 type,值为 app
version: 1.0.0 # 自定义label标签,描述 Pod 版本号
namespace: 'default' # 命名空间的配置
spec: # 期望 Pod 按照这里面的描述进行创建
containers: # 对于 Pod 中的容器描述
- name: nginx # 容器的名称
image: nginx:latest # 指定容器的镜像
imagePullPolicy: IfNotPresent # 镜像拉取策略:只有当本地不存在时才会拉取
command: # 指定容器启动时执行的命令: nginx -g 'daemon off;'
- nginx
- -g
- 'daemon off;'
ports:
- name: http # 端口名称
containerPort: 80 # 描述容器内要暴漏什么端口
protocol: TCP # 描述该端口是基于哪种协议通信的
env: # 环境变量
- name: USER # 环境变量名称
value: wuye # 环境变量值
resources:
requests: # 最少需要多少资源
cpu: 100m # 限制 cpu 最少使用 0.1 个核心(1000m等于一个cpu)
memory: "100Mi" # 限制内存最少使用100兆
limits: # 最多可以用多少资源
cpu: 500m # 限制 cpu 最多使用 0.5 个核心
memory: "200Mi" # 限制内存最多使用200兆
restartPolicy: OnFailure # 重启策略
文件编辑之后创建Pod:
kubectl create -f nginx-demo.yaml
kubectl describe po nginx-demo # 查看容器描述信息
kubectl get po -o wide # 查看 pod 状态
route -n # 可以通过route命令查看路由表,如果没有route命令请安装net-tools
2. Pod探针
2.1 探针是什么
在 Kubernetes(k8s)中,探针(Probes) 是确保容器化应用稳定运行的核心机制。它通过主动检测应用状态,自动执行故障恢复或流量管理,实现“自愈”能力。
Kubernetes 提供三种探针:
- 存活探针(Liveness Probe)
livenessProbe
检测应用是否“活着”。若失败,k8s会重启容器,适用于处理死锁或僵死进程。 - 就绪探针(Readiness Probe)
readinessProbe
判断应用是否“准备好”接收流量。若失败,从Service端点移除Pod,避免请求被转发到未就绪的实例。 - 启动探针(Startup Probe)
startupProbe
针对启动缓慢的应用,延迟其他探针的检查,确保初始化完成后再接受存活和就绪检查。
探针的优先级规则:
启动探针(Startup Probe)优先级最高
如果配置了启动探针,Kubernetes 会优先执行它,在启动探针成功之前,存活探针(Liveness)和就绪探针(Readiness)不会启动。
- 用途:为慢启动应用争取初始化时间,避免存活/就绪探针过早介入导致容器被误重启或拒绝流量。
存活探针和就绪探针并行运行
启动探针成功后,存活和就绪探针会独立并行执行,二者无优先级之分,但职责不同:
- 存活探针失败 → 重启容器。
- 就绪探针失败 → 从 Service 摘除 Pod。
示例配置(YAML片段):
containers:
- name: my-app
livenessProbe: # 应用存活探针
httpGet: # 探测方式,基于http请求探测
path: /healthz
port: 8080
initialDelaySeconds: 5 # 等待5秒后开始检查
failureThreshold: 3 # 失败多少次才算真正失败
periodSeconds: 10 # 失败后间隔多少秒再次检测
successThreshold: 1 # 请求多少次成功才算成功
timeoutSeconds: 5 # 请求的超时时间
readinessProbe:
tcpSocket:
port: 80
periodSeconds: 10 # 每10秒检测一次
2.2 探针的使用
在上面已经介绍过了探针分为3种类型,用法是完全一致的,这里以启动探针 startupProbe
为例:
同样以前面写的 nginx-demo
为例,首先查看并删除已存在的pod:
kubectl get po # 查看pod
kubectl delete po nginx-demo
修改 nginx-demo.yaml
,添加启动探针startupProbe
配置,以下是部分片段:
spec: # 期望 Pod 按照这里面的描述进行创建
containers: # 对于 Pod 中的容器描述
- name: nginx # 容器的名称
image: nginx:latest # 指定容器的镜像
imagePullPolicy: IfNotPresent # 镜像拉取策略:只有当本地不存在时才会拉取
startupProbe: # 使用启动探针
httpGet: # 探测方式:基于http请求探测
path: /api/path
port: 80
initialDelaySeconds: 5 # 等待5秒后开始检查
failureThreshold: 3 # 失败多少次才算真正失败
periodSeconds: 10 # 失败后间隔多少秒再次检测
successThreshold: 1 # 请求多少次成功才算成功
timeoutSeconds: 5 # 请求的超时时间
command:
启动并查看pod描述。
因为
nginx
中肯定是没有/api/path
路由的,所以肯定是不成功的。这里只是为了熟悉探针的作用。如果想看成功的结果,把path改为path: /index.html
即可成功。
kubectl create -f nginx-demo.yaml
kubectl describe po nginx-demo
也可以尝试其它的检测方式:
tcpSocket:
port: 80
exec:
command:
- sh
- -c
- "sleep 5; echo 'success' > /inited;"
# kubectl exec -it nginx-demo -c nginx -- cat /inited # 查看写入的文件内容
3. Pod的生命周期
Pod的生命周期:https://v1-31.docs.kubernetes.io/zh-cn/docs/concepts/workloads/pods/pod-lifecycle/
容器的生命周期事件处理函数:https://v1-31.docs.kubernetes.io/zh-cn/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/
3.1 Pod的生命周期
Pod 生命周期核心阶段
Pod 是 Kubernetes 的最小调度单元,其生命周期分为以下几个关键阶段:
阶段 | 描述 |
---|---|
Pending | Pod 已被系统接受,但容器未完全创建(如镜像下载中、资源不足)。 |
Running | Pod 已绑定到节点,所有容器已创建,至少一个容器在运行或正在启动/重启。 |
Succeeded | 所有容器正常终止(退出码为0),且不再重启(常见于一次性任务 Pod)。 |
Failed | 至少一个容器异常终止(非0退出码),且未被设置为自动重启。 |
Unknown | 无法获取 Pod 状态(通常由节点失联导致)。 |
生命周期关键流程与组件
初始化阶段(Init Containers)
- 作用:在应用容器启动前,执行初始化任务(如配置下载、依赖检查)。
- 特点:
- 按顺序执行,前一个成功后才运行下一个。
- 若任意 Init 容器失败,Pod 重启(根据
restartPolicy
)。
spec: initContainers: - name: init-db image: busybox command: ['sh', '-c', 'until nslookup db-service; do echo waiting; sleep 2; done']
主容器启动
所有 Init 容器成功后,主容器并行启动。
启动后钩子(PostStart):容器启动后立即执行(非阻塞)。
lifecycle: postStart: exec: command: ['sh', '-c', 'echo "Container started" > /tmp/log']
健康检查阶段
- 探针生效顺序:
- 启动探针(Startup Probe):延迟存活/就绪探针,直到应用完成初始化。
- 存活探针(Liveness Probe):检测容器是否崩溃,失败则重启。
- 就绪探针(Readiness Probe):控制流量准入,失败则从 Service 摘除 Pod。
- 探针生效顺序:
运行中状态
- Pod 处于
Running
状态,持续响应探针检查。 - 容器重启策略(restartPolicy):
Always
(默认):容器退出即重启。OnFailure
:仅当非0退出码时重启。Never
:不重启。
- Pod 处于
终止阶段
触发条件:手动删除、资源不足、节点故障等。
终止流程:
触发 PreStop 钩子(优雅关闭前的清理任务)。
lifecycle: preStop: exec: command: ['sh', '-c', 'sleep 10; nginx -s quit']
发送 SIGTERM 信号 给容器,等待优雅终止(默认30秒)。
超时后强制终止(SIGKILL)。

3.2 生命周期事件应用示例
spec:
terminationGracePeriodSeconds: 40 # 当 pod 被删除时,给这个 pod 宽限多长事件;默认30s
containers:
- name: nginx # 容器的名称
image: nginx:latest # 指定容器的镜像
imagePullPolicy: IfNotPresent # 镜像拉取策略:只有当本地不存在时才会拉取
lifecycle: # 生命周期的配置
postStart: # 生命周期启动阶段做的事情,不一定在容器的 command 之前运行
exec:
command:
- sh
- -c
- "echo '<h1>pre stop</h1>'> /usr/share/nginx/html/prestop.html"
preStop:
exec:
command:
- sh
- -c
- "sleep 50;echo 'sleep finished...'>> /usr/share/nginx/html/prestop.html"