Kubernetes 优雅终止 pod

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: Kubernetes 优雅终止 pod

当你执行 kubectl delete pod 时,pod 被删除, endpoint 控制器从 service 和 etcd 中删除该 pod 的 IP 地址和端口。

你可以使用 kubectl describe service 观察到这一点。

使用 kubectl describe 列出 endpoint

但远不止如此!

多个组件都会同步变更至本地 endpoint 列表:

  • kube-proxy 通过本地 endpoint 列表来编写 iptables 规则
  • CoreDNS 使用 endpoint 重新配置 DNS

Ingress 控制器、Istio 等也是如此。

Kubernetes 中的 endpoint 传播

所有这些组件都将(最终)删除以前的 endpoint,这样就再也没有流量可以到达它了。

同时,kubelet 也收到了变化的通知,并删除了 pod。

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

不幸的是,你会遇到停机, 因为 kube-proxy、CoreDNS、ingress 控制器等组件仍在使用该 IP 地址来路由流量。

所以,你可以做什么?

等待!

kubelet 还没有传播 endpoint 便立即删除 pod

如果在删除 Pod 之前等待足够长的时间,飞行中的流量仍然可以解析,并且可以将新流量分配给其他 Pod。

你应该如何等待?

kubelet 应该在删除 pod 之前等待 endpoint 传播

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

  • 触发 preStop 钩子(如果有)。
  • 发送 SIGTERM
  • 发送 SIGKILL 信号(默认 30 秒后)。

kubelet 删除 pod 经历了 3 个步骤:preStop hook、SIGTERM 和 SIGKILL

你可以使用preStop挂钩来插入人工延迟。

你可以使用 preStop 挂钩来延迟删除 pod

你可以在你的应用程序中监听 SIGTERM 信号并等待。

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

Kubernetes 给你 30 秒的时间来这样做(时长可配置)。

你可以在你的应用程序中捕获 SIGTERM 信号并等待

你应该等待 10 秒、20 秒还是 30 秒?

没有单一的答案。

虽然传播 endpoint 可能只需要几秒钟,但 Kubernetes 不保证任何时间,也不保证所有组件将同时完成。

Kubernetes 中的 endpoint 传播时间线

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
2月前
|
JSON Kubernetes Shell
【Azure K8S | AKS】在不丢失文件/不影响POD运行的情况下增加PVC的大小
【Azure K8S | AKS】在不丢失文件/不影响POD运行的情况下增加PVC的大小
|
2月前
|
Kubernetes Shell Perl
【Azure K8S|AKS】进入AKS的POD中查看文件,例如PVC Volume Mounts使用情况
【Azure K8S|AKS】进入AKS的POD中查看文件,例如PVC Volume Mounts使用情况
|
7天前
|
Kubernetes Docker Python
dockercompose与k8s的pod文件的爱恨情仇
dockercompose与k8s的pod文件的爱恨情仇
|
2月前
|
Kubernetes Docker Perl
在K8S中,如果是因为开发写的镜像问题导致pod起不来该怎么排查?
在K8S中,如果是因为开发写的镜像问题导致pod起不来该怎么排查?
|
2月前
|
Kubernetes 安全 Docker
在K8S中,在服务上线的时候Pod起不来怎么进行排查?
在K8S中,在服务上线的时候Pod起不来怎么进行排查?
|
2月前
|
存储 Kubernetes 调度
在K8S中,⼀个pod的不同container能够分开被调动到不同的节点上吗?
在K8S中,⼀个pod的不同container能够分开被调动到不同的节点上吗?
|
2月前
|
消息中间件 Kubernetes 容器
在K8S中,同⼀个Pod的不同容器互相可以访问是怎么做到的?
在K8S中,同⼀个Pod的不同容器互相可以访问是怎么做到的?
|
2月前
|
存储 Kubernetes 数据中心
在K8S中,同⼀个Pod内不同容器哪些资源是共用的,哪些资源是隔离的?
在K8S中,同⼀个Pod内不同容器哪些资源是共用的,哪些资源是隔离的?
|
2月前
|
Kubernetes 负载均衡 网络协议
在K8S中,Pod的探针有哪些及用途?
在K8S中,Pod的探针有哪些及用途?
|
2月前
|
Kubernetes 监控 Perl
在K8S中,Pod⼀直处于Init状态,如何排查?
在K8S中,Pod⼀直处于Init状态,如何排查?
下一篇
无影云桌面