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集群

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
相关文章
|
8天前
|
运维 Kubernetes 监控
Kubernetes 集群的持续性能优化实践
【4月更文挑战第26天】 在动态且不断增长的云计算环境中,维护高性能的 Kubernetes 集群是一个挑战。本文将探讨一系列实用的策略和工具,旨在帮助运维专家监控、分析和优化 Kubernetes 集群的性能。我们将讨论资源分配的最佳实践,包括 CPU 和内存管理,以及集群规模调整的策略。此外,文中还将介绍延迟和吞吐量的重要性,并提供日志和监控工具的使用技巧,以实现持续改进的目标。
|
1天前
|
运维 监控 Kubernetes
Kubernetes 集群的监控与维护策略
【5月更文挑战第4天】 在当今微服务架构盛行的时代,容器化技术已成为软件开发和部署的标准实践。Kubernetes 作为一个开源的容器编排平台,因其强大的功能和灵活性而广受欢迎。然而,随着 Kubernetes 集群规模的扩大,集群的监控和维护变得日益复杂。本文将探讨 Kubernetes 集群监控的重要性,分析常见的监控工具,并提出一套有效的集群维护策略,以帮助运维人员确保集群的健康运行和高可用性。
16 10
|
2天前
|
存储 运维 监控
Kubernetes 集群的持续监控与优化策略
【5月更文挑战第3天】在微服务架构和容器化部署日益普及的背景下,Kubernetes 已成为众多企业的首选容器编排平台。然而,随着集群规模的增长和业务复杂度的提升,有效的集群监控和性能优化成为确保系统稳定性和提升资源利用率的关键。本文将深入探讨针对 Kubernetes 集群的监控工具选择、监控指标的重要性解读以及基于数据驱动的性能优化实践,为运维人员提供一套系统的持续监控与优化策略。
|
4天前
|
运维 Kubernetes 监控
Kubernetes 集群的监控与维护策略
【4月更文挑战第30天】 在现代云计算环境中,容器化技术已成为应用程序部署和管理的重要手段。其中,Kubernetes 作为一个开源的容器编排平台,以其强大的功能和灵活性受到广泛欢迎。然而,随之而来的是对 Kubernetes 集群监控和维护的复杂性增加。本文将探讨针对 Kubernetes 集群的监控策略和维护技巧,旨在帮助运维人员确保集群的稳定性和高效性。通过分析常见的性能瓶颈、故障诊断方法以及自动化维护工具的应用,我们将提供一套实用的解决方案,以优化 Kubernetes 环境的性能和可靠性。
|
5天前
|
运维 Kubernetes 监控
Kubernetes集群的持续性能优化策略
【4月更文挑战第30天】 在动态且不断扩展的云计算环境中,保持应用性能的稳定性是一个持续的挑战。本文将探讨针对Kubernetes集群的持续性能优化策略,旨在为运维工程师提供一套系统化的性能调优框架。通过分析集群监控数据,我们将讨论如何诊断常见问题、实施有效的资源管理和调度策略,以及采用自动化工具来简化这一过程。
|
5天前
|
Prometheus 监控 Kubernetes
Kubernetes 集群的监控与日志管理策略
【4月更文挑战第30天】 在微服务架构日益普及的当下,容器化技术与编排工具如Kubernetes成为了运维领域的重要话题。有效的监控和日志管理对于保障系统的高可用性和故障快速定位至关重要。本文将探讨在Kubernetes环境中实施监控和日志管理的最佳实践,包括选用合适的工具、部署策略以及如何整合这些工具来提供端到端的可见性。我们将重点讨论Prometheus监控解决方案和EFK(Elasticsearch, Fluentd, Kibana)日志管理堆栈,分析其在Kubernetes集群中的应用,并给出优化建议。
|
6天前
|
Kubernetes 网络协议 Python
一文教会你,如何通过kubeadm,在生产环境部署K8S高可用集群(二)
一文教会你,如何通过kubeadm,在生产环境部署K8S高可用集群(二)
|
6天前
|
Kubernetes 应用服务中间件 开发工具
一文教会你,如何通过kubeadm,在生产环境部署K8S高可用集群(一)
一文教会你,如何通过kubeadm,在生产环境部署K8S高可用集群(一)
|
9天前
|
存储 Kubernetes 监控
Kubernetes 集群的持续性能优化实践
【4月更文挑战第25天】 在动态且不断变化的云计算环境中,维护 Kubernetes 集群的高性能是一个挑战。本文将探讨一系列实用的策略和方法,用于持续监控和优化 Kubernetes 集群的性能。通过分析真实案例,我们将展示如何识别瓶颈,采取相应的优化措施,并实现自动化以简化运维工作。这些方法将帮助读者提高其 Kubernetes 环境的稳定性和效率,同时降低运营成本。
|
10天前
|
Kubernetes 应用服务中间件 nginx
【博客大赛】搭建一套完整的企业级Kubernetes高可用集群(v1.20,二进制)
【博客大赛】搭建一套完整的企业级Kubernetes高可用集群(v1.20,二进制)

推荐镜像

更多