Kubernetes最佳实践S01E05:如何优雅地终止

简介: 这篇是Google Developer Advocate Sandeep Dinesh的七部分视频和博客系列的第五部分,介绍如何充分利用您的Kubernetes环境。对于分布式系统,处理故障是关键。 Kubernetes通过监视系统状态并重新启动已停止执行的服务的控制器来解决这个问题。
这篇是Google Developer Advocate Sandeep Dinesh 的七部分视频和博客系列的第五部分,介绍如何充分利用您的Kubernetes环境。

对于分布式系统,处理故障是关键。 Kubernetes通过监视系统状态并重新启动已停止执行的服务的控制器来解决这个问题。 另一方面,Kubernetes通常可以强制终止您的应用程序,作为系统正常运行的一部分。

在本期“Kubernetes最佳实践”中,让我们来看看如何帮助Kubernetes更有效地完成工作并体验下如何减少应用程序停机时间。

在容器出现之前的世界中,大多数应用程序在VM或物理机器上运行。 如果应用程序崩溃,启动替换程序需要很长时间。 如果您只有一台或两台机器来运行应用程序,那么这种恢复时间是不可接受的。

相反,在崩溃时使用进程级监视来重新启动应用程序变得很常见。 如果应用程序崩溃,进程监视可以捕获退出代码并立即重新启动应用程序。

随着像Kubernetes这样的系统的出现,不再需要进程监控系统,因为Kubernetes会重启崩溃的应用程序本身。 Kubernetes使用事件循环来确保容器和节点等资源是健康的。 这意味着您不再需要手动运行这些进程监视器。 如果资源未通过运行状况检查,Kubernetes会自动轮转更换。

查看这一集视频,了解如何为您的服务设置自定义健康检查。

Kubernetes终止生命周期

Kubernetes不仅可以监控应用程序的崩溃。 它可以创建更多应用程序副本,以便在多台计算机上运行,更新应用程序,甚至可以同时运行多个版本的应用程序!


这意味着Kubernetes可以终止一个完全健康的容器有很多原因。 如果您使用滚动更新更新部署,Kubernetes会在启动新Pod时慢慢终止旧Pod。 如果释放节点,Kubernetes将终止该节点上的所有Pod。 如果节点资源不足,Kubernetes将终止Pod以释放这些资源。


查看第三集,可以了解有关资源的更多信息

重要的是,您的应用程序要优雅地处理终止,以便最终用户受到的影响最小,并且恢复时间尽可能快( Time-to-recovery )!

实际上,这意味着您的应用程序需要处理SIGTERM消息并在收到它时开始关闭。 这意味着你需要保存所有需要保存的数据,关闭网络连接,完成剩下的任何工作以及其他类似任务。

一旦Kubernetes决定终止您的Pod,就会发生一系列事件。 让我们看看Kubernetes终止生命周期的每一步。

1. Pod被设置为“终止”状态,并从所有服务的端点列表中删除

此时,Pod停止获得新的流量。 在Pod中运行的容器不会受到影响。

2. preStop Hook被执行

preStop Hook 是一个发送到Pod中的容器特殊命令或Http请求。

如果您的应用程序在接收SIGTERM时没有正常关闭,您可以使用此 Hook 来触发正常关闭。 接收SIGTERM时大多数程序都会正常关闭,但如果您使用的是第三方代码或管理系统则无法控制,所以 preStop Hook 是在不修改应用程序的情况下触发正常关闭的好方法。

3. SIGTERM信号被发送到Pod

此时,Kubernetes将向Pod中的容器发送SIGTERM信号。 这个信号让容器知道它们很快就会被关闭。

您的代码应该监听此事件并在此时开始干净地关闭。 这可能包括停止任何长期连接(如数据库连接或WebSocket流),保存当前状态或类似的东西。

即使您使用 preStop Hook ,如果您发送SIGTERM信号,测试一下应用程序会发生什么情况也很重要,这样您在生产环境中才不会感到惊讶!

4. Kubernetes等待优雅的终止

此时,Kubernetes等待指定的时间称为优雅终止宽限期。 默认情况下,这是30秒。 值得注意的是,这与 preStop Hook 和SIGTERM信号并行发生。 Kubernetes不会等待 preStop Hook 完成。

如果你的应用程序完成关闭并在 terminationGracePeriod 完成之前退出,Kubernetes会立即进入下一步。

如果您的Pod通常需要超过30秒才能关闭,请确保增加优雅终止宽限期。 您可以通过在Pod的YAML中设置 terminationGracePeriodSeconds 选项来实现。 例如,要将其更改为60秒:
1.png

5. SIGKILL信号被发送到Pod,并删除Pod

如果容器在优雅终止宽限期后仍在运行,则会发送SIGKILL信号并强制删除。 此时,所有Kubernetes对象也会被清除。

结论

Kubernetes可以出于各种原因终止Pod,并确保您的应用程序优雅地处理这些终止,这是创建稳定系统和提供出色用户体验的核心。

本文转自DockOne-Kubernetes最佳实践S01E05:如何优雅地终止

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
24天前
|
运维 Kubernetes 持续交付
构建高效自动化运维体系:基于Docker和Kubernetes的最佳实践
在现代云计算环境中,自动化运维成为保障系统稳定性与提升效率的关键。本文深入探讨了如何利用Docker容器化技术和Kubernetes容器编排工具构建一个高效、可靠的自动化运维体系。文中不仅介绍了相关的技术原理,还结合具体案例分析了实施过程中的常见问题及解决方案,为读者提供了一套行之有效的最佳实践指南。
|
2月前
|
存储 Kubernetes 容灾
Velero 系列文章(五):基于 Velero 的 Kubernetes 集群备份容灾生产最佳实践
Velero 系列文章(五):基于 Velero 的 Kubernetes 集群备份容灾生产最佳实践
|
2月前
|
消息中间件 Kubernetes NoSQL
「译文」K8S 及 OpenShift 上应用程序的 Labels 和 Annotations 最佳实践
「译文」K8S 及 OpenShift 上应用程序的 Labels 和 Annotations 最佳实践
|
2月前
|
Kubernetes 监控 安全
「译文」在 K8S/OpenShift 上开发应用程序的 14 种最佳实践
「译文」在 K8S/OpenShift 上开发应用程序的 14 种最佳实践
|
7月前
|
弹性计算 运维 Cloud Native
阿里云罗晶分享 | X86+ARM,容器服务 ACK 多架构应用部署最佳实践
2023年8月31日,系列课程第五节《X86+ARM,容器服务ACK多架构应用部署最佳实践》正式上线,由阿里云云原生应用平台产品专家罗晶主讲,内容涵盖:容器服务ACK简介;ACK支持倚天ARM实例;ACK多架构应用部署最佳实践。
|
4月前
|
Kubernetes 网络协议 API
kubernetes资源命名约束和最佳实践
kubernetes资源命名约束和最佳实践
131 0
|
6月前
|
Kubernetes 前端开发 Cloud Native
《使用 Helm 管理 Kubernetes 应用程序的最佳实践》
《使用 Helm 管理 Kubernetes 应用程序的最佳实践》
102 0
|
6月前
|
Kubernetes Dubbo Cloud Native
精进云原生 – Dubbo Kubernetes 最佳实践
精进云原生 – Dubbo Kubernetes 最佳实践
|
6月前
|
Kubernetes Dubbo Cloud Native
精进云原生 – Dubbo Kubernetes 最佳实践
本文将从开发、部署、监控、运维等多维度视角分析,详细的介绍如何基于 Dubbo 在Kubernetes 体系下构建高效、可靠的微服务应用。为期望在 Kubernetes 下开发微服务的用户提供了可以复制且大规模部署的样板。
精进云原生 – Dubbo Kubernetes 最佳实践
|
9月前
|
Kubernetes 监控 NoSQL
Gitlab on k8s最佳实践
Gitlab on k8s最佳实践
486 1