Kubernetes最佳实践S01E07:零停机更新Kubernetes集群

简介: 每个人都知道,保持应用程序最新以及优化安全性和性能是一种很好的做法。 Kubernetes和Docker可以更轻松地执行这些更新,因为您可以使用更新构建新容器并相对轻松地部署它。就像您的应用程序一样,Kubernetes不断获得新功能和安全更新,因此底层节点和Kubernetes基础架构也需要保持最新。
每个人都知道,保持应用程序最新以及优化安全性和性能是一种很好的做法。 Kubernetes和Docker可以更轻松地执行这些更新,因为您可以使用更新构建新容器并相对轻松地部署它。

就像您的应用程序一样,Kubernetes不断获得新功能和安全更新,因此底层节点和Kubernetes基础架构也需要保持最新。

在本期Kubernetes最佳实践中,让我们来看看 Google Kubernetes Engine 如何让您的Kubernetes集群轻松升级!

集群的两个部分:Master和Node


在升级群集时,需要更新两个部分:Mater和Node。 需要首先更新Master,Node随后。 让我们看看如何使用 Kubernetes Engine 升级它们。

零停机更新Master

Kubernetes Engine 会在发布点发布时会自动升级Master,但通常不会自动升级到新版本(例如,1.7到1.8)。 准备好升级到新版本后,只需单击 Kubernetes Engine 控制台中的升级主按钮即可。
1.gif

但是,您可能已经注意到该对话框显示以下内容:

“更改主版本可能会导致几分钟的控制平面停机。 在此期间,您将无法编辑此群集。”

当主服务器关闭进行升级时, deployments services 将继续按预期工作。 但是,任何需要 Kubernetes API 的东西都会停止工作。 这意味着 kubectl 将停止工作,那些使用 Kubernetes API 获取有关群集信息的应用程序将停止工作,您基本上无法在集群升级时对群集进行任何更改。

那么如何更新Master而不会导致停机呢?

具有Kubernetes Engine区域集群的高可用Masters

虽然标准的 zonal Kubernetes Engine 集群只有一个Master支持它们,但您可以创建 regional 集群,提供多区域,高可用性的Master(注意: Kubernetes Engine区域集群最近普遍可用 )。

创建群集时,请务必选择 regional 选项:
2.png

就是这样! Kubernetes引擎自动在三个 zone 中创建Node和Master,Master位于负载平衡的IP地址后面,因此Kubernetes API将在升级期间继续工作。

零停机更新Node

升级节点时,您可以使用几种不同的策略。 我想关注两个:
  1. 滚动更新
  2. 使用节点池迁移

滚动更新

更新Kubernetes Node的最简单方法是使用滚动更新。 这是Kubernetes Engine用于更新Node的默认升级机制。

滚动更新以下列方式工作。 一个接一个,一个释放,一个锁存,直到该Node上不再运行Pod。 然后删除该Node,并使用更新的Kubernetes版本创建新Node。 该Node启动并运行后,将更新下一个Node。 这一直持续到所有Node都更新为止。

您可以通过在节点池(Node Pool)上启用自动节点升级,让Kubernetes Engine完全为您管理此过程。
3.png

如果您不选择此选项, Kubernetes Engine 仪表板会在升级可用时提醒您:
4.png

只需单击该链接,然后按照提示开始滚动更新。

警告:确保您的Pod由 ReplicaSet Deployment StatefulSet 或类似的东西管理。 独立Pod不会被重新调度!

虽然在 Kubernetes Engine 上执行滚动更新很简单,但它有一些缺点。

一个缺点是您在群集中获得的节点容量少一个。 通过扩展节点池以添加额外容量,然后在升级完成后将其缩小,可以轻松解决此问题。

滚动更新的完全自动化特性使其易于操作,但您对该过程的控制较少。 如果出现问题,还需要时间回滚到旧版本,因为您必须停止滚动更新然后撤消它。

使用节点池(Node Pool)迁移

您可以创建新节点池,等待所有节点运行,然后一次在一个节点上迁移工作负载,而不是像滚动更新那样升级“活跃的”节点池。

我们假设我们的Kubernetes集群现在有三个VM。 您可以使用以下命令查看节点:
kubectl get nodes
NAME STATUS AGE
gke-cluster-1-default-pool-7d6b79ce-0s6z Ready 3h
gke-cluster-1-default-pool-7d6b79ce-9kkm Ready 3h
gke-cluster-1-default-pool-7d6b79ce-j6ch Ready 3h

创建新的节点池

要创建名为 pool-two 的新节点池,请运行以下命令:
gcloud container node-pools create pool-two

注意:请记住此自定义命令,以便新节点池与旧池相同。 如果需要,还可以使用 Kubernetes Engine GUI 创建新节点池。

现在,如果您检查节点,您会注意到有三个节点具有新池名称:
$ kubectl get nodes
NAME STATUS AGE
gke-cluster-1-pool-two-9ca78aa9–5gmk Ready 1m
gke-cluster-1-pool-two-9ca78aa9–5w6w Ready 1m
gke-cluster-1-pool-two-9ca78aa9-v88c Ready 1m
gke-cluster-1-default-pool-7d6b79ce-0s6z Ready 3h
gke-cluster-1-default-pool-7d6b79ce-9kkm Ready 3h
gke-cluster-1-default-pool-7d6b79ce-j6ch Ready 3h

但是,Pod仍然在旧节点上! 让我们来迁移Pod到新节点上。

释放旧节点池

现在我们需要将工作负载迁移到新节点池。 让我们以滚动的方式一次迁移一个节点。

首先, cordon (隔离)每个旧节点。 这将阻止新的Pod安排到它们上面。
kubectl cordon <node_name>

一旦所有旧节点都被隔离,就只能将Pod调度到新节点上。 这意味着您可以开始从旧节点中删除Pod,Kubernetes会自动在新节点上调度它们。

警告:确保您的Pod由 ReplicaSet Deployment StatefulSet 或类似的东西管理。 独立Pod不会被重新调度!

运行以下命令以释放每个节点。 这将删除该节点上的所有Pod。
kubectl drain <node_name> --force

释放节点后,确保新的Pod已启动并运行,然后再转到下一个节点。

如果您在迁移过程中遇到任何问题,请取消旧池的保护,然后隔离并释放新池。 Pod会被重新调度回旧池。

删除旧节点池

一旦所有Pod安全地重新调度,就可以删除旧池了。

default-pool 替换为要删除的池。
gcloud container node-pools delete default-pool

您刚刚成功更新了所有节点!

结论

通过使用 Kubernetes Engine ,您只需点击几下即可使Kubernetes集群保持最新状态。
如果您没有使用像 Kubernetes Engine 这样的托管服务,您仍然可以将滚动更新或节点池方法用在您自己的集群升级上。 不同之处在于您需要手动将新节点添加到集群中,并自行执行主升级,这可能很棘手。
我强烈建议使用 Kubernetes Engine regional 集群来实现高可用Master和自动节点升级,以获得无烦恼的升级体验。 如果您需要对节点更新进行额外控制,则使用节点池可以为您提供该控制,而不会放弃 Kubernetes Engine 为您提供的托管Kubernetes平台的优势。

到这里,我们要结束关于Kubernetes最佳实践的系列文章的第一季了。 如果您对希望我解决的其他主题有所了解,可以在Twitter上找到我。

本文转自DockOne-Kubernetes最佳实践S01E07:零停机更新Kubernetes集群

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
3月前
|
Kubernetes 监控 开发者
掌握容器化:Docker与Kubernetes的最佳实践
【10月更文挑战第26天】本文深入探讨了Docker和Kubernetes的最佳实践,涵盖Dockerfile优化、数据卷管理、网络配置、Pod设计、服务发现与负载均衡、声明式更新等内容。同时介绍了容器化现有应用、自动化部署、监控与日志等开发技巧,以及Docker Compose和Helm等实用工具。旨在帮助开发者提高开发效率和系统稳定性,构建现代、高效、可扩展的应用。
|
1月前
|
缓存 容灾 网络协议
ACK One多集群网关:实现高效容灾方案
ACK One多集群网关可以帮助您快速构建同城跨AZ多活容灾系统、混合云同城跨AZ多活容灾系统,以及异地容灾系统。
|
2月前
|
Kubernetes Ubuntu 网络安全
ubuntu使用kubeadm搭建k8s集群
通过以上步骤,您可以在 Ubuntu 系统上使用 kubeadm 成功搭建一个 Kubernetes 集群。本文详细介绍了从环境准备、安装 Kubernetes 组件、初始化集群到管理和使用集群的完整过程,希望对您有所帮助。在实际应用中,您可以根据具体需求调整配置,进一步优化集群性能和安全性。
148 12
|
2月前
|
Prometheus Kubernetes 监控
OpenAI故障复盘 - 阿里云容器服务与可观测产品如何保障大规模K8s集群稳定性
聚焦近日OpenAI的大规模K8s集群故障,介绍阿里云容器服务与可观测团队在大规模K8s场景下我们的建设与沉淀。以及分享对类似故障问题的应对方案:包括在K8s和Prometheus的高可用架构设计方面、事前事后的稳定性保障体系方面。
|
1月前
|
人工智能 运维 监控
容器服务Kubernetes场景下可观测体系生产级最佳实践
阿里云容器服务团队在2024年继续蝉联Gartner亚洲唯一全球领导者象限,其可观测体系是运维的核心能力之一。该体系涵盖重保运维、大规模集群稳定性、业务异常诊断等场景,特别是在AI和GPU场景下提供了全面的观测解决方案。通过Tracing、Metric和Log等技术,阿里云增强了对容器网络、存储及多集群架构的监控能力,帮助客户实现高效运维和成本优化。未来,结合AI助手,将进一步提升问题定位和解决效率,缩短MTTR,助力构建智能运维体系。
|
2月前
|
Kubernetes 网络协议 应用服务中间件
Kubernetes Ingress:灵活的集群外部网络访问的利器
《Kubernetes Ingress:集群外部访问的利器-打造灵活的集群网络》介绍了如何通过Ingress实现Kubernetes集群的外部访问。前提条件是已拥有Kubernetes集群并安装了kubectl工具。文章详细讲解了Ingress的基本组成(Ingress Controller和资源对象),选择合适的版本,以及具体的安装步骤,如下载配置文件、部署Nginx Ingress Controller等。此外,还提供了常见问题的解决方案,例如镜像下载失败的应对措施。最后,通过部署示例应用展示了Ingress的实际使用方法。
87 2
|
2月前
|
Kubernetes 算法 调度
阿里云 ACK FinOps成本优化最佳实践
本文源自2024云栖大会梁成昊演讲,讨论了成本优化策略的选择与实施。文章首先介绍了成本优化的基本思路,包括优化购买方式、调整资源配置等基础策略,以及使用弹性、资源混部等高级策略。接着,文章详细探讨了集群优化和应用优化的具体方法,如使用抢占式实例降低成本、通过资源画像识别并优化资源配置,以及利用智能应用弹性策略提高资源利用效率。
|
2月前
|
Kubernetes 容灾 调度
阿里云 ACK 高可用稳定性最佳实践
本文整理自2024云栖大会刘佳旭的演讲,主题为《ACK高可用稳定性最佳实践》。文章探讨了云原生高可用架构的重要性,通过Kubernetes的高可用案例分析,介绍了ACK在单集群高可用架构设计、产品能力和最佳实践方面的方法,包括控制面和数据面的高可用策略、工作负载高可用配置、企业版容器镜像服务高可用配置等内容,旨在帮助企业构建更加可靠和高效的应用运行环境。
|
2月前
|
存储 Kubernetes 关系型数据库
阿里云ACK备份中心,K8s集群业务应用数据的一站式灾备方案
本文源自2024云栖大会苏雅诗的演讲,探讨了K8s集群业务为何需要灾备及其重要性。文中强调了集群与业务高可用配置对稳定性的重要性,并指出人为误操作等风险,建议实施周期性和特定情况下的灾备措施。针对容器化业务,提出了灾备的新特性与需求,包括工作负载为核心、云资源信息的备份,以及有状态应用的数据保护。介绍了ACK推出的备份中心解决方案,支持命名空间、标签、资源类型等维度的备份,并具备存储卷数据保护功能,能够满足GitOps流程企业的特定需求。此外,还详细描述了备份中心的使用流程、控制台展示、灾备难点及解决方案等内容,展示了备份中心如何有效应对K8s集群资源和存储卷数据的灾备挑战。
|
3月前
|
存储 运维 Kubernetes
K8s业务迁移最佳实践: 灵活管理资源备份与调整策略,实现高效简便的应用恢复
在当今快速变化的云原生领域,Kubernetes(K8s)集群的运维面临着诸多挑战,其中灾备与业务迁移尤为关键。ACK备份中心支持丰富的资源调整策略,在数据恢复阶段即可自动适配目标集群环境,确保业务无缝重启。

热门文章

最新文章