升级前须知
升级前,您可以在CCE控制台确认您的集群是否可以进行升级操作。确认方法请参见升级概述。
注意事项
升级集群前,您需要知晓以下事项:
- 集群升级操作不可回退,请务必慎重并选择合适的时间段进行升级,以减少升级对您的业务带来的影响。为了您的数据安全,强烈建议您先备份数据然后再升级。
- 集群升级前,请确认集群中未执行高危操作,否则可能导致集群升级失败或升级后配置丢失。例如,常见的高危操作有本地修改集群节点的配置、通过ELB控制台修改CCE管理的监听器配置等。建议您通过CCE控制台修改相关配置,以便在升级时自动继承。
- 集群升级前,请查看集群状态是否均为健康状态。
- 集群升级前,请参考Kubernetes版本发布说明了解每个集群版本发布的特性以及差异,否则可能因为应用不兼容新集群版本而导致升级后异常。例如,您需要检查集群中是否使用了目标版本废弃的API,否则可能导致升级后调用接口失败,详情请参见废弃API说明。
集群升级时,以下几点注意事项可能会对您的业务存在影响,请您关注:
- 集群升级过程中,不建议对集群进行任何操作。尤其是,请勿关机、重启或删除节点,否则会导致升级失败。
- 集群升级过程中,已运行工作负载业务不会中断,但API Server访问会短暂中断,如果业务需要访问API Server可能会受到影响。
- 集群升级过程中,将会给节点打上“node.kubernetes.io/upgrade”(效果为“NoSchedule”)的污点,并在集群升级完成后移除该污点。请您不要在节点上手动添加相同键名的污点,即使污点效果不同,也可能会在升级后被系统误删除。
约束与限制
- 当前支持虚拟机节点的CCE集群升级。
- 当集群中存在使用私有镜像的节点时,暂不支持升级。
- 集群升级后,如版本特性中修复了容器引擎Containerd相关漏洞,存量节点需要手动重启Containerd才可以生效,对于存量Pod同样需要通过重启Pod才能生效。
- 若您将节点上的docker.sock文件通过HostPath方式挂载到Pod内,即docker in docker场景,在升级过程中Docker将会重启,而容器内的sock文件不会变化,可能导致您业务异常,推荐您使用挂载目录的方式挂载sock文件。
- 容器隧道网络集群升级至1.19.16-r4、1.21.7-r0、1.23.5-r0、1.25.1-r0及之后的版本时,会移除匹配目的地址是容器网段且源地址非容器网段的SNAT规则;如果您之前通过配置VPC路由实现集群外直接访问所有的Pod IP,升级后只支持直接访问对应节点上的Pod IP。
废弃API说明
随着Kubernetes API的演化,API会周期性地被重组或升级,老的API会被弃用并被最终删除。以下为各Kubernetes社区版本中被废弃的API,更多已废弃的API说明请参见已弃用 API 的迁移指南。
当某API被废弃时,已经创建的资源对象不受影响,但新建或编辑该资源时将出现API版本被拦截的情况。
资源名称 |
废弃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 版本中移除。 |
版本差异说明
版本升级路径 |
版本差异 |
建议自检措施 |
---|---|---|
v1.23升级至v1.25 |
在Kubernetes v1.25版本中, PodSecurityPolicy已被移除,并提供Pod安全性准入控制器(Pod Security Admission配置)作为PodSecurityPolicy的替代。 |
|
v1.21升级至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.23 |
||
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中容器重启。 |
建议参考表4在升级前修改业务容器的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 |
是 |
升级备份说明
目前集群升级备份方式如下:
- 集群ETCD数据库备份:CCE服务会在集群升级流程中对etcd数据库进行备份,无需用户确认。
- Master节点整机备份:在升级界面对集群的Master节点进行整机备份,需要用户手动确认,备份过程会使用云备份服务,备份通常耗时在20分钟左右,若当前局点云备份任务排队较多时,备份时间可能同步延长,推荐用户使用进行整机备份。