升级前须知
升级前,您可以在CCE控制台确认您的集群是否可以进行升级操作。确认方法请参见升级集群的流程和方法。
注意事项
升级集群前,您需要知晓以下事项:
- 请务必慎重并选择合适的时间段进行升级,以减少升级对您的业务带来的影响。
- 集群升级前,请参考Kubernetes版本发布说明了解每个集群版本发布的特性以及差异,否则可能因为应用不兼容新集群版本而导致升级后异常。例如,您需要检查集群中是否使用了目标版本废弃的API,否则可能导致升级后调用接口失败,详情请参见废弃API说明。
集群升级时,以下几点注意事项可能会对您的业务存在影响,请您关注:
- 集群升级过程中,不建议对集群进行任何操作。尤其是关机、重启或删除节点等操作,都会导致升级失败。
- 集群升级前,请确认集群中未执行高危操作,否则可能导致集群升级失败或升级后配置丢失。例如,常见的高危操作有本地修改集群节点的配置、通过ELB控制台修改CCE管理的监听器配置等。建议您通过CCE控制台修改相关配置,以便在升级时自动继承。
- 集群升级过程中,已运行工作负载业务不会中断,但API Server访问会短暂中断,如果业务需要访问API Server可能会受到影响。
- 集群升级过程中默认不限制应用调度。但下列旧版本集群升级过程中,仍然会给节点打上“node.kubernetes.io/upgrade”(效果为“NoSchedule”)的污点,并在集群升级完成后移除该污点。
- 所有v1.15集群
- 所有v1.17集群
- 补丁版本小于等于v1.19.16-r4的1.19集群
- 补丁版本小于等于v1.21.7-r0的1.21集群
- 补丁版本小于等于v1.23.5-r0的1.23集群
约束与限制
- 集群升级出现异常时,集群可通过备份数据进行回滚。若您在升级成功之后对集群进行了其它操作(例如变更集群规格),将无法再通过备份数据回滚。
- 集群升级至v1.21.10-r0、v1.23.8-r0、v1.25.3-r0及之后的版本时,集群中若安装以下插件,需升级至对应版本,详情请参见容器引擎和Kubelet共享磁盘空间说明。
- npd插件:需升级至1.18.10及以上版本
- log-agent插件:需升级至1.3.0及以上版本
- 容器隧道网络集群升级至1.19.16-r4、1.21.7-r0、1.23.5-r0、1.25.1-r0及之后的版本时,会移除匹配目的地址是容器网段且源地址非容器网段的SNAT规则;如果您之前通过配置VPC路由实现集群外直接访问所有的Pod IP,升级后只支持直接访问对应节点上的Pod IP。
- NGINX Ingress控制器插件新版本(参见版本记录)配置优雅退出和ELB删除后端控制器宽限时间,支持无损升级。以下插件版本升级过程可能会出现服务短暂不可用,若集群中已安装下列版本的插件,请选择业务低峰期进行升级,具体版本如下:
插件版本
小版本范围
2.1.x
x < 32
2.2.x
x < 41
2.4.x
x < 4
- 集群升级场景涉及NetworkManager重启,触发DHCP Client主动续租,默认情况下将根据子网DNS配置刷新/etc/resolv.conf,建议您通过VPC控制台修改DNS,详情请参见怎样修改云服务器的DNS服务器地址?。
- 更多版本升级约束请查看版本差异说明。
版本差异说明
版本升级路径 |
版本差异 |
建议自检措施 |
---|---|---|
v1.23/v1.25 升级至v1.27 |
容器运行时Docker不再被推荐使用,建议您使用Containerd进行替换,详情请参见容器引擎说明。 |
已纳入升级前检查。 |
v1.21/v1.19 升级至v1.23 |
社区较老版本的Nginx Ingress Controller来说(社区版本v0.49及以下,对应CCE插件版本v1.x.x),在创建Ingress时没有指定Ingress类别为nginx,即annotations中未添加kubernetes.io/ingress.class: nginx的情况,也可以被Nginx Ingress Controller纳管。但对于较新版本的Nginx Ingress Controller来说(社区版本v1.0.0及以上,对应CCE插件版本2.x.x),如果在创建Ingress时没有显示指定Ingress类别为nginx,该资源将被Nginx Ingress Controller忽略,Ingress规则失效,导致服务中断。 |
已纳入升级前检查,也可参照nginx-ingress插件升级检查进行自检。 |
v1.19升级至v1.21 |
Kubernetes v1.21集群版本修复 了exec probe timeouts不生效的BUG,在此修复之前,exec 探测器不考虑 timeoutSeconds 字段。相反,探测将无限期运行,甚至超过其配置的截止日期,直到返回结果。 若用户未配置,默认值为1秒。升级后此字段生效,如果探测时间超过1秒,可能会导致应用健康检查失败并频繁重启。 |
升级前检查您使用了exec probe的应用的probe timeouts是否合理。 |
CCE的v1.19及以上版本的kube-apiserver要求客户侧webhook server的证书必须配置Subject Alternative Names (SAN)字段。否则升级后kube-apiserver调用webhook server失败,容器无法正常启动。 根因:Go语言v1.15版本废弃了X.509 CommonName,CCE的v1.19版本的kube-apiserver编译的版本为v1.15,若客户的webhook证书没有Subject Alternative Names (SAN),kube-apiserver不再默认将X509证书的CommonName字段作为hostname处理,最终导致认证失败。 |
升级前检查您自建webhook server的证书是否配置了SAN字段。
|
|
v1.15升级至v1.19 |
CCE v1.19版本的控制面与v1.15版本的Kubelet存在兼容性问题。若Master节点升级成功后,节点升级失败或待升级节点发生重启,则节点有极大概率为NotReady状态。 主要原因为升级失败的节点有大概率重启kubelet而触发节点注册流程,v1.15 kubelet默认注册标签(failure-domain.beta.kubernetes.io/is-baremetal和kubernetes.io/availablezone)被v1.19版本kube-apiserver视为非法标签。 v1.19版本中对应的合法标签为node.kubernetes.io/baremetal和failure-domain.beta.kubernetes.io/zone。 |
|
CCE的v1.15版本集群及v1.19版本集群将docker的存储驱动文件系统由 xfs切换成ext4,可能会导致升级后的java应用Pod内的import包顺序异常,继而导致Pod异常。 |
升级前查看节点上docker配置文件/etc/docker/daemon.json。检查dm.fs配置项是否为xfs。
{
"storage-driver": "devicemapper",
"storage-opts": [
"dm.thinpooldev=/dev/mapper/vgpaas-thinpool",
"dm.use_deferred_removal=true",
"dm.fs=xfs",
"dm.use_deferred_deletion=true"
]
} |
|
CCE的v1.19及以上版本的kube-apiserver要求客户侧webhook server的证书必须配置Subject Alternative Names (SAN)字段。否则升级后kube-apiserver调用webhook server失败,容器无法正常启动。 根因:Go语言v1.15版本废弃了X.509 CommonName,CCE的v1.19版本的kube-apiserver编译的版本为v1.15。CommonName字段作为hostname处理,最终导致认证失败。 |
升级前检查您自建webhook server的证书是否配置了SAN字段。
须知:
为减弱此版本差异对集群升级的影响,v1.15升级至v1.19时,CCE会进行特殊处理,仍然会兼容支持证书不带SAN。但后续升级不再特殊处理,请尽快整改证书,以避免影响后续升级。 |
|
v1.17.17版本及以后的集群CCE自动给用户创建了PSP规则,限制了不安全配置的Pod的创建,如securityContext配置了sysctl的net.core.somaxconn的Pod。 |
升级后请参考资料按需开放非安全系统配置,具体请参见PodSecurityPolicy配置。 |
|
1.15版本集群原地升级,如果业务中存在initContainer或使用Istio的场景,则需要注意以下约束: 1.16及以上的kubelet统计QosClass和之前版本存在差异,1.15及以下版本仅统计spec.containers下的容器,1.16及以上的kubelet版本会同时统计spec.containers和spec.initContainers下的容器,升级前后会造成Pod的QosClass变化,从而造成Pod中容器重启。 |
建议参考表1在升级前修改业务容器的QosClass规避该问题。 |
|
v1.13升级至v1.15 |
vpc集群升级后,由于网络组件的升级,master节点会额外占一个网段。在Master占用了网段后,无可用容器网段时,新建节点无法分配到网段,调度在该节点的pod会无法运行。 |
一般集群内节点数量快占满容器网段场景下会出现该问题。例如,容器网段为10.0.0.0/16,可用IP数量为65536,VPC网络IP分配是分配固定大小的网段(使用掩码实现,确定每个节点最多分配多少容器IP),例如上限为128,则此时集群最多支持65536/128=512个节点,然后去掉Master节点数量为509,此时是1.13集群支持的节点数。集群升级后,在此基础上3台Master节点会各占用1个网段,最终结果就是506台节点。 |
init容器(根据spec.initContainers计算) |
业务容器(根据spec.containers计算) |
Pod(根据spec.containers和spec.initContainers计算) |
是否受影响 |
---|---|---|---|
Guaranteed |
Besteffort |
Burstable |
是 |
Guaranteed |
Burstable |
Burstable |
否 |
Guaranteed |
Guaranteed |
Guaranteed |
否 |
Besteffort |
Besteffort |
Besteffort |
否 |
Besteffort |
Burstable |
Burstable |
否 |
Besteffort |
Guaranteed |
Burstable |
是 |
Burstable |
Besteffort |
Burstable |
是 |
Burstable |
Burstable |
Burstable |
否 |
Burstable |
Guaranteed |
Burstable |
是 |
废弃API说明
随着Kubernetes API的演化,API会周期性地被重组或升级,部分API会被弃用并被最终删除。以下为各Kubernetes社区版本中被废弃的API,更多已废弃的API说明请参见已弃用 API 的迁移指南。
- Kubernetes社区v1.29版本中废弃的API
- Kubernetes社区v1.28版本中无废弃的API
- Kubernetes社区v1.27版本中废弃的API
- Kubernetes社区v1.25版本中废弃的API
- Kubernetes社区v1.22版本中废弃的API
- Kubernetes社区v1.16版本中废弃的API
当某API被废弃时,已经创建的资源对象不受影响,但新建或编辑该资源时将出现API版本被拦截的情况。
资源名称 |
废弃API版本 |
替代API版本 |
变更说明 |
---|---|---|---|
FlowSchema 和 PriorityLevelConfiguration |
flowcontrol.apiserver.k8s.io/v1beta2 |
flowcontrol.apiserver.k8s.io/v1 (该API从社区v1.29版本开始可用) flowcontrol.apiserver.k8s.io/v1beta3 (该API从社区v1.26版本开始可用) |
|
资源名称 |
废弃API版本 |
替代API版本 |
变更说明 |
---|---|---|---|
CSIStorageCapacity |
storage.k8s.io/v1beta1 |
storage.k8s.io/v1 (该API从社区v1.24版本开始可用) |
- |
FlowSchema 和 PriorityLevelConfiguration |
flowcontrol.apiserver.k8s.io/v1beta1 |
flowcontrol.apiserver.k8s.io/v1beta3 (该API从社区v1.26版本开始可用) |
- |
HorizontalPodAutoscaler |
autoscaling/v2beta2 |
autoscaling/v2 (该API从社区v1.23版本开始可用) |
- |
资源名称 |
废弃API版本 |
替代API版本 |
变更说明 |
---|---|---|---|
CronJob |
batch/v1beta1 |
batch/v1 (该API从社区v1.21版本开始可用) |
- |
EndpointSlice |
discovery.k8s.io/v1beta1 |
discovery.k8s.io/v1 (该API从社区v1.21版本开始可用) |
此次更新需注意以下变更:
|
Event |
events.k8s.io/v1beta1 |
events.k8s.io/v1 (该API从社区v1.19版本开始可用) |
此次更新需注意以下变更:
|
HorizontalPodAutoscaler |
autoscaling/v2beta1 |
autoscaling/v2 (该API从社区v1.23版本开始可用) |
- |
PodDisruptionBudget |
policy/v1beta1 |
policy/v1 (该API从社区v1.21版本开始可用) |
在 policy/v1 版本的 PodDisruptionBudget 中将 spec.selector 设置为空({})时会选择名字空间中的所有 Pod(在 policy/v1beta1 版本中,空的 spec.selector 不会选择任何 Pod)。如果 spec.selector 未设置,则在两个 API 版本下都不会选择任何 Pod。 |
PodSecurityPolicy |
policy/v1beta1 |
- |
从社区v1.25版本开始,PodSecurityPolicy资源不再提供policy/v1beta1版本的API,并且PodSecurityPolicy准入控制器也会被删除。 请使用Pod Security Admission配置替代。 |
RuntimeClass |
node.k8s.io/v1beta1 |
node.k8s.io/v1(该API从社区v1.20版本开始可用) |
- |
资源名称 |
废弃API版本 |
替代API版本 |
变更说明 |
---|---|---|---|
MutatingWebhookConfiguration ValidatingWebhookConfiguration |
admissionregistration.k8s.io/v1beta1 |
admissionregistration.k8s.io/v1 (该API从社区v1.16版本开始可用) |
|
CustomResourceDefinition |
apiextensions.k8s.io/v1beta1 |
apiextensions/v1 (该API从社区v1.16版本开始可用) |
|
APIService |
apiregistration/v1beta1 |
apiregistration.k8s.io/v1 (该API从社区v1.10版本开始可用) |
- |
TokenReview |
authentication.k8s.io/v1beta1 |
authentication.k8s.io/v1 (该API从社区v1.6版本开始可用) |
- |
LocalSubjectAccessReview SelfSubjectAccessReview SubjectAccessReview SelfSubjectRulesReview |
authorization.k8s.io/v1beta1 |
authorization.k8s.io/v1 (该API从社区v1.16版本开始可用) |
spec.group 在 v1 版本中被更名为 spec.groups(补丁 #32709) |
CertificateSigningRequest |
certificates.k8s.io/v1beta1 |
certificates.k8s.io/v1 (该API从社区v1.19版本开始可用) |
certificates.k8s.io/v1 中需要额外注意的变更:
|
Lease |
coordination.k8s.io/v1beta1 |
coordination.k8s.io/v1 (该API从社区v1.14版本开始可用) |
- |
Ingress |
networking.k8s.io/v1beta1 extensions/v1beta1 |
networking.k8s.io/v1 (该API从社区v1.19版本开始可用) |
|
IngressClass |
networking.k8s.io/v1beta1 |
networking.k8s.io/v1 (该API从社区v1.19版本开始可用) |
- |
ClusterRole ClusterRoleBinding Role RoleBinding |
rbac.authorization.k8s.io/v1beta1 |
rbac.authorization.k8s.io/v1 (该API从社区v1.8版本开始可用) |
- |
PriorityClass |
scheduling.k8s.io/v1beta1 |
scheduling.k8s.io/v1 (该API从社区v1.14版本开始可用) |
- |
CSIDriver CSINode StorageClass VolumeAttachment |
storage.k8s.io/v1beta1 |
storage.k8s.io/v1 |
|
资源名称 |
废弃API版本 |
替代API版本 |
变更说明 |
---|---|---|---|
NetworkPolicy |
extensions/v1beta1 |
networking.k8s.io/v1 (该API从社区v1.8版本开始可用) |
- |
DaemonSet |
extensions/v1beta1 apps/v1beta2 |
apps/v1 (该API从社区v1.9版本开始可用) |
|
Deployment |
extensions/v1beta1 apps/v1beta1 apps/v1beta2 |
apps/v1 (该API从社区v1.9版本开始可用) |
|
StatefulSet |
apps/v1beta1 apps/v1beta2 |
apps/v1 (该API从社区v1.9版本开始可用) |
|
ReplicaSet |
extensions/v1beta1 apps/v1beta1 apps/v1beta2 |
apps/v1 (该API从社区v1.9版本开始可用) |
spec.selector 现在变成必需字段,并且在对象创建之后不可变更; 可以将现有模板的标签作为选择算符以实现无缝迁移。 |
PodSecurityPolicy |
extensions/v1beta1 |
policy/v1beta1 (该API从社区v1.10版本开始可用) |
policy/v1beta1 API 版本的 PodSecurityPolicy 会在 v1.25 版本中移除。 |
升级备份说明
目前集群升级备份方式如下:
备份方式 |
备份对象 |
备份方式 |
备份时间 |
回滚时间 |
说明 |
---|---|---|---|---|---|
etcd数据备份 |
etcd数据 |
升级流程中自动备份 |
1-5min |
2h |
必选备份,升级过程中自动进行,用户无需关注 |
CBR整机备份 |
Master节点磁盘,包括组件镜像、配置、日志以及etcd数据 |
通过页面一键备份(手动触发) |
20min-2h(受当前区域云备份任务排队情况影响) |
20min |
该功能逐步由EVS快照备份替代 |
EVS快照备份 |
Master节点磁盘,包括组件镜像、配置、日志以及etcd数据 |
通过页面一键备份(手动触发) |
1-5min |
20min |
该功能上线中 对于已上线的区域,EVS快照备份将替代CBR整机备份 |