如果您想在关闭Pod之前清除流量,则应该使用preStop hook以及livenessProbe health check。
理想情况下,您将拥有一个preStop挂钩,将pod强制转换为不健康的livenessProbe检查,以便将pod从负载平衡器中删除,然后正常关闭。
这不太好,但是这个例子在我的简单测试中有效。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx
spec:
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
livenessProbe:
exec:
command:
- cat
- /usr/share/nginx/html/50x.html
initialDelaySeconds: 15
timeoutSeconds: 1
ports:
- containerPort: 80
lifecycle:
preStop:
exec:
# SIGTERM triggers a quick exit; fail health check and gracefully terminate instead
command: ["/bin/rm","-f","/usr/share/nginx/html/50x.html",";","sleep","2",";","/usr/sbin/nginx","-s","quit"]
从这个例子中,livenessProbe查找/usr/share/nginx/html/50x.html文件。只要该文件存在,吊舱就是健康的。当Pod将被关闭时,PreStop钩子将被触发,从而移除该文件。这应该会触发在下一次运行状况检查(1秒)时将外挂从外部负载平衡器中移除。然后preStop命令会休眠2秒(以确保下一次运行状况检查被触发)并告诉nginx正常停止-s quiet
。 preStop命令应该在30秒内完成,在pod强制终止(SIGTERM)之前30秒内完成,但是应该为nginx排出连接提供足够的时间。
由于不可预测的时间,但韩元失败的活性探针立即杀死容器,关闭所有打开的连接?准备就绪调查似乎更适合我。无论哪种方式,使用preStop钩子和捕获SIGTERM有什么区别? –
如果吊舱失效,它将通过正常的终止程序。如果一个吊舱已经被杀死,它不会被重新杀死,除非它超过了30秒的超时时间(默认时间)。准备探测器仅在启动时使用,以确保在发送流量之前该容器已准备就绪。准备完成后,不再检查准备就绪探测器,将来的检查将使用livenessProbe。的prestop可以重复使用泛型容器和做每荚自定义操作,而不是建立每个应用程序/ POD专门的容器来处理正常关机。 –
我做了一些实验,并准备探头,其实是在定期检查,如果一个吊舱不再是准备将不再接收流量。 –