Kubernetes中的优雅关闭和零停机时间部署( 六 )


但是,请记住,Kubernetes将在30秒后强制终止进程(除非你在Pod定义中更改了terminationGracePeriodSeconds) 。
如果无法更改代码以等待更长时间怎么办?你可以调用一个脚本等待固定的时间,然后让应用程序退出 。
在调用SIGTERM之前 , Kubernetes在Pod中提供了一个preStop钩子 。你可以将preStop钩子设置为等待15秒钟 。
让我们看一个示例:
pod.yaml
apiVersion: v1kind: Podmetadata:name: my-podspec:containers:- name: webimage: nginxports:- name: webcontainerPort: 80lifecycle:preStop:exec:command: ["sleep", "15"]

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
preStop钩子是Pod生命周期钩子之一 。
15秒的延迟是推荐的时间吗?这取决于情况,但这可能是开始测试的合理方式 。
以下是你可以选择的选项的总结:
1. 你已经知道 , 当一个Pod被删除时,kubelet会收到这一变更的通知 。
Kubernetes中的优雅关闭和零停机时间部署

文章插图
图片
2. 如果Pod具有preStop钩子,它会首先被调用 。
Kubernetes中的优雅关闭和零停机时间部署

文章插图
3. 当preStop钩子完成后,kubelet会向容器发送SIGTERM信号 。从那时起,容器应该关闭所有长连接并准备终止 。
Kubernetes中的优雅关闭和零停机时间部署

文章插图
4. 默认情况下,进程有30秒的时间退出 , 其中包括preStop钩子的执行时间 。如果进程在此期间未退出,kubelet将发送SIGKILL信号并强制终止进程 。
Kubernetes中的优雅关闭和零停机时间部署

文章插图
5. kubelet通知控制平面成功删除了该Pod 。
Kubernetes中的优雅关闭和零停机时间部署

文章插图
优雅期限和滚动更新优雅关闭适用于被删除的Pod 。
但如果你不删除Pod呢?即使你不删除Pod,Kubernetes也会定期删除Pod 。
特别是,每当你部署应用程序的新版本时,Kubernetes会创建和删除Pod 。
当你在部署中更改镜像时,Kubernetes会逐步推出变更 。
pod.yaml
apiVersion: apps/v1kind: Deploymentmetadata:name: appspec:replicas: 3selector:matchLabels:name: apptemplate:metadata:labels:name: appspec:containers:- name: app# image: nginx:1.18 OLDimage: nginx:1.19ports:- containerPort: 3000
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
如果你有三个副本,并且在提交新的YAML资源给Kubernetes后,Kubernetes会:
  • 创建一个包含新容器镜像的Pod 。
  • 销毁一个现有的Pod 。
  • 等待Pod就绪 。
然后它会重复上述步骤,直到所有的Pod都迁移到新版本 。
Kubernetes只有在新的Pod准备好接收流量(也就是通过了就绪性检查)后才会重复每个周期 。
Kubernetes在继续处理下一个Pod之前是否等待Pod被删除?
不会 。
如果你有10个Pod,并且每个Pod需要2秒钟准备就绪和20秒钟关闭,情况如下:
  1. 首先创建一个新的Pod , 并终止一个之前的Pod 。
  2. 新的Pod需要2秒钟准备就绪,然后Kubernetes创建一个新的Pod 。
  3. 与此同时 , 正在终止的Pod保持终止状态20秒钟 。
在20秒钟之后,所有新的Pod都处于活动状态(10个Pod , 在2秒钟后准备就绪),而之前的10个Pod都处于终止状态(第一个终止的Pod即将退出) 。
总体而言,在短时间内你将拥有两倍数量的Pod(10个运行中,10个终止中) 。
Kubernetes中的优雅关闭和零停机时间部署

文章插图
与就绪探针相比 , 宽限期限越长,你将同时拥有更多的运行中(以及终止中)的Pod 。
这是一件坏事吗?不一定 , 因为你要小心地确保不丢失连接 。
终止长时间运行的任务
那对于长时间运行的作业呢?
如果你正在转码一个大型视频,有没有办法延迟停止Pod的操作?


推荐阅读