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:如何优雅地终止

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
2月前
|
Kubernetes 监控 开发者
掌握容器化:Docker与Kubernetes的最佳实践
【10月更文挑战第26天】本文深入探讨了Docker和Kubernetes的最佳实践,涵盖Dockerfile优化、数据卷管理、网络配置、Pod设计、服务发现与负载均衡、声明式更新等内容。同时介绍了容器化现有应用、自动化部署、监控与日志等开发技巧,以及Docker Compose和Helm等实用工具。旨在帮助开发者提高开发效率和系统稳定性,构建现代、高效、可扩展的应用。
|
9天前
|
人工智能 运维 监控
容器服务Kubernetes场景下可观测体系生产级最佳实践
阿里云容器服务团队在2024年继续蝉联Gartner亚洲唯一全球领导者象限,其可观测体系是运维的核心能力之一。该体系涵盖重保运维、大规模集群稳定性、业务异常诊断等场景,特别是在AI和GPU场景下提供了全面的观测解决方案。通过Tracing、Metric和Log等技术,阿里云增强了对容器网络、存储及多集群架构的监控能力,帮助客户实现高效运维和成本优化。未来,结合AI助手,将进一步提升问题定位和解决效率,缩短MTTR,助力构建智能运维体系。
|
1月前
|
Kubernetes 算法 调度
阿里云 ACK FinOps成本优化最佳实践
本文源自2024云栖大会梁成昊演讲,讨论了成本优化策略的选择与实施。文章首先介绍了成本优化的基本思路,包括优化购买方式、调整资源配置等基础策略,以及使用弹性、资源混部等高级策略。接着,文章详细探讨了集群优化和应用优化的具体方法,如使用抢占式实例降低成本、通过资源画像识别并优化资源配置,以及利用智能应用弹性策略提高资源利用效率。
|
1月前
|
Kubernetes 容灾 调度
阿里云 ACK 高可用稳定性最佳实践
本文整理自2024云栖大会刘佳旭的演讲,主题为《ACK高可用稳定性最佳实践》。文章探讨了云原生高可用架构的重要性,通过Kubernetes的高可用案例分析,介绍了ACK在单集群高可用架构设计、产品能力和最佳实践方面的方法,包括控制面和数据面的高可用策略、工作负载高可用配置、企业版容器镜像服务高可用配置等内容,旨在帮助企业构建更加可靠和高效的应用运行环境。
|
2月前
|
存储 运维 Kubernetes
K8s业务迁移最佳实践: 灵活管理资源备份与调整策略,实现高效简便的应用恢复
在当今快速变化的云原生领域,Kubernetes(K8s)集群的运维面临着诸多挑战,其中灾备与业务迁移尤为关键。ACK备份中心支持丰富的资源调整策略,在数据恢复阶段即可自动适配目标集群环境,确保业务无缝重启。
|
2月前
|
Kubernetes 监控 API
深入解析Kubernetes及其在生产环境中的最佳实践
深入解析Kubernetes及其在生产环境中的最佳实践
79 1
|
3月前
|
NoSQL 关系型数据库 Redis
高可用和性能:基于ACK部署Dify的最佳实践
本文介绍了基于阿里云容器服务ACK,部署高可用、可伸缩且具备高SLA的生产可用的Dify服务的详细解决方案。
|
4月前
|
Kubernetes Docker 微服务
构建高效的微服务架构:基于Docker和Kubernetes的最佳实践
在现代软件开发中,微服务架构因其灵活性和可扩展性而受到广泛青睐。本文探讨了如何利用Docker和Kubernetes来构建高效的微服务架构。我们将深入分析Docker容器的优势、Kubernetes的编排能力,以及它们如何结合实现高可用性、自动扩展和持续部署。通过具体的最佳实践和实际案例,读者将能够理解如何优化微服务的管理和部署过程,从而提高开发效率和系统稳定性。
|
5月前
|
Kubernetes 安全 数据安全/隐私保护
Kubernetes 安全性最佳实践
【8月更文第29天】随着容器化和微服务架构的普及,Kubernetes 已成为管理容器化应用的标准平台。然而,随着 Kubernetes 的广泛采用,其安全性问题也日益受到关注。本文将深入探讨 Kubernetes 的安全最佳实践,并通过具体的代码示例来展示如何保护 Kubernetes 集群免受攻击。
274 2
|
5月前
|
Kubernetes jenkins 持续交付
Kubernetes CI/CD 集成:持续交付的最佳实践
【8月更文第29天】随着微服务架构和容器化的普及,Kubernetes 成为了运行容器化应用的事实标准。为了确保应用能够快速迭代并稳定发布,持续集成/持续部署(CI/CD)流程变得至关重要。本文将介绍如何将 Kubernetes 集成到 CI/CD 流程中,并提供一些最佳实践。
370 1