K8s: 关于Kubernetes中的Pod的生命周期(状态)以及生命周期的钩子函数处理

pod 的生命周期

1 ) pod 几种常用状态

  • 1.1 )Pending(挂起)
    • Pod 已被 Kubernetes 系统接受,但有一个或者多个容器尚未创建亦未运行
    • 此阶段包括等待 Pod 被调度的时间和通过网络下载镜像的时间。
  • 1.2 )Running(运行中)
    • Pod 已经绑定到了某个节点,Pod 中所有的容器都已被创建
    • 至少有一个容器仍在运行,或者正处于启动或重启状态
  • 1.3 )Succeeded(成功)
    • Pod 中的所有容器都已成功终止,并且不会再重启
  • 1.4 )Failed(失败)
    • Pod 中的所有容器都已终止,并且至少有一个容器是因为失败终止
    • 也就是说,容器以非 0 状态退出或者被系统终止。
  • 1.5 )Unknown(未知)
    • 因为某些原因无法取得 Pod 的状态
    • 这种情况通常是因为与 Pod 所在主机通信失败

2 )pod内部的容器相应的状态

  • 一旦调度器将 Pod 分派给某个节点,kubelet 就通过容器运行时开始为 Pod 创建容器
  • 容器的状态有三种:Waiting(等待)、Running(运行中)和 Terminated(已终止)
  • $ kubectl describe pod <pod 名称>
  • 2.1 ) Creating (创建中):
    • 容器镜像正在被拉取,并且容器正在被创建
    • 这是Pod状态从Pending过渡到Running之前的一个暂态
  • 2.2 ) Running(运行中)
    • Running 状态表明容器正在执行状态并且没有问题发生
    • 如果配置了 postStart 回调,那么该回调已经执行完成
    • 如果你使用 kubectl 来查询包含 Running 状态的容器的 Pod 时
    • 你也会看到 关于容器进入 Running 状态的信息
  • 2.3 ) Terminating (终止中)
    • 容器正在被终止,这通常发生在Pod被删除或缩容时
  • 2.4 ) Terminated(已终止)
    • 处于 Terminated 状态的容器已经开始执行并且或者正常结束或者因为某些原因失败
    • 如果你使用kubectl 来查询包含 Terminated 状态的容器的 Pod 时
    • 你会看到 容器进入此状态的原因、退出代码以及容器执行期间的起止时间
  • 2.5 ) Waiting (等待)
    • 如果容器并不处在 Running 或 Terminated 状态之一,它就处在 Waiting 状态
    • 处于 Waiting 状态的容器仍在运行它完成启动所需要的操作
    • 例如,从某个容器镜像 仓库拉取容器镜像,或者向容器应用 Secret 数据等等
    • 当你使用 kubectl 来查询包含 Waiting 状态的容器的 Pod 时,你也会看到一个 Reason 字段,其中给出了容器处于等待状态的原因
  • 2.6 ) Exited(已退出)
    • 容器中的进程已经正常或异常终止,并且不再运行。这可能是由于程序执行完毕或遇到错误而退出
  • 2.7 ) Restarting (重启中)
    • 容器正在尝试重新启动,这通常是因为容器之前异常退出
    • 并且根据Pod的配置进行了自动重启

Pod 生命周期的钩子函数

  • 在Pod配置文件中,定义 postStart 和 preStop 处理函数

  • 创建一个包含一个容器的 Pod,该容器为 postStart 和 preStop 事件提供对应的处理函数

  • 创建一个 pod, 新建一个 lifecycle-demo.yaml 文件

    yml 复制代码
    apiVersion: v1
    kind: Pod
    metadata:
     name: lifecycle-demo
     labels:
       name: lifecycle-demo
    spec:
     containers:
     - name: lifecycle-demo-container
       image: nginx
       lifecycle:
         postStart:
           exec:
             command: ["sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]
         preStop:
           exec:
             command: ["sh","-c","nginx -s quit; while killall -0 nginx; do sleep 1; done"]
       resources:
         limits:
           memory: "128Mi"
           cpu: "500m"
       ports:
        - containerPort: 80
  • $ kubectl create -f lifecycle-demo.yaml

    conf 复制代码
    pod/lifecycle-demo created
  • $ kubectl get po

    conf 复制代码
    NAME             READY   STATUS              RESTARTS   AGE
    lifecycle-demo   0/1     ContainerCreating   0          8
  • $ kubectl exec -it lifecycle-demo -- sh 进入pod

  • $ cat /usr/share/message 查看文件是否被写入内容

    conf 复制代码
    Hello from the postStart handler
  • 在上述配置文件中,可以看到 postStart 命令在容器的 /usr/share 目录下写入文件 message

  • 命令 preStop 负责优雅地终止 nginx 服务

  • 当因为失效而导致容器终止时,这一处理方式很有用

相关推荐
小扳6 小时前
微服务篇-深入了解 MinIO 文件服务器(你还在使用阿里云 0SS 对象存储图片服务?教你使用 MinIO 文件服务器:实现从部署到具体使用)
java·服务器·分布式·微服务·云原生·架构
aherhuo16 小时前
kubevirt网络
linux·云原生·容器·kubernetes
陌北v117 小时前
Docker Compose 配置指南
运维·docker·容器·docker-compose
catoop17 小时前
K8s 无头服务(Headless Service)
云原生·容器·kubernetes
阿里嘎多学长17 小时前
docker怎么部署高斯数据库
运维·数据库·docker·容器
小峰编程18 小时前
独一无二,万字详谈——Linux之文件管理
linux·运维·服务器·云原生·云计算·ai原生
小马爱打代码18 小时前
云原生服务网格Istio实战
云原生
liuxuzxx18 小时前
1.24.1-Istio安装
kubernetes·istio·service mesh
G_whang19 小时前
windos 安装docker
运维·docker·容器
道一云黑板报19 小时前
Flink集群批作业实践:七析BI批作业执行
大数据·分布式·数据分析·flink·kubernetes