升级集群Kubernetes版本时,请在控制面升级后及时在业务低峰期完成节点池的升级。节点池升级包括kubelet升级和容器运行时升级。执行升级操作前,ACK会提供前置检查,识别并提示可能影响升级的风险因素,以便实现平滑升级。
注意事项
节点伸缩
若集群启用了节点伸缩功能,为保证自动伸缩功能不受影响,集群在升级成功后会自动更新cluster-autoscaler组件至最新版本。集群升级后,请确认cluster-autoscaler组件版本是否正常。更多信息,请参见启用节点自动伸缩。
集群升级期间,伸缩模式为极速模式的节点可能会因节点关机而无法完成升级。如果升级结束后存在节点因极速模式未被升级,建议手动移除该节点。
升级集群至1.18版本后,ACK会默认配置节点资源预留。如果集群未配置资源预留且节点水位较高,升级后存在Pod驱逐后无法被快速调度的风险。请为节点预留部分资源,推荐CPU使用率不超过50%,内存使用率不超过70%。更多信息,请参见节点资源预留策略。
在1.24及以下版本的集群中,如果工作负载的Pod只配置了启动探针(Startup Probe),Pod会在kubelet重启后出现短暂的NotReady现象。建议您采用多副本部署策略,将工作负载分散在多个节点上,以确保在某个节点重启期间仍有足够的可用Pod。
如果某个Pod通过
LoadBalancer
类型的Service的SLB地址访问同一节点上的另一个Pod,并且该Service的externalTrafficPolicy
设置为Local
,那么在节点轮转后,两个Pod可能不再位于同一个节点上,继而导致网络不通。自定义操作系统镜像非ACK官方严格验证。ACK无法完全保证升级成功。
集群升级需要使用yum下载升级所需的软件包。如果您的集群曾自行修改节点的网络配置或者使用了自定义的操作系统镜像,需确保节点的yum能正常使用。您可以执行
yum makecache
进行检查。如果您对集群有过配置更改,例如打开了SWAP分区、曾通过黑屏操作修改kubelet配置或运行时配置等,集群升级过程有可能失败,或自定义配置可能会被覆盖。
通过替盘方式升级节点时,ACK会进行节点排水操作,遵循Pod Disruption Budget(PDB)的前提下将节点上的Pod驱逐至其他可用节点。为确保服务高可用性,建议您采用多副本部署策略,将工作负载分散在多个节点上,同时为关键业务配置PDB,控制同时中断的Pod数量。
节点排水的默认超时时间为30分钟。如果在超时时间内未能完成Pod迁移,ACK将终止本次升级以确保业务稳定性。
如果节点中的Pod引用了Hostpath,且该Hostpath指向系统盘,替盘升级后Hostpath目录中数据会丢失。
节点池升级过程中仅支持扩容操作,不支持缩容操作。
如果您的节点为游离节点,即未被节点池管理的Worker节点,需参见迁移游离节点至节点池完成迁移。
功能说明
节点池升级包括kubelet升级和容器运行时升级。
kubelet升级:将节点池内节点的kubelet升级到与控制面相同的版本。默认采取原地升级。
容器运行时升级:容器运行时发布新版本后,可升级节点的容器运行时至最新版本。
从Docker升级为containerd时,将通过替盘重置节点(替换节点系统盘)的方式升级节点池节点,升级过程将清除系统盘上的所有内容。替盘升级前,请务必备份系统盘中的重要数据。更多信息,请参见将节点容器运行时从Docker迁移到containerd。
从containerd升级至更新版本的containerd时,默认采取原地升级。节点上的
/etc/containerd/config.toml
会被替换为ACK提供的新版本。说明运行时升级过程中可能会造成Pod Prober、Lifecycle Hook失败,也可能会出现Pod原地重启情况。
操作步骤
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在节点池列表的操作列,选择目标节点池对应的更多 > Kubelet 升级。
查看待升级对象(容器运行时和/或kubelet),指定待升级节点(所有节点或部分节点),选择升级方式,并配置批量升级的策略。
升级方式:
批量升级策略:
每批次执行最多节点数:升级过程会根据设置的最大并行数依次对节点进行升级,最大可设置为10。关于升级流程说明,请参见下方参考信息:原地升级和替盘升级。
自动暂停策略:在节点升级过程中的暂停策略。
每批次间隔时间:自动暂停策略为不暂停时,选择每个升级批次之间是否需要时间间隔或间隔的时长。可选范围为5~120分钟。
单击前置检查,并在前置检查通过后按照页面提示开始升级操作。
说明如果前置检查执行失败或者存在警告项,请参见异常检查项修复方案或根据页面提示查看检查报告,进行排查和治理。
升级时,在事件轮转区域,您可以进行如下操作。
暂停:集群暂停状态为节点池升级的中间状态,建议您不要在此期间对集群进行操作,并尽快完成升级过程。处于中间状态的集群会在7日之后关闭升级过程,并清理一切升级相关的事件和日志信息。
暂停后,已完成升级的节点的kubelet和容器运行时不支持版本回退。
取消:取消升级。单击取消后,已完成升级的节点的kubelet和容器运行时不支持版本回退。
升级后,您可以在节点页面单击节点名称,在基本信息页签查看节点的kubelet版本、容器运行时版本等信息是否符合预期。
参考信息:原地升级和替盘升级
原地升级和替盘升级流程
原地升级和替盘升级的流程如下。节点池升级过程会根据设置的最大并行数,依次对节点进行升级,并行节点数最大可设置为10。每个批次的升级节点数依次为1、2、4、8……直至达到最大并行数。达到最大并行数后,每个批次都按最大并行数的节点进行升级。例如,最大并行数设置为4,那么第一批升级的节点个数为1,第二批升级的节点个数为2,第三批升级的节点个数为4,以后每批的升级节点个数均为4。
下图以最大并行数=N时为例,介绍分批次执行的流程,即每个批次的升级节点数依次为1、2、4、8……直至达到最大并行数N。
原地升级单个节点内部的升级逻辑
执行升级前置检查。如果容器有关键异常(例如无法正常服务ttrpc请求、容器内进程无法正常响应信号等),则会停止升级。
将当前容器和Pod状态保留到tmp临时目录。
将containerd、crictl及相关配置文件升级为ACK提供的新版本,重启containerd(此行为不会影响运行中的容器)。如果您之前在节点上修改过
/etc/containerd/config.toml
配置,此次升级会导致您的修改被覆盖。确保kubelet处于正常运行状态,节点就绪。
替盘升级单个节点内部的升级逻辑
执行节点排水(若节点可调度,系统会将其设置为不可调度)。
ECS关机,即停止节点。
更换系统盘,系统盘ID会变更,但是云盘类型、实例IP地址以及弹性网卡MAC地址保持不变。
重新初始化节点。
重启节点,节点就绪(同时设置节点为可调度)。
如果某节点在执行节点排水前已被设置为不可调度,那么在替盘升级完成后,该节点不会自动恢复为可调度。
常见问题
节点池升级后支持版本回退吗?
kubelet和容器运行时在版本升级后均不支持版本回退。操作系统在升级后支持版本回退,回退时需要确保原镜像仍被该节点池所支持。
升级过程中业务是否受影响?
原地升级:Pod不会重启,不会影响业务。
替盘升级:替盘升级时会对节点排水,如果Pod实现了优雅退出逻辑(Graceful shutdown and zero downtime deployments in Kubernetes),并且多副本部署在多个节点上,对业务没有影响。为了避免同一个应用的多个副本都在一个批次内进行升级,可以手动调整并行数小于Pod副本数。
每个批次升级大概需要多长时间?
原地升级:5min内
替盘升级:如果不涉及快照,一般在8min内。如果在升级时选中快照,升级会在快照结束后执行,执行时间取决于快照时间。节点池升级容忍快照40min,如果40min内快照还未结束会判定节点升级超时失败,失败的节点此时还未开始执行升级操作。如果没有在系统盘中保存业务数据,可以不选中快照,避免升级用时过久。
节点升级过程中节点数据会丢失吗?
以替换节点系统盘的方式执行节点运行时升级时,请不要在系统盘中保存重要数据或者提前做好备份工作。数据盘在升级过程中则不受影响。
节点替换系统盘后,节点的IP地址会变吗?
替换系统盘的方式中系统盘ID会变更,但是云盘类型、实例IP地址以及弹性网卡MAC地址保持不变。更多信息,请参见更换操作系统(系统盘)。
如何升级不属于任何节点池的集群节点?
在节点池功能上线前创建的老集群,会存在不属于任何节点池的游离节点。您可以将游离节点迁移到一个节点池后,对节点池进行升级。关于如何迁移游离节点至节点池,请参见迁移游离节点至节点池。
节点运行时由Docker切换为containerd后,Docker目录未被清理占用磁盘空间怎么办?
除Kubernetes集群可管理的容器、镜像、日志等文件外,Docker目录中也包含您自行创建的文件路径。如无需使用,请在运行时切换后手动删除数据盘中的Docker目录。
如何基于快照还原数据?
相关文档
您也可以启用集群自动升级功能,降低版本运维压力,请参见自动升级集群。
关于containerd的变更记录,请参见containerd运行时发布记录。
ACK托管节点池提供操作系统CVE漏洞自动修复功能,请参见操作系统CVE漏洞自动修复(推荐)。
Kubernetes 1.24将不再支持将Docker作为内置容器运行时,请将节点容器运行时从Docker迁移到containerd,请参见将节点容器运行时从Docker迁移到containerd。
Docker和containerd的命令行工具不同,关于常用命令对比,请参见Docker和containerd两种容器引擎常用命令对比。
推荐您及时更新操作系统镜像版本,请参见更换操作系统。