Pod的声明周期
删除pod时,加上–force选项能提高删除pod的速度,这是一种粗暴的删除方式。不加–force选项为什么慢呢?
原因在于kubernetes对pod的删除有个延期删除期,这个时间默认是30s。当对一个pod发出删除指令时,这个pod状态会被标记为”terminating”,此时不会立即删除,而是等pod继续处理手头的任务,如果在30s内任务完成的话则pod会被自动删除,超过30s任务还没有结束则pod会被强制删除。这种删除方式叫做优雅的删除pod。这个宽限期可以通过参数terminationGracePeriodSeconds来指定。
- 修改yaml文件
vi t1.yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: t1
name: t1
spec:
terminationGracePeriodSeconds: 15
containers:
- image: busybox
imagePullPolicy: IfNotPresent
command: ["sh","-c","sleep 1000"]
name: t1
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
- 创建pod
kubectl apply -f t1.yaml
kubectl get pod
kubectl describe pods t1
kubectl delete pods t1
删除pod时有15s宽限期,容器里执行的命令为sleep 1000
,要1000s后才能结束,所以15s后pod会被强制删除。
注意:如果pod里执行的是nginx进程,就不一样了,因为nginx处理信号的方式和kubernetes处理信号的方式并不一样,nginx pod进程使用fast shutdown,pod里的nginx进程会很快被关闭,之后pod也很快被删除,不会使用kubernets的删除宽限期。
pod hook(钩子)
在删除某个pod时,如果客户端正在连接此pod,强制删除会导致客户端访问报错。可以通过pod钩子来解决问题。
在pod生命周期内,有两个hook是可用的:
- postStart:创建pod时随着pod主进程同时运行,没有先后顺序。
- preStop:当删除pod时,要先运行preStop里的程序,之后再关闭pod。
对于preStop来说,也必须在宽限期内完成,没有在宽限期内完成仍然会被强制删除。
- 修改yaml文件
vi t2.yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: t2
name: t2
spec:
terminationGracePeriodSeconds: 600
containers:
- image: nginx
imagePullPolicy: IfNotPresent
name: t2
resources: {}
lifecycle:
preStop:
exec:
command: ["/bin/sh","-c","/usr/sbin/nginx -s quit"]
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
- 创建pod
kubectl apply -f t2.yaml
kubectl get pod
kubectl delete pods t2
当删除pod时,pod状态被标记为”terminating”,此时删除信号并没有发送到pod里的主进程nginx –g daemon off,而是 先执行 preStop hook里的进程,即/usr/sbin/nginx –s quit。
/usr/sbin/nginx –s quit是一种优雅的关闭nginx的方式,即先处理完手头已有的任务,再关闭nginx进程。该任务完成后pod里主程序接收关闭信号,再把nginx pod删除。