阿里云容器服务Kubernetes版(ACK)严格遵循社区一致性认证。本文介绍ACK发布Kubernetes 1.22版本所做的变更说明。
版本升级说明
ACK针对Kubernetes 1.22版本提供了组件的升级和优化。
核心组件 | 版本号 | 升级注意事项 |
Kubernetes | 1.22.15-aliyun.1 |
|
etcd | 3.5.1 | 无 |
CoreDNS | v1.9.3.6-32932850-aliyun | 此次升级不会对业务造成影响,支持的新特性如下:
|
CRI |
| 无 |
containerd 1.4.8 | 无 | |
CSI | 1.20.7-aafce42-aliyun | 无 |
CNI | Flannel 0.15.1.4-e02c8f12-aliyun | 此次升级不会对业务造成影响,支持的新特性如下:
|
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/v1beta1
API。如果使用旧版本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/v1beta1
和extensions/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-2221和cri-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的压力。更多信息,请参见Secret和ConfigMap。
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.completionMode为Indexed,即可在运行的容器组(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.allocateLoadBalancerNodePorts为false,从而禁用节点端口的分配。更多信息,请参见设置负载均衡器实现的类别。
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的冲击。
性能优化
Kubelet:在原地升级kubelet时,最大程度保证不重启容器。更多信息,请参见kubelet计算容器是否发生变化会导致集群范围的中断。
KubeProxy:兼容Alibaba Cloud Linux2 (kernel-4.19.91-23)及之上的版本,在开启IPVS模式时,不设置conn_reuse_mode为0。更多信息,请参见[ipvs]在 Linux内核版本>=v5.9上设置conn_reuse_mode=1。
ACK Serverless集群:在Virtual Node未就绪时,不主动驱逐ECI Pod,减少业务损失。
ACK Pro版或边缘Pro版:调度器增强,支持Gang Scheduling、CPU拓扑感知、GPU拓扑感知等调度增强。更多信息,请参见ACK Pro版集群概述。
问题修复
Kube Controller Manager:修复了特定场景下EndpointSlices资源泄露的问题。详细信息,请参见Fixing how EndpointSlice Mirroring handles Service selector transitions。