Pod管理及优化

一 什么是Pod

  • Pod 是 Kubernetes(K8s)中最小的部署和运行单位。
  • 封装了一个或多个容器,并提供共享网络、存储和生命周期管理

1 创建自主式pod

优点:

配置控制能力强

  • 自主式 Pod 可以由用户直接定义和管理,能够精细化设置 Pod 的各项参数,例如容器镜像、CPU 和内存资源限制、环境变量、启动命令以及运行参数等,可以满足一些特殊业务场景的定制化需求。

便于学习和问题排查

  • 通过手动创建 Pod,可以更加直观地理解 Kubernetes 中 Pod 的运行机制、生命周期以及配置方式。对于开发测试和故障排查场景,可以快速调整配置并观察运行效果,方便定位问题。

适合特定应用场景

  • 在执行临时任务、功能验证、实验测试或资源条件有限的环境中,自主式 Pod 可以快速部署应用,不依赖复杂的控制器管理,具有较高的灵活性。

缺点:

运维管理成本较高

  • 当 Pod 数量增加时,手动创建、配置和维护多个 Pod 会变得复杂,需要投入更多人工成本。同时缺少自动扩缩容和自动故障恢复能力,难以满足大规模应用管理需求。

缺少 Kubernetes 控制器提供的能力

  • 自主式 Pod 不受 Deployment、StatefulSet 等控制器管理,因此无法直接使用自动发布、滚动升级、副本管理、故障迁移等 Kubernetes 高级功能,应用管理效率相对较低。

后期维护困难

  • 当应用需要升级版本、调整配置或迁移环境时,需要人工修改和重新部署 Pod,容易出现配置不一致或操作失误的问题。相比使用声明式资源和控制器管理,自主式 Pod 的长期维护成本更高。
bash 复制代码
# 查看当前 Namespace 中的 Pod
[root@K8s ~]# kubectl get pods
No resources found in default namespace.

# 创建自主式 Pod
[root@K8s ~]# kubectl run onepiece --image www.onepiece.com/onepiece/nginx
pod/onepiece created

# 查看 Pod 状态
[root@K8s ~]# kubectl get pods -o wide
NAME       READY   STATUS    RESTARTS   AGE   IP           NODE   NOMINATED NODE   READINESS GATES
onepiece   1/1     Running   0          10s   10.244.2.7   k8s2   <none>           <none>

2 利用控制器管理Pod

高可用性与稳定性

  • 自动故障恢复
    Kubernetes 控制器会持续监控 Pod 的运行状态。当 Pod 因故障退出、被删除或异常终止时,控制器会根据预设的副本数量自动创建新的 Pod,使应用实例数量保持稳定,降低单个 Pod 故障对业务造成的影响。
  • 健康状态检测与自动修复
    通过配置存活探针(Liveness Probe)和就绪探针(Readiness Probe),Kubernetes 可以判断应用是否正常运行。当检测到 Pod 状态异常时,会自动执行重启、替换等操作,提高应用的可靠性。

弹性扩展能力

  • 快速调整应用规模
    Kubernetes 支持根据业务需求灵活增加或减少 Pod 副本数量。在访问量增加时,可以快速扩容以提升处理能力;在业务压力降低时,可以缩减实例数量,减少资源浪费。
  • 自动水平扩缩容(HPA)
    Kubernetes 可以根据 CPU 使用率、内存占用率或业务自定义指标,自动调整 Pod 数量,使应用能够根据实际负载动态分配资源,提高资源利用率并降低运行成本。

应用升级与版本控制

  • 平滑滚动升级
    使用 Deployment 等控制器管理应用时,可以采用滚动更新方式逐步替换旧版本 Pod。在升级过程中,新旧版本可以平稳过渡,避免因整体停机导致服务中断,同时可以控制升级速度和替换策略。
  • 快速版本回退
    如果新版本部署后出现异常,可以方便地恢复到之前的稳定版本,降低升级失败带来的业务风险。

声明式管理方式

  • 配置简单易维护
    Kubernetes 使用 YAML 文件描述应用所需状态,例如镜像版本、副本数量、资源限制等。配置文件结构清晰,便于保存、修改和通过版本管理工具进行团队协作。
  • 自动保持目标状态
    用户只需要定义应用最终希望达到的状态,Kubernetes 控制器会自动检测当前状态,并进行调整,使实际运行状态始终接近期望状态,无需人工逐个管理 Pod。

服务发现与流量管理

  • 自动服务关联
    Kubernetes Service 可以自动关联控制器创建的 Pod,为应用提供稳定的访问入口。当 Pod 数量发生变化时,Service 会自动更新后端实例列表。
  • 实现负载均衡
    Kubernetes 可以将用户请求自动分发到多个 Pod 实例,提高应用处理能力和服务可用性,避免单个实例压力过大。
bash 复制代码
# 创建 Deployment
[root@K8s ~]# kubectl create deployment onepiece --image www.onepiece.com/onepiece/nginx
deployment.apps/onepiece created
[root@K8s ~]# kubectl get pods -o wide
NAME                        READY   STATUS    RESTARTS   AGE   IP           NODE   NOMINATED NODE   READINESS GATES
onepiece-65d6f64bbc-tn4wp   1/1     Running   0          4s    10.244.2.8   k8s2   <none>           <none>

# 扩容 Pod 副本数量
[root@K8s ~]# kubectl scale deployment onepiece --replicas 8
deployment.apps/onepiece scaled
[root@K8s ~]# kubectl get pods -o wide
NAME                        READY   STATUS    RESTARTS   AGE   IP            NODE   NOMINATED NODE   READINESS GATES
onepiece-65d6f64bbc-9t2jj   1/1     Running   0          4s    10.244.2.9    k8s2   <none>           <none>
onepiece-65d6f64bbc-c4p5q   1/1     Running   0          4s    10.244.2.10   k8s2   <none>           <none>
onepiece-65d6f64bbc-h4zzp   1/1     Running   0          4s    10.244.1.6    k8s1   <none>           <none>
onepiece-65d6f64bbc-r5nxz   1/1     Running   0          4s    10.244.1.4    k8s1   <none>           <none>
onepiece-65d6f64bbc-tj6vv   1/1     Running   0          4s    10.244.1.7    k8s1   <none>           <none>
onepiece-65d6f64bbc-tn4wp   1/1     Running   0          29s   10.244.2.8    k8s2   <none>           <none>
onepiece-65d6f64bbc-vj75p   1/1     Running   0          4s    10.244.1.5    k8s1   <none>           <none>
onepiece-65d6f64bbc-zfl22   1/1     Running   0          4s    10.244.2.11   k8s2   <none>           <none>

# 缩容 Pod
[root@K8s ~]# kubectl scale deployment onepiece --replicas 2
deployment.apps/onepiece scaled
[root@K8s ~]# kubectl get pods -o wide
NAME                        READY   STATUS    RESTARTS   AGE   IP           NODE   NOMINATED NODE   READINESS GATES
onepiece-65d6f64bbc-tn4wp   1/1     Running   0          37s   10.244.2.8   k8s2   <none>           <none>
onepiece-65d6f64bbc-vj75p   1/1     Running   0          12s   10.244.1.5   k8s1   <none>           <none>

3 应用版本的更新

bash 复制代码
# 创建 Deployment
[root@K8s ~]# kubectl create deployment onepiece --image www.onepiece.com/onepiece/myapp:v1 --replicas 2
deployment.apps/onepiece created

# 创建 Service 暴露服务
[root@K8s ~]# kubectl expose deployment onepiece --port 80 --target-port 80
service/onepiece exposed
[root@K8s ~]# kubectl get services
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP   2d5h
myapp        ClusterIP   10.98.114.85    <none>        80/TCP    5h38m
onepiece     ClusterIP   10.103.171.50   <none>        80/TCP    6s

# 测试访问 v1 版本
[root@K8s ~]# curl 10.103.171.50
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

# 查看 Deployment 历史版本
[root@K8s ~]# kubectl rollout history deployment onepiece
deployment.apps/onepiece
REVISION  CHANGE-CAUSE
1         <none>

# 更新应用版本
[root@K8s ~]# kubectl set image deployments/onepiece myapp=www.onepiece.com/onepiece/myapp:v2
deployment.apps/onepiece image updated

# 查看更新历史
[root@K8s ~]# kubectl rollout history deployment onepiece
deployment.apps/onepiece
REVISION  CHANGE-CAUSE
1         <none>
2         <none>

# 验证升级结果
[root@K8s ~]# curl 10.103.171.50
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>

# 回滚到旧版本
[root@K8s ~]# kubectl rollout undo deployment onepiece --to-revision 1
deployment.apps/onepiece rolled back

# 验证回滚结果
[root@K8s ~]# curl 10.103.171.50
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

4 利用yaml文件部署应用

4.1 yaml文件部署应用

明式配置

明确描述应用目标状态

  • Kubernetes 通过声明式配置文件定义应用所需达到的状态,例如 Pod 副本数量、容器镜像、资源限制以及网络相关配置等。用户只需要描述"希望系统最终是什么样",Kubernetes 会自动调整实际运行状态,使其与目标状态保持一致。这种方式让配置更加直观,便于查看、管理和维护。

支持版本管理和重复部署

  • YAML 配置文件可以结合 Git 等版本控制工具进行管理,方便记录配置变更历史。当需要恢复之前的部署状态时,可以快速回退到指定版本。同时,同一份配置文件可以在开发、测试、生产等不同环境中重复使用,提高部署的一致性。

方便团队协同管理

  • 配置文件以文本形式保存,便于团队成员共享、审核和修改。通过代码审查流程,可以提前发现配置问题,减少人为操作错误,提高应用部署的稳定性和可靠性。

灵活性与扩展能力

支持多种资源配置

  • Kubernetes YAML 文件可以用于定义多种资源对象,例如 Deployment、Service、ConfigMap、Secret 等。用户可以根据应用特点灵活设置运行参数,实现对应用环境、网络、存储和安全配置的精细化控制。

支持复杂应用架构组合

  • 多个 Kubernetes 资源可以通过多个 YAML 文件或统一配置文件进行组合管理,从而构建完整的应用部署方案。当业务需求发生变化时,可以方便地增加新的资源对象或调整已有配置,提升系统扩展能力。

与自动化工具结合

支持 CI/CD 自动化部署

  • YAML 配置文件可以与持续集成和持续交付(CI/CD)平台结合,实现应用发布流程自动化。例如,在代码提交、测试完成后,系统可以自动读取配置文件并完成应用部署,提高发布效率并减少人工操作。

便捷的命令行管理

  • Kubernetes 提供的 kubectl 工具能够直接操作 YAML 配置文件,可以快速完成资源的创建、更新、查看和删除。同时,还可以结合其他校验工具对配置内容进行检查,提前发现错误,提高部署安全性。

4.2 资源清单参数

参数名称 类型 参数说明
version String 这里是指的是K8S API的版本,目前基本上是v1,可以用kubectl api-versions命令查询
kind String 这里指的是yaml文件定义的资源类型和角色,比如:Pod
metadata Object 元数据对象,固定值就写metadata
metadata.name String 元数据对象的名字,这里由我们编写,比如命名Pod的名字
metadata.namespace String 元数据对象的命名空间,由我们自身定义
Spec Object 详细定义对象,固定值就写Spec
spec.containers\[\] list 这里是Spec对象的容器列表定义,是个列表
spec.containers\[\].name String 这里定义容器的名字
spec.containers\[\].image string 这里定义要用到的镜像名称
spec.containers\[\].imagePullPolicy String 定义镜像拉取策略,有三个值可选: (1) Always: 每次都尝试重新拉取镜像 (2) IfNotPresent:如果本地有镜像就使用本地镜像 (3) )Never:表示仅使用本地镜像
spec.containers\[\].command\[\] list 指定容器运行时启动的命令,若未指定则运行容器打包时指定的命令
spec.containers\[\].args\[\] list 指定容器运行参数,可以指定多个
spec.containers\[\].workingDir String 指定容器工作目录
spec.containers\[\].volumeMounts\[\] list 指定容器内部的存储卷配置
spec.containers\[\].volumeMounts\[\].name String 指定可以被容器挂载的存储卷的名称
spec.containers\[\].volumeMounts\[\].mountPath String 指定可以被容器挂载的存储卷的路径
spec.containers\[\].volumeMounts\[\].readOnly String 设置存储卷路径的读写模式,ture或false,默认为读写模式
spec.containers\[\].ports\[\] list 指定容器需要用到的端口列表
spec.containers\[\].ports\[\].name String 指定端口名称
spec.containers\[\].ports\[\].containerPort String 指定容器需要监听的端口号
spec.containers\[\] ports\[\].hostPort String 指定容器所在主机需要监听的端口号,默认跟上面containerPort相同,注意设置了hostPort同一台主机无法启动该容器的相同副本(因为主机的端口号不能相同,这样会冲突)
spec.containers\[\].ports\[\].protocol String 指定端口协议,支持TCP和UDP,默认值为 TCP
spec.containers\[\].env\[\] list 指定容器运行前需设置的环境变量列表
spec.containers\[\].env\[\].name String 指定环境变量名称
spec.containers\[\].env\[\].value String 指定环境变量值
spec.containers\[\].resources Object 指定资源限制和资源请求的值(这里开始就是设置容器的资源上限)
spec.containers\[\].resources.limits Object 指定设置容器运行时资源的运行上限
spec.containers\[\].resources.limits.cpu String 指定CPU的限制,单位为核心数,1=1000m
spec.containers\[\].resources.limits.memory String 指定MEM内存的限制,单位为MIB、GiB
spec.containers\[\].resources.requests Object 指定容器启动和调度时的限制设置
spec.containers\[\].resources.requests.cpu String CPU请求,单位为core数,容器启动时初始化可用数量
spec.containers\[\].resources.requests.memory String 内存请求,单位为MIB、GIB,容器启动的初始化可用数量
spec.restartPolicy string 定义Pod的重启策略,默认值为Always. (1)Always: Pod-旦终止运行,无论容器是如何 终止的,kubelet服务都将重启它 (2)OnFailure: 只有Pod以非零退出码终止时,kubelet才会重启该容器。如果容器正常结束(退出码为0),则kubelet将不会重启它 (3) Never: Pod终止后,kubelet将退出码报告给Master,不会重启该
spec.nodeSelector Object 定义Node的Label过滤标签,以key:value格式指定
spec.imagePullSecrets Object 定义pull镜像时使用secret名称,以name:secretkey格式指定
spec.hostNetwork Boolean 定义是否使用主机网络模式,默认值为false。设置true表示使用宿主机网络,不使用docker网桥,同时设置了true将无法在同一台宿主机 上启动第二个副本

4.3 获得资源帮助

bash 复制代码
[root@K8s ~]# kubectl explain pod.spec.containers

4.4 示例

4.4.1 运行简单的单个容器pod
bash 复制代码
# 用命令获取yaml模板
[root@K8s ~]# kubectl run onepiece --image www.onepiece.com/onepiece/myapp:v1 --dry-run=client -o yaml > pod.yml

[root@K8s ~]# vim pod.yml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: onepiece
  name: onepiece
spec:
  containers:
  - image: www.onepiece.com/onepiece/myapp:v1
    name: onepiece
    
[root@K8s ~]# kubectl apply -f pod.yml
pod/onepiece created

[root@K8s ~]# kubectl get pods -o wide
NAME       READY   STATUS    RESTARTS   AGE   IP           NODE   NOMINATED NODE   READINESS GATES
onepiece   1/1     Running   0          42s   10.244.1.3   k8s1   <none>           <none>
4.4.2 运行多个容器pod
bash 复制代码
[root@K8s ~]# vim pod.yml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: onepiece
  name: onepiece
spec:
  containers:
  - image: www.onepiece.com/onepiece/nginx
    name: onepiece1
  - image: www.onepiece.com/onepiece/nginx
    name: onepiece2
[root@K8s ~]# kubectl apply -f pod.yml
pod/onepiece created
[root@K8s ~]# kubectl get pods
NAME       READY   STATUS   RESTARTS      AGE
onepiece   1/2     Error    1 (11s ago)   14s

# 查看日志
[root@K8s ~]# kubectl logs onepiece onepiece2
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2026/08/25 04:31:37 [emerg] 1#1: bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
2026/08/25 04:31:37 [emerg] 1#1: bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
2026/08/25 04:31:37 [notice] 1#1: try again to bind() after 500ms
2026/08/25 04:31:37 [emerg] 1#1: bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
2026/08/25 04:31:37 [emerg] 1#1: bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
2026/08/25 04:31:37 [notice] 1#1: try again to bind() after 500ms
2026/08/25 04:31:37 [emerg] 1#1: bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
2026/08/25 04:31:37 [emerg] 1#1: bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)

!WARNING

在一个pod中开启多个容器时一定要确保容器彼此不能互相干扰

bash 复制代码
[root@K8s ~]# vim pod.yml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: onepiece
  name: onepiece
spec:
  containers:
  - image: www.onepiece.com/onepiece/nginx
    name: nginx
  - image: www.onepiece.com/onepiece/busybox
    name: busybox
    command: ["/bin/sh","-c","sleep 1000000"]
[root@K8s ~]# kubectl apply -f pod.yml
pod/onepiece created
[root@K8s ~]# kubectl get pods
NAME       READY   STATUS    RESTARTS   AGE
onepiece   2/2     Running   0          8s
4.4.3 理解pod间的网络整合
bash 复制代码
# 同在一个pod中的容器公用一个网络
[root@K8s ~]# vim pod.yml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: onepiece
  name: onepiece
spec:
  containers:
    - image: www.onepiece.com/onepiece/myapp:v1
    name: myapp
  - image: www.onepiece.com/onepiece/busyboxplus
    name: busybox
    command: ["/bin/sh","-c","sleep 1000000"]
[root@K8s ~]# kubectl apply -f pod.yml
pod/onepiece created
[root@K8s ~]# kubectl get pods
NAME       READY   STATUS    RESTARTS   AGE
onepiece   2/2     Running   0          3s
[root@K8s ~]# kubectl exec onepiece -c busybox -- curl -s localhost
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
4.4.4 端口映射
bash 复制代码
[root@K8s ~]# vim pod.yml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: onepiece
  name: onepiece
spec:
  containers:
    - image: www.onepiece.com/onepiece/myapp:v1
      name: myapp
      ports:
      - name: http
        containerPort: 80
        hostPort: 80
        protocol: TCP
[root@K8s ~]# kubectl apply -f pod.yml
pod/onepiece created
[root@K8s ~]# kubectl get pods -o wide
NAME       READY   STATUS    RESTARTS   AGE   IP            NODE   NOMINATED NODE   READINESS GATES
onepiece   1/1     Running   0          4s    10.244.1.13   k8s1   <none>           <none>
[root@K8s ~]# curl k8s1
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
4.4.5 如何设定环境变量
bash 复制代码
[root@K8s ~]# vim pod.yml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: onepiece
  name: onepiece
spec:
  containers:
    - image: www.onepiece.com/onepiece/busyboxplus
      name: busybox
      command: ["/bin/sh","-c","echo $NAME;sleep 3000000"]
      env:
      - name: NAME
        value: onepiece
[root@K8s ~]# kubectl apply -f pod.yml
pod/onepiece created
[root@K8s ~]# kubectl logs pods/onepiece busybox
onepiece
4.4.6 资源限制
bash 复制代码
[root@K8s ~]# vim pod.yml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: onepiece
  name: onepiece
spec:
  containers:
    - image: www.onepiece.com/onepiece/myapp:v1
      name: myapp
      resources:
        limits:
          cpu: 500m
          memory: 100M
        requests:
          cpu: 500m
          memory: 100M
[root@K8s ~]# kubectl apply -f  pod.yml
pod/onepiece created
[root@K8s ~]# kubectl describe pods onepiece
   Ready:          True
    Restart Count:  0
    Limits:
      cpu:     500m
      memory:  100M
    Requests:
      cpu:        500m
      memory:     100M
    Environment:  <none>
    Mounts:
4.4.7 选择运行节点
bash 复制代码
[root@K8s ~]# vim pod.yml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: onepiece
  name: onepiece
spec:
  nodeSelector:
    kubernetes.io/hostname: k8s1
  restartPolicy: Always
  containers:
    - image: www.onepiece.com/onepiece/myapp:v1
      name: myapp
[root@K8s ~]# kubectl apply -f  pod.yml
pod/onepiece created
[root@K8s ~]# kubectl get pods -o wide
NAME       READY   STATUS    RESTARTS   AGE   IP            NODE   NOMINATED NODE   READINESS GATES
onepiece   1/1     Running   0          9s    10.244.1.17   k8s1   <none>           <none>
4.4.8 共享宿主机网络
bash 复制代码
[root@K8s ~]# vim pod.yml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: onepiece
  name: onepiece
spec:
  hostNetwork: true
  containers:
    - image: www.onepiece.com/onepiece/busybox
      name: busybox
      command: ["/bin/sh","-c","sleep 100000"]
[root@K8s ~]# kubectl apply -f pod.yml
pod/onepiece created
[root@K8s ~]# kubectl exec -it pods/onepiece -c busybox -- /bin/sh
/ # ifconfig
cni0      Link encap:Ethernet  HWaddr 16:78:25:61:5B:51
          inet addr:10.244.1.1  Bcast:10.244.1.255  Mask:255.255.255.0
          inet6 addr: fe80::1478:25ff:fe61:5b51/64 Scope:Link
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:198 errors:0 dropped:0 overruns:0 frame:0
          TX packets:88 errors:0 dropped:6 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:14480 (14.1 KiB)  TX bytes:7957 (7.7 KiB)

docker0   Link encap:Ethernet  HWaddr 2A:2C:3A:D0:28:F4
          inet addr:172.17.0.1  Bcast:172.17.255.255  Mask:255.255.0.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:2 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

eth0      Link encap:Ethernet  HWaddr 00:0C:29:76:BF:88
          inet addr:192.168.136.20  Bcast:192.168.136.255  Mask:255.255.255.0
          inet6 addr: fe80::acca:ec80:1736:ec66/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:17251 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6688 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:18167442 (17.3 MiB)  TX bytes:1216651 (1.1 MiB)

flannel.1 Link encap:Ethernet  HWaddr 6E:B9:F5:32:02:CA
          inet addr:10.244.1.0  Bcast:0.0.0.0  Mask:255.255.255.255
          inet6 addr: fe80::6cb9:f5ff:fe32:2ca/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1450  Metric:1
          RX packets:12 errors:0 dropped:0 overruns:0 frame:0
          TX packets:10 errors:0 dropped:15 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:747 (747.0 B)  TX bytes:961 (961.0 B)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:321 errors:0 dropped:0 overruns:0 frame:0
          TX packets:321 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:26338 (25.7 KiB)  TX bytes:26338 (25.7 KiB)

二 pod的生命周期

2.1 INIT 容器

官方文档:https://kubernetes.io/zh/docs/concepts/workloads/pods/

  • Init 容器与普通的容器非常像,除了如下两点:

    • 它们总是运行到完成

    • init 容器不支持 Readiness,因为它们必须在 Pod 就绪之前运行完成,每个 Init 容器必须运行成功,下一个才能够运行。

  • 如果Pod的 Init 容器失败,Kubernetes 会不断地重启该 Pod,直到 Init 容器成功为止。但是,如果 Pod 对应的 restartPolicy 值为 Never,它不会重新启动。

2.1.1 INIT 容器的功能

  • Init 容器可以包含一些安装过程中应用容器中不存在的实用工具或个性化代码。
  • Init 容器可以安全地运行这些工具,避免这些工具导致应用镜像的安全性降低。
  • 应用镜像的创建者和部署者可以各自独立工作,而没有必要联合构建一个单独的应用镜像。
  • Init 容器能以不同于Pod内应用容器的文件系统视图运行。因此,Init容器可具有访问 Secrets 的权限,而应用容器不能够访问。
  • 由于 Init 容器必须在应用容器启动之前运行完成,因此 Init 容器提供了一种机制来阻塞或延迟应用容器的启动,直到满足了一组先决条件。一旦前置条件满足,Pod内的所有的应用容器会并行启动。

2.2.2 INIT 容器示例

bash 复制代码
[root@K8s ~]# vim pod.yml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: onepiece
  name: onepiece
spec:
  containers:
    - image: www.onepiece.com/onepiece/myapp:v1
      name: myapp
  initContainers:
    - name: init
      image: www.onepiece.com/onepiece/busybox
      command: ["sh","-c","until test -e /testfile;do echo wating for myservice; sleep 2;done"]
[root@K8s ~]# kubectl apply -f pod.yml
pod/onepiece created
[root@K8s ~]# kubectl get pods
NAME       READY   STATUS     RESTARTS   AGE
onepiece   0/1     Init:0/1   0          11s
[root@K8s ~]# kubectl logs pods/onepiece init
wating for myservice
wating for myservice
wating for myservice
wating for myservice
wating for myservice
wating for myservice
wating for myservice
wating for myservice
wating for myservice
wating for myservice
[root@K8s ~]# kubectl exec pods/onepiece -c init -- /bin/sh -c "touch /testfile"
[root@K8s ~]# kubectl get pods
NAME       READY   STATUS    RESTARTS   AGE
onepiece   1/1     Running   0          50s

2.2 探针

探针是由 kubelet 对容器执行的定期诊断:

  • ExecAction:在容器内执行指定命令。如果命令退出时返回码为 0 则认为诊断成功。
  • TCPSocketAction:对指定端口上的容器的 IP 地址进行 TCP 检查。如果端口打开,则诊断被认为是成功的。
  • HTTPGetAction:对指定的端口和路径上的容器的 IP 地址执行 HTTP Get 请求。如果响应的状态码大于等于200 且小于 400,则诊断被认为是成功的。

每次探测都将获得以下三种结果之一:

  • 成功:容器通过了诊断。
  • 失败:容器未通过诊断。
  • 未知:诊断失败,因此不会采取任何行动。

Kubelet 可以选择是否执行在容器上运行的三种探针执行和做出反应:

  • livenessProbe:指示容器是否正在运行。如果存活探测失败,则 kubelet 会杀死容器,并且容器将受到其重启策略的影响。如果容器不提供存活探针,则默认状态为 Success。
  • readinessProbe:指示容器是否准备好服务请求。如果就绪探测失败,端点控制器将从与 Pod 匹配的所有 Service 的端点中删除该 Pod 的 IP 地址。初始延迟之前的就绪状态默认为 Failure。如果容器不提供就绪探针,则默认状态为 Success。
  • startupProbe: 指示容器中的应用是否已经启动。如果提供了启动探测(startup probe),则禁用所有其他探测,直到它成功为止。如果启动探测失败,kubelet 将杀死容器,容器服从其重启策略进行重启。如果容器没有提供启动探测,则默认状态为成功Success。

ReadinessProbe 与 LivenessProbe 的区别

  • ReadinessProbe 当检测失败后,将 Pod 的 IP:Port 从对应的 EndPoint 列表中删除。
  • LivenessProbe 当检测失败后,将杀死容器并根据 Pod 的重启策略来决定作出对应的措施

StartupProbe 与 ReadinessProbe、LivenessProbe 的区别

  • 如果三个探针同时存在,先执行 StartupProbe 探针,其他两个探针将会被暂时禁用,直到 pod 满足 StartupProbe 探针配置的条件,其他 2 个探针启动,如果不满足按照规则重启容器。
  • 另外两种探针在容器启动后,会按照配置,直到容器消亡才停止探测,而 StartupProbe 探针只是在容器启动后按照配置满足一次后,不在进行后续的探测。

2.2.1 存活探针示例:

bash 复制代码
[root@K8s ~]# vim pod.yml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: onepiece
  name: onepiece
spec:
  containers:
    - image: www.onepiece.com/onepiece/myapp:v1
      name: myapp
      livenessProbe:
        tcpSocket:
          port: 8080
        initialDelaySeconds: 3
        periodSeconds: 1
        timeoutSeconds: 1
[root@K8s ~]# kubectl apply -f pod.yml
pod/onepiece created
[root@K8s ~]# kubectl get pods
NAME       READY   STATUS             RESTARTS     AGE
onepiece   0/1     CrashLoopBackOff   3 (2s ago)   39s
[root@K8s ~]# kubectl describe pods
Name:             onepiece
Namespace:        default
Priority:         0
Service Account:  default
Node:             k8s1/192.168.136.20
Start Time:       Tue, 25 Aug 2026 13:23:47 +0800
Labels:           run=onepiece
Annotations:      <none>
Status:           Running
IP:               10.244.1.19
IPs:
  IP:  10.244.1.19
Containers:
  myapp:
    Container ID:   docker://a163075236a9c5531a4cbc050be4910a8a9bf4132eb1b2cbf914ce4a58dd410e
    Image:          www.onepiece.com/onepiece/myapp:v1
    Image ID:       docker-pullable://www.onepiece.com/library/myapp@sha256:238a348a45b26007ee5ecead440a7bb9cb31446081a823172797ba3c8c7acfb4
    Port:           <none>
    Host Port:      <none>
    State:          Waiting
      Reason:       CrashLoopBackOff
    Last State:     Terminated
      Reason:       Completed
      Exit Code:    0
      Started:      Tue, 25 Aug 2026 13:24:18 +0800
      Finished:     Tue, 25 Aug 2026 13:24:24 +0800
    Ready:          False
    Restart Count:  3
    Liveness:       tcp-socket :8080 delay=3s timeout=1s period=1s #success=1 #failure=3
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-52qgn (ro)
Conditions:
  Type                        Status
  PodReadyToStartContainers   True
  Initialized                 True
  Ready                       False
  ContainersReady             False
  PodScheduled                True
Volumes:
  kube-api-access-52qgn:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    Optional:                false
    DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type     Reason     Age                 From               Message
  ----     ------     ----                ----               -------
  Normal   Scheduled  45s                 default-scheduler  Successfully assigned default/onepiece to k8s1
  Normal   Pulled     15s (x4 over 45s)   kubelet            spec.containers{myapp}: Container image "www.onepiece.com/onepiece/myapp:v1" already present on machine and can be accessed by the pod
  Normal   Created    15s (x4 over 45s)   kubelet            spec.containers{myapp}: Container created
  Normal   Started    14s (x4 over 45s)   kubelet            spec.containers{myapp}: Container started
  Warning  Unhealthy  10s (x12 over 42s)  kubelet            spec.containers{myapp}: Liveness probe failed: dial tcp 10.244.1.19:8080: connect: connection refused
  Normal   Killing    10s (x4 over 40s)   kubelet            spec.containers{myapp}: Container myapp failed liveness probe, will be restarted
  Warning  BackOff    9s (x4 over 27s)    kubelet            spec.containers{myapp}: Back-off restarting failed container myapp in pod onepiece_default(dfdebcfe-bf97-4afb-bdc4-1f2e1873bd7f)

2.2.2 就绪探针示例:

bash 复制代码
[root@K8s ~]# vim pod.yml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: onepiece
  name: onepiece
spec:
  containers:
    - image: www.onepiece.com/onepiece/myapp:v1
      name: myapp
      readinessProbe:
        httpGet:
          path: /test.html
          port: 80
        initialDelaySeconds: 1
        periodSeconds: 3
        timeoutSeconds: 1
[root@K8s ~]# kubectl apply -f pod.yml
pod/onepiece created
[root@K8s ~]# kubectl get pods
NAME       READY   STATUS    RESTARTS   AGE
onepiece   0/1     Running   0          14s
[root@K8s ~]# kubectl describe pods onepiece
Name:             onepiece
Namespace:        default
Priority:         0
Service Account:  default
Node:             k8s2/192.168.136.30
Start Time:       Tue, 25 Aug 2026 13:27:02 +0800
Labels:           run=onepiece
Annotations:      <none>
Status:           Running
IP:               10.244.2.4
IPs:
  IP:  10.244.2.4
Containers:
  myapp:
    Container ID:   docker://fda14d7c110611f32388d25ae0559f40d91f17598084778dcf950b3e0652cf87
    Image:          www.onepiece.com/onepiece/myapp:v1
    Image ID:       docker-pullable://www.onepiece.com/library/myapp@sha256:238a348a45b26007ee5ecead440a7bb9cb31446081a823172797ba3c8c7acfb4
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Tue, 25 Aug 2026 13:27:02 +0800
    Ready:          False
    Restart Count:  0
    Readiness:      http-get http://:80/test.html delay=1s timeout=1s period=3s #success=1 #failure=3
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-s7jgt (ro)
Conditions:
  Type                        Status
  PodReadyToStartContainers   True
  Initialized                 True
  Ready                       False
  ContainersReady             False
  PodScheduled                True
Volumes:
  kube-api-access-s7jgt:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    Optional:                false
    DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type     Reason     Age                From               Message
  ----     ------     ----               ----               -------
  Normal   Scheduled  27s                default-scheduler  Successfully assigned default/onepiece to k8s2
  Normal   Pulled     28s                kubelet            spec.containers{myapp}: Container image "www.onepiece.com/onepiece/myapp:v1" already present on machine and can be accessed by the pod
  Normal   Created    28s                kubelet            spec.containers{myapp}: Container created
  Normal   Started    27s                kubelet            spec.containers{myapp}: Container started
  Warning  Unhealthy  2s (x10 over 27s)  kubelet            spec.containers{myapp}: Readiness probe failed: HTTP probe failed with statuscode: 404
[root@K8s ~]# kubectl exec pods/onepiece -c myapp -- /bin/sh -c "echo test > /usr/share/nginx/html/test.html"
[root@K8s ~]# kubectl describe pods onepiece
Name:             onepiece
Namespace:        default
Priority:         0
Service Account:  default
Node:             k8s2/192.168.136.30
Start Time:       Tue, 25 Aug 2026 13:27:02 +0800
Labels:           run=onepiece
Annotations:      <none>
Status:           Running
IP:               10.244.2.4
IPs:
  IP:  10.244.2.4
Containers:
  myapp:
    Container ID:   docker://fda14d7c110611f32388d25ae0559f40d91f17598084778dcf950b3e0652cf87
    Image:          www.onepiece.com/onepiece/myapp:v1
    Image ID:       docker-pullable://www.onepiece.com/library/myapp@sha256:238a348a45b26007ee5ecead440a7bb9cb31446081a823172797ba3c8c7acfb4
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Tue, 25 Aug 2026 13:27:02 +0800
    Ready:          False
    Restart Count:  0
    Readiness:      http-get http://:80/test.html delay=1s timeout=1s period=3s #success=1 #failure=3
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-s7jgt (ro)
Conditions:
  Type                        Status
  PodReadyToStartContainers   True
  Initialized                 True
  Ready                       False
  ContainersReady             False
  PodScheduled                True
Volumes:
  kube-api-access-s7jgt:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    Optional:                false
    DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type     Reason     Age                From               Message
  ----     ------     ----               ----               -------
  Normal   Scheduled  49s                default-scheduler  Successfully assigned default/onepiece to k8s2
  Normal   Pulled     50s                kubelet            spec.containers{myapp}: Container image "www.onepiece.com/onepiece/myapp:v1" already present on machine and can be accessed by the pod
  Normal   Created    50s                kubelet            spec.containers{myapp}: Container created
  Normal   Started    49s                kubelet            spec.containers{myapp}: Container started
  Warning  Unhealthy  3s (x17 over 49s)  kubelet            spec.containers{myapp}: Readiness probe failed: HTTP probe failed with statuscode: 404
[root@K8s ~]# kubectl get pods
NAME       READY   STATUS    RESTARTS   AGE
onepiece   1/1     Running   0          52s
相关推荐
孙克旭_1 小时前
K8s 1.30 实战:Containerd 镜像仓库配置与 nerdctl 管理命令
云原生·容器·kubernetes·containerd
2601_966871401 小时前
全新 云原生系统精讲与全流程落地实践,云原生 DevOpS 进阶实战营
运维·云原生·devops
小谈不敲代码2 小时前
【10-kubernetes的控制器】
kubernetes·运维开发
Henry-SAP2 小时前
小米自研AI芯片亮相
人工智能·云原生·sap·erp
分布式存储与RustFS2 小时前
把 12TB 生产数据从 MinIO 迁到 RustFS:一次真实迁移的实测
云原生·开源·对象存储·分布式存储·s3·rustfs·性能基准
无望__wsk3 小时前
k8s控制器
java·docker·kubernetes
2301_810730103 小时前
K8s的Pod管理
linux·容器·kubernetes
CJY6213 小时前
k8s控制器管理
云原生·容器·kubernetes
无念是……3 小时前
K8s 控制器管理详解|RC、RS、Deployment、StatefulSet、DaemonSet、Job&CronJob
云原生·容器·kubernetes·控制器