我试图让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: …Run Code Online (Sandbox Code Playgroud) 我想在 Kubernetes Pod 中实现正常关闭。我知道我需要监听 SIGTERM,它表示关闭程序的开始。但是当我收到它时我该怎么做?
至少我必须在退出之前等待所有正在运行的请求完成。但是 Pod 收到 SIGTERM 后还能收到新的请求吗?(它使用服务公开。)我找不到任何关于此的明确文档。
文档状态:
Pod 从服务的端点列表中删除,不再被视为复制控制器的运行 Pod 集的一部分。缓慢关闭的 Pod 可以继续为流量提供服务,因为负载均衡器(如服务代理)将它们从轮换中移除。
所以这似乎意味着新请求仍然可以进来。那么在正常终止之前我应该继续期待新请求多长时间?我是否只是忽略 SIGTERM,继续照常处理请求并等待最终的 SIGKILL?
我想确保未来的准备检查失败,然后等待比终止前发生的时间长可能会起作用?
我在 Kubernetes 1.2.5 上,如果这有什么不同的话,我特别是在谈论滚动更新,但通常也会缩小复制控制器。