如何优雅的停止生产环境中 Kubernetes 应用

公众号关注 「奇妙的 Linux 世界」

设为「星标」,每天带你玩转 Linux !

c9c7982a9811ea681547795f24d60dd9.png

在负责实际生产中的敏感性业务时,我们经常会发现在发布或者底层基础设施异常时,业务会在短暂的时间内出现不可访问,虽然 Kubernetes 架构可以帮助我们很快的进行自动化修复,但是依然会存在一定时间的 downtime,本篇文章来介绍下如何对 Kubernetes 中的业务进行优雅停服。

当我们输入 kubectl delete pod 时,对应的 pod 会被删除掉,同时 endpoint controller 会从 Service 和 etcd 中移除它的 IP 地址和端口。

此时,我们可以通过 kubectl describe service 来观测整个过程。

1e0f520bbe059193727bdf002e80511d.png                                                    describe svc

但就这还不够。

k8s 中存在多个组件去同步本地的 endpoints 列表

  • kube-proxy 会保存本地的 endpoints 列表去写入 iptables 规则

  • CoreDNS 使用 endpoint 列表去重新配置 DNS entries

例如 Ingress 控制器,Istio 等也是如此同步的。

1d89c75671cbb13daa8533a94a9e21c9.png

其他控制器对 endpoint 的依赖

所有这些组件都将(最终)删除之前的端点,这样就不会有流量再次到达它。

同时,kubelet 也会收到更改通知并删除 pod。

那么当 kubelet 在其他组件之前删除 pod 时会发生什么呢?

37cb7fc525ce9bab4d7df85c6e1deb39.png

不幸的是,此时你的业务会经历一段时间的 downtime ,因为诸如 kube-proxy,CoreDNS,Ingress 控制器等组件会仍然使用该 IP 地址来路由流量。

所以,我们应该如何去处理此类情况,尽可能的减少我们业务的 downtime 时间呢?

6f2d46e58ccac08e7aed3b3b6b0e8fc6.png


如果在删除 pod 之前等待足够长的时间,传输中的流量仍然可以解决,并且新的流量可以分配给其他 pod。

所以,我们应该通过何种方式来在删除 pod 之前等待一段时间呢?

4a1e6e1914e392c70859d915b9b5d2a0.png

wait for delete

当 kubelet 删除 一个 pod 时,它将经历以下步骤:

  • 触发 preStop hook (如果有的话)

  • 发送 SIGTERM 信号

  • 发送 SIGKILL 信号 (after 30 seconds)


22c6665db15bbc2d554c6b1a92a5632e.png

优雅停机三大步

因此,我们可以使用 preStop 钩子来拆入人为的延迟

9c7dc585b7d4f32e01c090039198070c.png

preStop 配置

也可以在应用程序中接受 SIGTERM 信号并等待

此外,您可以优雅地停止该过程,并在完成等待后退出。

Kubernetes 默认给我们设置了 30s 来做相关的事情。

7e106501e9bbab1ef5cc3a9d77e45980.png

SIGTERM 信号处理

那我们应该等待多久呢?10s,20s 还是 30s 呢?其实没有一个标准的答案。

虽然 endpoints 的同步只需要花费很短的时间,但是 Kubernetes 不能保证任何时间,也不能保证所有组件都能同时完成。

34beb0c71f6d5e6100ff792efde00b26.png

delete pod 流程

相关链接:

  • https://learnk8s.io/graceful-shutdown

  • https://freecontent.manning.com/handling-client-requests-properly-with-kubernetes/

  • https://kubernetes.io/docs/concepts/workloads/pods/pod/#termination-of-pods

  • https://medium.com/tailwinds-navigator/-kubernetes-tip-how-to-gracefully-handle-pod-deletion-b28d23644ccc

  • https://medium.com/flant-com/kubernetes-graceful-shutdown-nginx-php-fpm-d5ab266963c2

  • https://www.openshift.com/blog/kubernetes-pods-life

本文转载自:「云原生运维技术」,原文:https://url.hi-linux.com/fq7SJ,版权归原作者所有。欢迎投稿,投稿邮箱: editor@hi-linux.com。

038798bb7722b3b979f3283a1571a634.gif

最近,我们建立了一个技术交流微信群。目前群里已加入了不少行业内的大神,有兴趣的同学可以加入和我们一起交流技术,在 「奇妙的 Linux 世界」 公众号直接回复 「加群」 邀请你入群。

aadc83e0ee7c5ab88c38e66df322810a.png

你可能还喜欢

点击下方图片即可阅读

63c30d9e40ba48e0ebd58a06e3dbe3f8.png

CentOS 停止技术支持后,我们应该如何选择适合的操作系统?

a7e10c9c8377c693bbcda224e810ae4d.png
点击上方图片,『美团|饿了么』外卖红包天天免费领

472922c1ab5888be2527a20c7f673d4d.png

更多有趣的互联网新鲜事,关注「奇妙的互联网」视频号全了解!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值