零停机更新Kubernetes集群

2024-05-13 12:58

本文主要是介绍零停机更新Kubernetes集群,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

每个人都知道,保持应用程序最新以及优化安全性和性能是一种很好的做法。 Kubernetes和Docker可以更轻松地执行这些更新,因为您可以使用更新构建新容器并相对轻松地部署它。

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

在本期Kubernetes最佳实践中,让我们来看看Google Kubernetes Engine如何让您的Kubernetes集群轻松升级!
集群的两个部分:Master和Node在升级群集时,需要更新两个部分:Mater和Node。 需要首先更新Master,Node随后。 让我们看看如何使用Kubernetes Engine升级它们。
零停机更新MasterKubernetes Engine会在发布点发布时会自动升级Master,但通常不会自动升级到新版本(例如,1.7到1.8)。 准备好升级到新版本后,只需单击Kubernetes Engine控制台中的升级主按钮即可。
 

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



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

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

那么如何更新Master而不会导致停机呢?
具有Kubernetes Engine区域集群的高可用Masters虽然标准的zonal Kubernetes Engine集群只有一个Master支持它们,但您可以创建regional集群,提供多区域,高可用性的Master(注意:Kubernetes Engine区域集群最近普遍可用)。

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

 

就是这样! Kubernetes引擎自动在三个

zone中创建Node和Master,Master位于负载平衡的IP地址后面,因此Kubernetes API将在升级期间继续工作。
零停机更新Node升级节点时,您可以使用几种不同的策略。 我想关注两个:

  • 滚动更新
  • 使用节点池迁移


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

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

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

 

如果您不选择此选项,

Kubernetes Engine仪表板会在升级可用时提醒您:

 

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



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

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

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

滚动更新的完全自动化特性使其易于操作,但您对该过程的控制较少。 如果出现问题,还需要时间回滚到旧版本,因为您必须停止滚动更新然后撤消它。
使用节点池(Node Pool)迁移您可以创建新节点池,等待所有节点运行,然后一次在一个节点上迁移工作负载,而不是像滚动更新那样升级“活跃的”节点池。

我们假设我们的Kubernetes集群现在有三个VM。 您可以使用以下命令查看节点:
kubectl get nodesNAME STATUS AGEgke-cluster-1-default-pool-7d6b79ce-0s6z Ready 3hgke-cluster-1-default-pool-7d6b79ce-9kkm Ready 3hgke-cluster-1-default-pool-7d6b79ce-j6ch Ready 3h
创建新的节点池要创建名为pool-two的新节点池,请运行以下命令:
gcloud container node-pools create pool-two
注意:请记住此自定义命令,以便新节点池与旧池相同。 如果需要,还可以使用Kubernetes Engine GUI创建新节点池。

现在,如果您检查节点,您会注意到有三个节点具有新池名称:
$ kubectl get nodesNAME STATUS AGEgke-cluster-1-pool-two-9ca78aa9–5gmk Ready 1mgke-cluster-1-pool-two-9ca78aa9–5w6w Ready 1mgke-cluster-1-pool-two-9ca78aa9-v88c Ready 1mgke-cluster-1-default-pool-7d6b79ce-0s6z Ready 3hgke-cluster-1-default-pool-7d6b79ce-9kkm Ready 3hgke-cluster-1-default-pool-7d6b79ce-j6ch Ready 3h
但是,Pod仍然在旧节点上! 让我们来迁移Pod到新节点上。
释放旧节点池现在我们需要将工作负载迁移到新节点池。 让我们以滚动的方式一次迁移一个节点。

首先,cordon(隔离)每个旧节点。 这将阻止新的Pod安排到它们上面。
kubectl cordon <node_name>
一旦所有旧节点都被隔离,就只能将Pod调度到新节点上。 这意味着您可以开始从旧节点中删除Pod,Kubernetes会自动在新节点上调度它们。

警告:确保您的Pod由ReplicaSetDeploymentStatefulSet或类似的东西管理。 独立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上找到我。

这篇关于零停机更新Kubernetes集群的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/985765

相关文章

MySQL MHA集群详解(数据库高可用)

《MySQLMHA集群详解(数据库高可用)》MHA(MasterHighAvailability)是开源MySQL高可用管理工具,用于自动故障检测与转移,支持异步或半同步复制的MySQL主从架构,本... 目录mysql 高可用方案:MHA 详解与实战1. MHA 简介2. MHA 的组件组成(1)MHA

golang实现nacos获取配置和服务注册-支持集群详解

《golang实现nacos获取配置和服务注册-支持集群详解》文章介绍了如何在Go语言中使用Nacos获取配置和服务注册,支持集群初始化,客户端结构体中的IpAddresses可以配置多个地址,新客户... 目录golang nacos获取配置和服务注册-支持集群初始化客户端可选参数配置new一个客户端 支

MySQL集群高可用架构的两种使用小结

《MySQL集群高可用架构的两种使用小结》本文介绍了MySQL的两种高可用解决方案:组复制(MGR)和MasterHighAvailability(MHA),文中通过示例代码介绍的非常详细,对大家的学... 目录一、mysql高可用之组复制(MGR)1.1 组复制核心特性与优势1.2 组复制架构原理1.3

Docker + Redis 部署集群的实现步骤

《Docker+Redis部署集群的实现步骤》本文详细介绍了在三台服务器上部署高可用Redis集群的完整流程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋... 目录一、环境准备1. 服务器规划(3 台服务器)2. 防火墙配置(三台服务器均执行)3. 安装 docke

springBoot (springCloud2025)集成redisCluster 集群的操作方法

《springBoot(springCloud2025)集成redisCluster集群的操作方法》文章介绍了如何使用SpringBoot集成RedisCluster集群,并详细说明了pom.xm... 目录pom.XMLapplication.yamlcluster配置类其他配置类连接池配置类Redis

Redis中哨兵机制和集群的区别及说明

《Redis中哨兵机制和集群的区别及说明》Redis哨兵通过主从复制实现高可用,适用于中小规模数据;集群采用分布式分片,支持动态扩展,适合大规模数据,哨兵管理简单但扩展性弱,集群性能更强但架构复杂,根... 目录一、架构设计与节点角色1. 哨兵机制(Sentinel)2. 集群(Cluster)二、数据分片

MySQL 数据库表操作完全指南:创建、读取、更新与删除实战

《MySQL数据库表操作完全指南:创建、读取、更新与删除实战》本文系统讲解MySQL表的增删查改(CURD)操作,涵盖创建、更新、查询、删除及插入查询结果,也是贯穿各类项目开发全流程的基础数据交互原... 目录mysql系列前言一、Create(创建)并插入数据1.1 单行数据 + 全列插入1.2 多行数据

linux安装、更新、卸载anaconda实践

《linux安装、更新、卸载anaconda实践》Anaconda是基于conda的科学计算环境,集成1400+包及依赖,安装需下载脚本、接受协议、设置路径、配置环境变量,更新与卸载通过conda命令... 目录随意找一个目录下载安装脚本检查许可证协议,ENTER就可以安装完毕之后激活anaconda安装更

Nginx进行平滑升级的实战指南(不中断服务版本更新)

《Nginx进行平滑升级的实战指南(不中断服务版本更新)》Nginx的平滑升级(也称为热升级)是一种在不停止服务的情况下更新Nginx版本或添加模块的方法,这种升级方式确保了服务的高可用性,避免了因升... 目录一.下载并编译新版Nginx1.下载解压2.编译二.替换可执行文件,并平滑升级1.替换可执行文件

SQL Server跟踪自动统计信息更新实战指南

《SQLServer跟踪自动统计信息更新实战指南》本文详解SQLServer自动统计信息更新的跟踪方法,推荐使用扩展事件实时捕获更新操作及详细信息,同时结合系统视图快速检查统计信息状态,重点强调修... 目录SQL Server 如何跟踪自动统计信息更新:深入解析与实战指南 核心跟踪方法1️⃣ 利用系统目录