赞
踩
相关字段:.status.phase
phase表示一个Pod处于其生命周期的哪个阶段,一共有以下5个可能的取值:
Pod phase的查看方式:
kubectl get pods pi2-ll9dn -o yaml |grep 'phase'
phase: Succeeded
注意,使用以下命令看到的STATUS并不是Pod的phase:
kubectl get pod pi2-ll9dn
NAME READY STATUS RESTARTS AGE
pi2-ll9dn 0/1 Completed 0 4h50m
Pod并没有Completed这个phase。
相关字段:.status.containerStatuses[index].state(containerStatuses是一个数组,每个数组元素对应Pod中的一个容器)
我们知道,一个Pod中是包含有多个容器的,所以Pod的状态或者说阶段并不能直接反映Pod中容器的状态。当一个Pod被调度到Node上时,kubelet就会开始使用容器运行时(如Docker)创建容器,容器的状态可以通过命令kubectl describe pod [POD_NAME]查看,一共以下3种状态:
postStarthook(钩子),则该hook会在容器进入Running状态前执行preStop钩子,在一个容器进入Terminated状态前,该钩子会被执行。执行完有两种情况,一种是正常退出,另外一种是因为某种原因失败退出,通过Reason和Exit Code查看容器停止的原因和状态码:State: Terminated
Reason: Completed
Exit Code: 0
Started: Wed, 30 Jan 2019 11:45:26 +0530
Finished: Wed, 30 Jan 2019 11:45:26 +0530
Node上的kebulet可以使用探针来周期性地检测运行中的容器的状态。探针的实现方式有3种:
cat /tmp/healthy,如果命令返回的状态码为0,则认为探测成功telnet来检测Linux服务器上的端口有如下3种探针:
initialDelaySeconds)时间内,探测默认为失败。如果一个容器没有提供这个探针,默认为成功(在initial delay之后)restartPolicy决定是否创建容器探针支持的属性:
探针的定义方式可参考:
apiVersion: v1 kind: Pod metadata: name: demo spec: containers: - name:demo-ctr image: polinux/stress command: ["stress"] args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"] livenessProbe: # liveness探针-command exec: command: - cat - /tmp/healthy initialDelaySeconds: 5 # 第1次执行探针时,延迟5s执行 failureThreshold: 2 # 探针执行失败2次后容器状态变为失败 periodSeconds: 5 # 每5s执行一次探针 readinessProbe: # readinessProbe的属性和livenessProbe的属性一模一样 tcpSocket: port: 8080 initialDelaySeconds: 5 periodSeconds: 10 startupProbe: # startupProbe httpGet: path: /healthz port: liveness-port failureThreshold: 30 periodSeconds: 10 # 容器启动30*10=300s内liveness和readiness探针不会执行,300s后startup探针还没成功,容器会被kill掉重启
当一个容器执行完退出时,不管是成功还是失败,都会触发重启策略,根据restartPolicy的设置来决定要不要重启该容器,restartPolicy有以下3种取值:
RunningRunning,成功的时候不重启,Pod的阶段转为SucceededFailed或者Succeeded因为Pod代表着一组运行在node上的进程,所以允许这些进程在不再需要的时候能优雅地退出很重要(而不是被一个KILL信号强制停止,没有机会进行资源清理)。
k8s的设计目标在于让用户可以发起删除请求和知道进程什么时候终止,并能够确保删除最终完成。当对一个Pod发起一个删除请求时,集群在强制删掉这个Pod前,会记录和追踪一段grace period(terminationGracePeriodSeconds, 默认是30s),在这段时间内,kubelet会尝试优雅地(graceful)关闭Pod。
一般的做法是,容器运行时(如Docker)会发送TERM信号给Pod中每个容器的主进程,一旦grace period结束,容器运行时会发送KILL给还没有成功结束的进程,然后Pod在API Server上被删除掉。如果kubelet或容器运行时的管理服务在等待这些进程优雅退出的时候重启了,那么集群会重新尝试整个删除流程,包括grace period。
如果Pod中的容器定义了preStop钩子,那么终止容器(给容器发送TERM或KILL信号)前会先执行该钩子,如果grace period时间过了钩子还没执行完,kubelet会额外增加2s的时间让容器有机会优雅地退出。如果preStop钩子需要执行很长时间的话,一般建议把terminationGracePeriodSeconds调大。
当grace period开始时,Pod就会被从可用的服务列表中移除,服务请求不会再被转发到这个Pod上。
当所有容器(包括pause)都停掉以后,kubelet会触发API Server把这个Pod删除掉
对于已完成的Pod(包括Failed和Succeeded的Pod),它们的API对象会保留在系统中。当系统中创建的Pod数量超出了指定阈值(kube-controller-manager中的terminated-pod-gc-threshold)时,控制面板会清理这些已完成的Pod(包括Failed和Succeeded的Pod)。
https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。