赞
踩
一直以来我对优雅地停止 Pod 这件事理解得很单纯:不就利用是 PreStop hook 做优雅退出吗?但这周听了组里大哥的教诲之后,发现很多场景下 PreStop hook 并不能很好地完成需求,这篇文章就简单分析一下“优雅地停止 Pod”这回事儿。
假如我们一声不吭直接把进程杀了,那这部分流量就无法得到正确处理,部分用户受到影响。不过还好,通常来说网关或者服务注册中心会和我们的服务保持一个心跳,过了心跳超时之后系统会自动摘除我们的服务,问题也就解决了;这是硬中止,虽然我们整个系统写得不错能够自愈,但还是会产生一些抖动甚至错误;
假如我们先告诉网关或服务注册中心我们要下线,等对方完成服务摘除操作再中止进程,那不会有任何流量受到影响;这是优雅停止,将单个组件的启停对整个系统影响最小化。
已经卡死了,处理不了优雅退出的代码逻辑或需要很久才能处理完成;
优雅退出的逻辑有 BUG,自己死循环了;
代码写得野,根本不理会 SIGTERM。
- spec:
- contaienrs:
- - name: my-awesome-container
- lifecycle:
- preStop:
- exec:
- command: ["/bin/sh","-c","/pre-stop.sh"]
1.用户删除 Pod
2.1. Pod 进入 Terminating 状态;
2.2. 与此同时,Kubernetes 会将 Pod 从对应的 service 上摘除;
2.3. 与此同时,针对有 preStop hook 的容器,kubelet 会调用每个容器的 preStop hook,假如 preStop hook 的运行时间超出了 grace period,kubelet 会发送 SIGTERM 并再等 2 秒;
2.4. 与此同时,针对没有 preStop hook 的容器,kubelet 发送 SIGTERM。
3.grace period 超出之后,kubelet 发送 SIGKILL 干掉尚未退出的容器
DefaultStorageClass,为没有声明 storageClass 的 PVC 自动设置 storageClass
ResourceQuota,校验 Pod 的资源使用是否超出了对应 Namespace 的 Quota
用户更新资源对象;
controller-manager watch 到对象变更;
controller-manager 开始同步对象状态,尝试删除第一个 Pod;
apiserver 调用外部 webhook;
webhook server 请求集群做 tikv-1 节点下线前的准备工作(这个请求是幂等的),并查询准备工作是否完成,假如准备完成,允许删除,假如没有完成,则拒绝,整个流程会因为 controller manager 的控制循环回到第 2 步。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。