Lin*_*dry 10 termination nginx kubernetes
我试图让kubernetes nginx部署零停机时间.该过程的一部分是启动rollingUpdate,确保至少有一个pod始终在运行nginx.这非常有效.
当旧的nginx pod终止时,我遇到了错误.根据终止的kubernetes文档,kubernetes将:
我知道该命令nginx -s quit
应该通过等待所有工作程序在主服务器终止之前完成请求来优雅地终止nginx.它优雅地响应SIGQUIT命令,而SIGTERM导致暴力终止.其他论坛说它就像在部署中添加以下preStop挂钩一样简单:
lifecycle:
preStop:
exec:
command: ["/usr/sbin/nginx", "-s", "quit"]
Run Code Online (Sandbox Code Playgroud)
但是,通过测试此命令,我发现nginx -s quit
立即返回,而不是等待工人完成.它也不会返回主进程的PID,这是我希望D:
什么情况是,kubernetes所调用nginx -s quit
,这将适当SIGQUIT发送到工人的孩子,而不是等待它们完成.相反,它会直接跳到第3步,而SIGTERM会转向那些进程,导致暴力终止,从而导致连接丢失.
问题:有没有人想出一个在滚动部署期间优雅地关闭他们的nginx控制器并且没有停机时间的好方法?一个sleep
解决办法是不够好,我正在寻找的东西更稳健.
以下是完整部署yaml:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-ingress-controller
spec:
replicas: 1
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 0
template:
metadata:
labels:
app: nginx-ingress-lb
spec:
terminationGracePeriodSeconds: 60
serviceAccount: nginx
containers:
- name: nginx-ingress-controller
image: gcr.io/google_containers/nginx-ingress-controller:0.9.0-beta.8
imagePullPolicy: Always
readinessProbe:
httpGet:
path: /healthz
port: 10254
scheme: HTTP
livenessProbe:
httpGet:
path: /healthz
port: 10254
scheme: HTTP
initialDelaySeconds: 10
timeoutSeconds: 5
args:
- /nginx-ingress-controller
- --default-backend-service=$(POD_NAMESPACE)/default-backend
- --v=2
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
ports:
- containerPort: 80
lifecycle:
preStop:
exec:
command: ["/usr/sbin/nginx", "-s", "quit"]
Run Code Online (Sandbox Code Playgroud)
我讨厌回答自己的问题,但经过点点滴滴,这就是我到目前为止的内容。
我创建了一个半阻塞的bash脚本,称为killer
:
#!/bin/bash
sleep 3
PID=$(cat /run/nginx.pid)
nginx -s quit
while [ -d /proc/$PID ]; do
sleep 0.1
done
Run Code Online (Sandbox Code Playgroud)
我发现在Nginx Pod中有一个文件/run/nginx.pid
,其中包含主进程的PID。如果调用nginx -s quit
并启动等待,直到该过程消失,则实际上已使quit命令成为“阻塞”。
请注意,sleep 3
在发生任何事情之前都存在一个。这是由于竞争条件导致Kubernetes将Pod标记为终止,但是需要一点时间(<1s)才能从将流量指向该Pod的服务中删除该Pod。
我已经将该脚本安装到了pod中,并通过preStop
指令对其进行了调用。它通常可以正常工作,但是在测试过程中,仍然偶尔会出现blip错误,提示连接被“对等重置”。但这是朝正确方向迈出的一步。
归档时间: |
|
查看次数: |
1084 次 |
最近记录: |