# Pod的生命周期: ***************** ******************************** Pod的生命周期 ***************************** ***************************** #状态: 阶段 描述 Pending Pod 已被 Kubernetes 接受,但尚未创建一个或多个容器镜像。这包括被调度之前的时间以及通过网络下载镜像所花费的时间,执行需要一段时间。 Running Pod 已经被绑定到了一个节点,所有容器已被创建。至少一个容器正在运行,或者正在启动或重新启动。 Succeeded 所有容器成功终止,也不会重启。 Failed 所有容器终止,至少有一个容器以失败方式终止。也就是说,这个容器要么已非 0 状态退出,要么被系统终止。 Unknown 由于一些原因,Pod 的状态无法获取,通常是与 Pod 通信时出错导致的 二、pod的创建过程 pod是k8s的基础单元,以下为一个pod资源对象的典型创建过程: 1: 用户通过kubectl或其他api客户端提交pod spec给api server 2: api server尝试着将pod对象的相关信息存入etcd中,待写入操作执行完成,api server即会返回确认信息至客户端。 3: api server开始反映etcd中的状态变化 4: 所有的k8s组件均使用watch机制来跟踪检查api server上的相关变动 5: kube-scheduler通过其watch觉察到api server创建了新的pod对象但尚未绑定至任何工作节点 6: kube-scheduler为pod对象挑选一个工作节点并将结果信息更新至api server 7: 调度结果信息由api server更新至etcd,而且api server也开始反映此pod对象的调度结果 8: pod被调度到目标工作节点上的kubelet尝试在当前节点上调用docker启动容器,并将容器的结果状态回送至api server 9: api server将pod状态信息存入etcd中 10: 在etcd确认写入操作成功完成后,api server将确认信息发送至相关的kubelet,时间将通过它被接受。 pod创建过程: 运行初始化容器过程(init container) 运行主容器过程(main container) 容器启动钩子(post start) 如果你想让容器启动之后做一些事情,你可以传递一些参数或者命令给容器启动钩子这个节点 容器终止前钩子(pre stop) 如果你想在终止之前执行一些命令,你可以传递一些参数和一些命令给终止前这个节点 容器的存活性探测(liveness probe) 就绪性探测(readliness probe)(这两个作用就是子过程) pod终止过程: 在整个生命周期终,pod会出现5种状态(相位),分别如下: 挂起: apiserver已经创建了pod资源对象,但它尚未被调度完成或者仍处于下载镜像的过程中 运行中: pod已经被调度至某节点,并且所有容器都已经被kubectkl创建完成 成功: pod中所有的容器都已经成功终止并且不会被重启 失败: 所有容器都已经终止,但至少有一个容器终止失败,即容器返回了非0值的退出状态 未知: apiserver无法正常获取到pod对象的状态信息,通常由网络通信失败所导致。 https://www.cnblogs.com/caibao666/p/11181715.html Pod生命周期中的重要行为:(probe 探测/检测) 初始化容器 容器探测: liveness(lai ven ner si) probe(pu ro bu) # 存活状态检测----->探测容器是否处于存活状态 readiness(rai di ner si) probe # 就绪性状态探测---->探测容器中的服务或者程序是否正常,是否处于正常提供服务状态 https://kubernetes.io/zh/docs/concepts/workloads/pods/pod-lifecycle/ # 探针 容器存活并不一定能对外提供服务 kubectl explain pod.spec.containers livenessProbe # running # 存活状态检测 kubectl explain pod.spec.containers.livenessProbe # 判定主容器是否处于运行状态 readinessProbe # 就绪性状态探测 kubectl explain pod.spec.containers.readinessProbe # 判定容器中的主进程 是否已经准备就绪,并且可以对外提供服务 # 探测:readinessProbe 和 livenessProbe 探测方式和使用字段一样,背后以为的价值不一样 startupProbe # 1.17以后版本支持 判断容器内的应用程序是否已启动。如果提供了启动探测,则禁用所有其他探测,直到它成功为止。 如果启动探测失败,kubelet将杀死容器,容器将服从其重启策略。如果容器没有提供启动探测,则默认状态为成功 livenessProbe: httpGet: path:/test prot:80 failureThreshold:1 initialDelay:10 periodSeconds:10 startupProbe: httpGet: path:/test prot:80 failureThreshold:10 initialDelay:20 periodSeconds:10 # 健康探测 三种方式 exec # 探测方法 exec tcpSocket # 探测方法 tcp 唯一 httpGet # # 探测方法 httpget 唯一 initialDelaySeconds: 3 # 启动后延迟多少秒后开始探测/默认启动后就探测 failureThreshold: 3 # 探测几次 默认3 periodSeconds: 10 # 周期间隔时长 默认10秒探测一次 timeoutSeconds: 1 # 探测超时时间 默认 1秒 successThreshold: 1 # 在探测失败后,后面成功几次才算是正常,默认是1 # ———————————————————————————————————————————————————————————————————————— exec: # 方式一 command <[]string> # 举例 livenessProbe: exec: command: ["test","-e","/tmp/healthy"] # ———————————————————————————————————————————————————————————————————————— tcpSocket # 方式二 host: 链接使用的主机名,默认是pod的IP port: 8080 # 举例 livenessProbe: tcpSocket: port: 8080 # ———————————————————————————————————————————————————————————————————————— httpGet # 方式三 host: 链接使用的主机名,默认是pod的IP scheme: 链接方式,http\https path: 访问http的路径 httpHeaders: 请求证自定义的http头 port: 访问容器的端口号和端口名,必须在1-65535之间 # 举例 livenessProbe: httpGet: port: http path: /index.html # ———————————————————————————————————————————————————————————————————————— lifecycle # 生命周期 # kubectl explain pods.spec.containers.lifecycle postStart # 启动前 exec httpGet tcpSocket preStop # 停止前 exec httpGet tcpSocket # pod 终止 https://kubernetes.io/zh/docs/concepts/workloads/pods/pod/ termination Grace Period Seconds # 会有一个 终止宽限期 默认30秒 # 关于 lifecycle kubectl explain pods.spec.containers.lifecycle.postStart kubectl explain pods.spec.containers.lifecycle.preStop apiVersion: v1 kind: Pod metadata: name: lifecycle-poststart-pod namespace: default labels: app: myapp tier: frontend spec: containers: - name: busybox-http image: ikubernetes/myapp:v1 lifecycle: postStart: exec: #command: ["mkdir","-p","/data/web","/html/web"] command: - "mkdir" - "-p" - "/data/web/html" - "/data/wwwroot/html" #command: #- "/bin/sh" #- "-c" #- "sleep 3600" command: - "/bin/sh" args: - "-c" - "sleep 3600" grep -E '08:5[7-9]' catalina.out >mylog2.txt 三、pod生命周期中的重要行为 1、初始化容器 2、生命周期钩子函数 3、容器探测