(停止维护)ACK发布Kubernetes 1.22版本说明

阿里云容器服务Kubernetes版(ACK)严格遵循社区一致性认证。本文介绍ACK发布Kubernetes 1.22版本所做的变更说明。

版本升级说明

ACK针对Kubernetes 1.22版本提供了组件的升级和优化。

核心组件

版本号

升级注意事项

Kubernetes

1.22.15-aliyun.1

  • Kubernetes 1.22版本弃用了大量测试(Beta)版本的API,在操作集群升级之前,请注意:

    • 通过测试版本API创建的资源(集群内已经存在的资源),不受升级影响。升级后,可以使用稳定版本API进行交互。

    • 与测试版本API交互的控制器或应用,需要在集群升级前完成调整,以免集群升级后控制器或应用无法正常工作。更多信息,请参见版本解读

  • Kubernetes 1.22版本进行了大量优化。更多信息,请参见版本解读

  • Dockershim从Kubernetes 1.20版本开始废弃,计划在Kubernetes 1.24版本移除(目前仍然可用)。过渡建议如下:

    • 在集群升级到1.24之前,请通过节点池升级将节点的容器运行时Docker轮转为containerd。详细信息,请参见将节点容器运行时从Docker迁移到Containerd。如您的集群为专有版,Master节点会在集群升级时自动将Docker升级为containerd。升级时,Master节点上所有的容器将会重建。如有自定义容器需要备份,请提前备份。

    • 由于containerd Windows功能受限,若您使用的是Windows容器,建议您继续使用Docker EE。

    • 升级到1.24版本之前,请做好节点运行时的调整。更多信息,请参见版本解读

  • 在Kubernetes 1.22.10及以后的版本中,kube-proxy去除了监听NodePort的逻辑,当NodePort端口范围(即APIServer的ServiceNodePortRange参数)与内核net.ipv4.ip_local_port_range端口范围有冲突的情况下,可能会导致偶发的TCP无法连接的情况,从而导致健康检查失败、业务异常等问题。因此,升级集群版本至1.22.10或以后的版本时,请确保集群NodePort端口范围与任意节点net.ipv4.ip_local_port_range端口范围不存在冲突。关于如何配置NodePort端口范围,请参见如何正确配置NodePort范围?Kubernetes社区PR

  • 容器组安全策略(PodSecurityPolicy)从Kubernetes 1.21版本开始废弃,计划在Kubernetes 1.25版本移除,目前仍然可用。推荐使用容器组安全准入(PodSecurity)替代。更多信息,请参见版本解读

  • 升级时,Master节点上所有的容器将会重建。如有自定义容器需要备份,请提前备份。

  • 可能存在CVE-2022-3172 漏洞。关于漏洞的影响和解决措施,请参见CVE-2022-3172

  • 在Kubernetes 1.22及以后的版本中,ServiceAccount Token有效期为一年,kubelet会定期刷新Token。更多信息,参见BoundServiceAccountTokenVolume。client-go版本大于等于v11.0.0和v0.15.0时,系统会自动从磁盘重新加载新Token。但client-go版本小于v11.0.0或 v0.15.0时,系统不会自动重新加载Token,导致使用in-cluster方式访问API Server时会受到Token一年过期风险的影响。此时,请升级client-go版本。关于ServiceAccount Token过期的影响及解决方案,请参见【产品变更】升级1.22版本后ServiceAccount Token过期解决方案

etcd

3.5.1

CoreDNS

v1.9.3.6-32932850-aliyun

此次升级不会对业务造成影响,支持的新特性如下:

  • 支持EndpointSlices资源的监听。

  • 支持以IPv6地址进行DNS查询。

CRI

  • Docker CE 19.03.15

  • Docker EE(跟随Windows系统)

containerd 1.4.8

CSI

1.20.7-aafce42-aliyun

CNI

Flannel 0.15.1.4-e02c8f12-aliyun

此次升级不会对业务造成影响,支持的新特性如下:

  • 更新Authorization等资源的APIVersion,以支持Kubernetes 1.22版本。

  • 支持以HostPort方式暴露服务。

  • 支持开启Hairpin模式。

Terway

NVIDIA Container Runtime

3.7.0

Ingress Controller

1.1.0-aliyun.1

组件升级可能会造成业务的瞬断和配置兼容性问题,请您在组件升级过程中充分验证无误后,再进行集群的升级。

版本解读

资源变更和废弃

  • 【变更】MutatingWebhookConfiguration和ValidatingWebhookConfiguration资源不再支持admissionregistration.k8s.io/v1beta1 API。如果使用旧版本API创建准入或变换Webhook配置,会导致配置创建失败,进而影响Webhook服务的使用,请尽快使用admissionregistration.k8s.io/v1替代。

  • 【变更】CustomResourceDefinition资源不再支持apiextensions.k8s.io/v1beta1 API。如果使用旧版本API创建自定义资源定义,会导致定义创建失败,进而影响调和(reconcile)该自定义资源的控制器,请尽快使用apiextensions.k8s.io/v1替代。

  • 【变更】APIService资源不再支持apiregistration.k8s.io/v1beta1API。如果使用旧版本API管理Kubernetes扩展API服务,会影响Kubernetes扩展API的服务,请尽快使用apiregistration.k8s.io/v1替代。

  • 【变更】TokenReview资源不再支持authentication.k8s.io/v1beta1 API。如果使用旧版本API进行授权的验证,会导致验证失败,进而影响应用的正常工作,请尽快使用authentication.k8s.io/v1替代。

  • 【变更】SubjectAccessReview资源不再支持authorization.k8s.io/v1beta1 API。如果使用旧版本API进行授权的验证,会导致验证失败,进而影响应用的正常工作,请尽快使用authorization.k8s.io/v1替代。

  • 【变更】CertificateSigningRequest资源不再支持certificates.k8s.io/v1beta1 API。如果使用旧版本API请求签发证书,会导致签发失败,请使用certificates.k8s.io/v1替代。

  • 【变更】Lease资源不再支持coordination.k8s.io/v1beta1 API。如果使用旧版本API进行选主操作,会导致选主失败,进而影响应用的正常工作,请尽快使用coordination.k8s.io/v1替代。

  • 【变更】Ingress和IngressClass资源不再支持networking.k8s.io/v1beta1extensions/v1beta1 API。如果使用旧版本API管理Ingress,会影响应用对外暴露服务,请尽快使用networking.k8s.io/v1替代。

  • 【变更】ClusterRole、ClusterRoleBinding、Role和RoleBinding资源不再支持rbac.authorization.k8s.io/v1beta1 API。如果使用旧版本API管理RBAC资源,会影响应用的权限服务,甚至无法在集群内正常使用,请尽快使用rbac.authorization.k8s.io/v1替代。

  • 【变更】CSIDriver、CSINode、StorageClass和VolumeAttachment资源不再支持storage.k8s.io/v1beta1 API。如果使用旧版本API管理CSI资源,会影响集群内的存储服务提供,导致集群内无法正常使用CSI,请尽快使用storage.k8s.io/v1替代。

  • 【变更】PriorityClass资源不再支持scheduling.k8s.io/v1beta1 API。如果使用旧版本API管理集群内的容器组优先类型,会导致操作失败,请使用scheduling.k8s.io/v1替代。

  • 【废弃】Dockershim目前被标记为废弃,计划于1.24版本后移除。更多信息,请参见EP-2221cri-containerd

    在升级到1.24版本之前,请参考以下步骤,做好节点运行时的调整:

    • 根据容器组数量,规划好非Docker运行时的节点容量(规格、数目)。

    • 选择业务低峰期,扩容相应容量的节点。

    • 逐一对使用Docker作为运行时的节点做排水操作。每次排完一个节点,请确认业务容器组都恢复后,再继续操作下一节点的排水。

    • 待所有Docker运行时的节点都结束排水,且无业务容器组运行,再进行最后的移除。

  • 【废弃】在Kubernetes 1.22.10及以后的版本中,kube-proxy去除了监听NodePort的逻辑,当NodePort端口范围(即APIServer的ServiceNodePortRange参数)与内核net.ipv4.ip_local_port_range端口范围有冲突的情况下,可能会导致偶发的TCP无法连接的情况,从而导致健康检查失败、业务异常等问题。因此,升级集群版本至1.22.10及以后版本时,请确保集群NodePort端口范围与任意节点net.ipv4.ip_local_port_range端口范围不存在冲突。关于如何配置NodePort端口范围,请参见如何正确配置NodePort范围?Kubernetes社区PR

特性增强

  • 1.21版本后,默认开启不可修改ConfigMap和Secret (ImmutableEphemeralVolumes)特性。通过标记ConfigMap和Secret为不可修改,可以显著的降低APIServer的压力。更多信息,请参见SecretConfigMap

  • 1.21版本后,默认开启IPv4/IPv6双栈(IPv6DualStack)特性。除了在创建集群时配置正确的IPv4和IPv6无类别域间路由外,还需要集群内安装支持双栈的CNI插件。更多信息,请参见IPv4/IPv6双协议栈

  • 1.21版本后,默认开启节点优雅下线(GracefulNodeShutdown)特性。该特性目前仅支持Linux节点,在Kubelet感知节点将要(主动进入)停止并且在特定的停止周期(Shutdown Period)内完成对Pod的下线。更多信息,请参见节点

  • 1.21版本后,默认开启快速恢复监听缓存(EfficientWatchResumption)的特性。在APIServer发生重启后,将更高效的恢复监听型的缓存,更好的支持大规模的集群。更多信息,请参见KEP-1904

  • 1.22版本后,默认开启CSI存储容量(CSIStorageCapacity)特性。基于该特性,调度器(Kube Scheduler) 可以比较卷(Volume)的大小和节点上的存储容量,有助于更快的调度使用对应卷的容器组。更多信息,请参见存储容量

  • 1.22版本后,默认开启可配置守护进程集的滚动更新峰值(DaemonSetUpdateSurge)特性。对支持滚动更新的守护进程集进行滚动更新时,可以声明.spec.strategy.rollingUpdate.maxSurge来指定更新过程的最大更新峰值。更多信息,请参见Perform a Rolling Update on a DaemonSet

  • 1.22版本后,默认开启并行任务支持索引(IndexedJob)特性。在任务(Job)中声明.spec.completionModeIndexed,即可在运行的容器组(Pod)的中得到一个新注解(Annotation)batch.kubernetes.io/job-completion-index,同时容器会被注入一个新的环境变量(Environment Variable)JOB_COMPLETION_INDEX。更多信息,请参见Kubernetes

  • 1.22版本后,默认开启内存管理(MemoryManager)特性。目前该特性仅适用于Linux节点,实现NUMA感知的内存管理,对有内存使用质量保证要求的应用,能带来显著的使用性能提高。ACK 暂不配置任何和该特性相关的内存预留值。更多信息,请参见运行时的内存映射使用NUMA感知内存管理器

  • 1.22版本后,默认开启容器组亲和性配置命名空间选择器(PodAffinityNamespaceSelector)特性。容器组的亲和性策略不再局限于同命名空间(Namespace)的标签选择,可以进行跨命名空间(Namespace)的标签选择,实现更完善的亲和性调度策略。更多信息,请参见KEP-2249

  • 1.22版本后,默认开启容器组删除开销(PodDeletionCost)特性。容器组可以根据其利用率,调整对应的删除开销,使利用率越低的容器组得到更低的删除开销。更多信息,请参见ReplicaSet

  • 1.22版本后,默认开启可配置容器组调度抢占提名节点(PreferNominatedNode)特性。调度器(Kube Scheduler)会优先尝试调度容器组到被提名的节点。只有被提名(Nominated)节点不符合被调度的要求时,调度器才会启动对剩余节点的评估流程。更多信息,请参见KEP-1923

  • 1.22版本后,默认开启可配置探针级别的优雅终止期限(ProbeTerminationGracePeriod)特性。该特性只能用在存活针中,配置探针级别(Pod-level)的teminationGracePeriodSeconds时长,缩短容器组失败后等待重启的时间。更多信息,请参见配置存活、就绪和启动探测器

  • 1.22版本后,默认开启网络策略末端端口可配置(NetworkPolicyEndPort)特性。基于该特性,可以配置网络策略(NetworkPolicy)来支持范围性的端口值。更多信息,请参见网络策略

  • 1.22版本后,默认开启基于对数化比较增加副本缩容的随机性(LogarithmicScaleDown)特性。基于该特性,可以增强容器组被缩容的随机性,缓解由于容器组拓扑分布约束带来的问题。更多信息,请参见在按比例缩小时应考虑Pod拓扑扩展约束KEP-2185

  • 1.22版本后,默认开启支持任务挂起(SuspendJob)特性。基于该特性,可以更好的控制任务的生命周期,例如一个正在运行的任务挂起,之后再恢复执行。更多信息,请参见介绍暂停的工作

  • 1.22版本后,默认开启配置服务内部流量策略(ServiceInternalTrafficPolicy)特性。基于该特性,可以设置服务将内部流量路由到当前节点上就绪的端点(Local),或路由到集群范围(Cluster)的所有就绪端点。更多信息,请参见服务

  • 1.22版本后,默认开启配置服务负载均衡类型(ServiceLoadBalancerClass)特性,实现自定义的负载均衡。更多信息,请参见设置负载均衡器实现的类别

  • 1.22版本后,默认开启支持配置负载均衡类型的服务不分配节点端口(ServiceLBNodePortControl)特性。该特性适用于直接将流量路由到容器组的场景,基于该特性,可以通过配置类型为负载均衡的.spec.allocateLoadBalancerNodePortsfalse,从而禁用节点端口的分配。更多信息,请参见设置负载均衡器实现的类别

  • 1.22版本后,默认开启可配置内存卷大小(SizeMemoryBackedVolumes)特性。该特性目前仅支持Linux节点,基于该特性,可以显式地通过emptyDir.sizeLimit定义需要的目录大小,提高容器组调度的透明性。更多信息,请参见:KEP-1967

  • 1.22版本后,默认开启服务端应用(Server-side Apply)特性。该特性可以更便捷的了解一个资源中字段变更的来源、时间和操作等。更多信息,请参见服务器端申请

  • 1.22版本后,CSI接口对Windows容器的支持进入稳定阶段。在不支持特权容器的操作系统(例如Windows Server 2019、WindowsServer Core version 2004等)上,Windows容器可以通过基于CSI代理操纵主机上的存储模块。由于该特性需要兼容CSI插件,请确认CSI插件的情况,再使用该功能。更多信息,请参csi-代理

  • 1.22版本后,默认开启请求签发更短时效证书(CSRDuration)特性。基于该特性,当提交的证书签发请求(CertificateSigningReqeust, CSR)内声明.spec.expirationSeconds时,证书签发的时效由该声明数值和控制管理器的参数--cluster-signing-duration的较小值决定。ACK 默认配置控制管理器为10年。更多信息,请参见签名者

  • 在1.22版本后,BoundServiceAccountTokenVolume特性门控GA,Pod中通过非projected投影方式挂载的Service Account会有一年的默认有效期。更多信息,请参见特性说明

特性引入

  • 1.21版本后,引入持久卷(PersistentVolume)健康度监控(Health Monitor)特性。持久卷健康度监控可以帮助工作负载(Workload)感知持久卷的健康程度,从而保证数据不会从受损的持久卷中读出或者写入。ACK默认开启CSI卷健康探测特性。由于该特性需要CSI插件的支持,只有使用的CSI插件支持该特性,才能正常使用该功能。更多信息,请参见卷健康监测

  • 1.22版本后,引入基于cgroups v2实现内存资源的服务质量(Quality of Service)保证特性。当资源使用紧张时(例如突发性的大资源量申请),CPU资源可以通过分配限速来提高资源的可用性,但无法实现内存资源的分配限速。为了支持内存资源的分配限速,Linux内核社区在cgroups v2中对相关接口进行了优化调整。ACK默认开启内存服务质量保证特性。由于该特性需要操作系统的内核支持,仅支持Linux节点,只有加入的节点支持该特性,才能正常使用该功能。更多信息,请参见cgroup v1接口支持memcg QoS功能2570-memory-qos

  • 1.22版本后,引入基于主机进程容器(HostProcess containers)实现Windows特权(Privileged)容器的特性。ACK默认开启Windows主机进程容器特性。由于该特性需要操作系统的内核支持,只有加入的节点支持该特性,才能被正常使用。更多信息,请参见Windows Server 2022上的Windows容器的新增功能创建Windows HostProcess Pod

  • 1.22版本后,引入工作负载(Workload)可使用节点交换内存特性,仅支持Linux节点。针对有对交换内存使用诉求的场景,例如节点管理员希望通过交换内存获得节点性能的调整和减少由于内存竞争带来的稳定性问题,应用开发者开发的应用可以通过交互内存获得更好的性能等。ACK暂不开启交换内存的特性。更多信息,请参见交换内存管理KEP-2400

  • 1.22版本后,引入为工作负载配置默认seccomp配置特性,仅支持Linux节点。开启该特性后,将使用RuntimeDefault策略作为默认的seccomp配置。但由于某些工作负载可能相比其他工作负载需要更少的系统调用限制,启用默认配置可能会导致运行失败。ACK暂不开启seccomp默认配置的特性。更多信息,请参见启用RuntimeDefault作为所有工作负载的默认seccomp配置文件

特性更替

  • 1.21版本后,容器组安全策略(PodSecurityPolicy,PSP)进入废弃阶段,计划在1.25版本完全移除该资源定义。ACK默认开启容器组安全特性。您可以在1.22版本中逐步更换替代已有的PSP资源。更多信息,请参见Pod安全准入PodSecurityPolicy弃用:过去、现在和未来

  • 1.21版本后,废弃通过在服务(Service)中描述拓扑关键字(topologyKeys)来实现的服务流量拓扑感知(ServiceTopology)特性,由拓扑感知提示特性替代。ACK默认不开启服务流量拓扑感知特性。如果已经开启该特性,可以在1.22版本中同时开启拓扑感知提示特性,并在该版本中逐步替换使用新的特性。更多信息,请参见拓扑感知提示

ACK对Kubernetes 1.22版本的增强

可观测性

  • 丰富了APIServer进行访问请求的指标信息,提高APIServer的可观测性。

  • 对于ACK Pro版、ACK Serverless集群Pro版或边缘Pro版集群,可透出托管面组件的核心指标,提高托管面核心部件的可观测性。

稳定性

对于所有集群类型:

  • 增加对存储层的保护,降低冷启动时对etcd的冲击。

  • 可根据请求的来源、类型或路由的组合,开启APIServer的限流操作,降低冷启动时对APIServer的冲击。

性能优化

问题修复

Kube Controller Manager:修复了特定场景下EndpointSlices资源泄露的问题。详细信息,请参见Fixing how EndpointSlice Mirroring handles Service selector transitions

参考链接