
# 兼容性风险检查异常处理
#### 检查项内容
请您阅读版本兼容性差异，并确认不受影响。补丁升级不涉及版本兼容性差异。
#### 版本兼容性差异
| 版本升级路径                                                                                                          | 版本差异                                                                                                                                                                                                                                                                                                                                                                                                                               | 建议自检措施                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
|:---|:---|:---|
| 所有升级路径                                                                                                          | 请关注Kubernetes API变更，详情请参见[废弃API说明](https://support.huaweicloud.com/usermanual-cce/cce_10_0302.html#cce_10_0302__section1143094820148)。                                                                                                                                                                                                                                                                                             | 检查集群中已使用的API版本，避免使用已废弃的API版本或修改为[废弃API说明](https://support.huaweicloud.com/usermanual-cce/cce_10_0302.html#cce_10_0302__section1143094820148)中建议替换的API版本。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| v1.28升级至v1.29、v1.31                                                                                             | Kubernetes v1.29中更改kube-proxy启动的行为，允许kube-proxy设置低于节点sysctl设置的参数值。如节点nf_conntrack_max内核参数值设置为1000000，而kube-proxy计算的值为131072，那么此内核参数会使用kube-proxy计算的值131072。社区PR链接为：<https://github.com/kubernetes/kubernetes/pull/120448>                                                                                                                                                                                                          | 产生大量链接的节点例如网关节点极可能遇到该问题。请务必确认nf_conntrack_max是否曾使用sysctl修改为较大值（例如4294967295或1000000），该参数在节点升级后会以kube-proxy计算的值为准，被刷新覆盖为一个较小值（10w+或20w+），影响业务高峰期流量。 请使用节点池kube-proxy组件配置conntrack-min替代直接修改OS内核参数nf_conntrack_max，参考[节点池配置管理](https://support.huaweicloud.com/usermanual-cce/cce_10_0652.html)。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| v1.23/v1.25 升级至v1.27                                                    | 容器运行时Docker不再被推荐使用，建议您使用Containerd进行替换，详情请参见[容器运行时说明](https://support.huaweicloud.com/usermanual-cce/cce_10_0462.html)。                                                                                                                                                                                                                                                                                                            | 已纳入升级前检查。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| v1.23升级至v1.25                                                                                                   | 在Kubernetes v1.25版本中， PodSecurityPolicy已被移除，并提供Pod安全性准入控制器（[Pod Security Admission配置](https://support.huaweicloud.com/usermanual-cce/cce_10_0466.html)）作为PodSecurityPolicy的替代。                                                                                                                                                                                                                                                     | - 如果您需要将PodSecurityPolicy的相关能力迁移到Pod Security Admission中，需要参照以下步骤进行： 1. 确认集群为CCE v1.23的最新版本。  2. 迁移PodSecurityPolicy的相关能力迁移到Pod Security Admission，请参见[Pod Security Admission配置](https://support.huaweicloud.com/usermanual-cce/cce_10_0466.html)。  3. 确认迁移后功能正常，再升级为CCE v1.25版本。    - 如果您不再使用PodSecurityPolicy能力，则可以在删除集群中的PodSecurityPolicy后，直接升级为CCE v1.25版本。   |
| 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控制器插件升级检查](https://support.huaweicloud.com/usermanual-cce/cce_10_0508.html)进行自检。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| v1.19升级至v1.21                                                                                                   | Kubernetes v1.21集群版本修复了exec probe timeouts不生效的BUG，在此修复之前，exec 探测器不考虑 timeoutSeconds 字段。相反，探测将无限期运行，甚至超过其配置的截止日期，直到返回结果。 若用户未配置，默认值为1秒。升级后此字段生效，如果探测时间超过1秒，可能会导致应用健康检查失败并频繁重启。                                                                                                                                                                                                                                                      | 升级前检查您使用了exec probe的应用的probe timeouts是否合理。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| v1.19升级至v1.21                                                                                                   | CCE的v1.19及以上版本的kube-apiserver要求客户侧webhook server的证书必须配置Subject Alternative Names (SAN)字段。否则升级后kube-apiserver调用webhook server失败，容器无法正常启动。 根因：Go语言v1.15版本废弃了X.509 [CommonName](https://golang.google.cn/doc/go1.15#commonname)，CCE的v1.19版本的kube-apiserver编译的版本为v1.15，若客户的webhook证书没有Subject Alternative Names (SAN)，kube-apiserver不再默认将X509证书的CommonName字段作为hostname处理，最终导致认证失败。          | 升级前检查您自建webhook server的证书是否配置了SAN字段。 - 若无自建webhook server则不涉及。  - 若未配置，建议您配置使用SAN字段指定证书支持的IP及域名。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| v1.15升级至v1.19                                                                                                   | CCE v1.19版本的控制面与v1.15版本的Kubelet存在兼容性问题。若控制节点升级成功后，节点升级失败或待升级节点发生重启，则节点有极大概率为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。 | 1. 正常升级流程不会触发此场景。  2. 在控制节点升级完成后尽量避免使用暂停升级功能，快速升级完Node节点。  3. 若Node节点升级失败且无法修复，请尽快驱逐此节点上的应用，请联系技术支持人员，跳过此节点升级，在整体升级完毕后，重置该节点。                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| v1.15升级至v1.19                                                                                                   | CCE的v1.15版本集群及v1.19版本集群将docker的存储驱动文件系统由 xfs切换成ext4，可能会导致升级后的java应用Pod内的import包顺序异常，继而导致Pod异常。                                                                                                                                                                                                                                                                                                                                     | 升级前查看节点上docker配置文件/etc/docker/daemon.json。检查dm.fs配置项是否为xfs。 - 若为ext4或存储驱动为overlay则不涉及。  - 若为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" ] } ```                                                                                                                                                                                                                                                                                             |
| v1.15升级至v1.19                                                                                                   | CCE的v1.19及以上版本的kube-apiserver要求客户侧webhook server的证书必须配置Subject Alternative Names (SAN)字段。否则升级后kube-apiserver调用webhook server失败，容器无法正常启动。 根因：Go语言v1.15版本废弃了X.509 [CommonName](https://golang.google.cn/doc/go1.15#commonname)，CCE的v1.19版本的kube-apiserver编译的版本为v1.15。CommonName字段作为hostname处理，最终导致认证失败。                                                                                     | 升级前检查您自建webhook server的证书是否配置了SAN字段。 - 若无自建webhook server则不涉及。  - 若未配置，建议您配置使用SAN字段指定证书支持的IP及域名。   须知： 为减弱此版本差异对集群升级的影响，v1.15升级至v1.19时，CCE会进行特殊处理，仍然会兼容支持证书不带SAN。但后续升级不再特殊处理，请尽快整改证书，以避免影响后续升级。                                                                                                                                                                                                                                                                                                                                                                                        |
| v1.15升级至v1.19                                                                                                   | v1.17.17版本及以后的集群CCE自动给用户创建了PSP规则，限制了不安全配置的Pod的创建，如securityContext配置了sysctl的net.core.somaxconn的Pod。                                                                                                                                                                                                                                                                                                                                 | 升级后请参考资料按需开放非安全系统配置，具体请参见[PodSecurityPolicy配置](https://support.huaweicloud.com/usermanual-cce/cce_10_0275.html)。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| v1.15升级至v1.19                                                                                                   | 1.15版本集群原地升级，如果业务中存在initContainer或使用Istio的场景，则需要注意以下约束： 1.16及以上的kubelet统计[QosClass](https://kubernetes.io/zh/docs/tasks/configure-pod-container/quality-service-pod/)和之前版本存在差异，1.15及以下版本仅统计spec.containers下的容器，1.16及以上的kubelet版本会同时统计spec.containers和spec.initContainers下的容器，升级前后会造成Pod的QosClass变化，从而造成Pod中容器重启。                                                                         | 建议参考[表1](https://support.huaweicloud.com/usermanual-cce/cce_10_0302.html#cce_10_0302__table10713231143911)在升级前修改业务容器的QosClass规避该问题。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
   
表11.15版本升级前后QosClass变化 
| 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                                    | 是     |
   
