
我们一般将pod对象从创建至终这段时间范围成为pod的生命周期,它主要包含以下的过程:
init container);main container);
post start;pre stop操作,也就是收尾工作。preStop,允许 pod 在退出前执行一段脚本用以清除必要的资源等。终止过程主要分为如下几个步骤:
pod.spec.terminationGracePeriodSeconds 参数定义,默认情况下30秒)这么长的时间preStop 处理程序,则 pod 被标记为“Terminating”状态时以同步的方式启动执行preStop;若宽限期结束后,preStop 仍未执行结束,第二步会重新执行并额外获得一个2秒的小宽限期(最后的宽限期,所以定义preStop 注意时间,和terminationGracePeriodSeconds 参数配合使用),钩子函数能够感知自身生命周期中的事件,并在相应的时刻到来时运行用户指定的程序代码,k8s在主容器的启动之后和停止之前提供了两个钩子函数。
post start:容器创建之后执行,如果失败了会重启容器。pre stop:容器终止之前执行,执行完成之后容器将成功终止,在其完成之前会阻塞删除容器的操作。钩子处理器支持使用下面三种方式定义动作:
exec命令(自定义):在容器内执行一次命令......
lifecycle:
postStart:
exec:
command:
- cat
- /tmp/healthy
......
tcpSocket:在当前容器尝试访问指定的socket,监听端口,属于四层。......
lifecycle:
postStart:
tcpSocket:
port: 8080
......
httpGet:在当前容器中向某url发起http请求,监听接口,属于七层。......
lifecycle:
postStart:
httpGet:
path: #uri地址
port:
host:
scheme: HTTP #支持的协议,http或者https
......
apiVersion: apps/v1
kind: Deployment
metadata:
name: pod-hook-exec
spec:
replicas: 1
selector:
matchLabels:
app: pod-hook-exec
template:
metadata:
labels:
app: pod-hook-exec
spec:
terminationGracePeriodSeconds: 5 # 设置5秒宽限时间,默认是30s
nodeName: local-168-182-110 # 为了测试方便,指定调度机器
initContainers:
- name: init-containers
image: busybox
command: ["sh","-c","echo init-containers...|tee -a /tmp/pod-hook-exec.log;sleep 5s"]
volumeMounts:
- name: logs
mountPath: /tmp/pod-hook-exec.log
subPath: pod-hook-exec.log
containers:
- name: main-container
image: busybox
command: ["sh","-c","echo main-container...|tee -a /tmp/pod-hook-exec.log;sleep 3600s"] # 只有这个才会输出到屏幕,也就是通过logs只能查看主容器日志
volumeMounts:
- name: logs
mountPath: /tmp/pod-hook-exec.log
subPath: pod-hook-exec.log
startupProbe:
exec:
command: ["sh","-c","echo startupProbe...|tee -a /tmp/pod-hook-exec.log;sleep 5s"]
timeoutSeconds: 10
livenessProbe:
exec:
command: ["sh","-c","echo livenessProbe...|tee -a /tmp/pod-hook-exec.log;sleep 5s"]
timeoutSeconds: 10
readinessProbe:
exec:
command: ["sh","-c","echo readinessProbe...|tee -a /tmp/pod-hook-exec.log;sleep 5s"]
timeoutSeconds: 10
lifecycle:
postStart:
exec: #在容器启动的时候执行一个命令
command: ["sh","-c","echo postStart...|tee -a /tmp/pod-hook-exec.log;sleep 5s"]
preStop: # 在pod停止之前执行
exec:
command: ["sh","-c","echo preStop...|tee -a /tmp/pod-hook-exec.log"]
volumes:
- name: logs #和上面保持一致 这是本地的文件路径,上面是容器内部的路径
hostPath:
path: /opt/k8s/test/
kubectl apply -f test.yaml ;kubectl get pods -w |grep pod-hook-exec


从上图的日志就可看出,被分为6个执行阶段,执行的先后顺序:initContainers-》【main-container、postStart】-》startupProbe-》readinessProbe-》livenessProbe-》preStop
【温馨提示】
main-container和postStart是同时执行,虽然readinessProbe和livenessProbe也是同时执行,但是他们不是真正的并行执行,也有先后顺序的。
关于K8s pod优雅退出优雅退出,执行先后顺序就先到这里了,有疑问的小伙伴欢迎给我留言哦,后续会持续分享关于【大数据与云原生】相关的文章,请小伙伴耐心等待哦~