ACK 发布 Kubernetes 1.37 版本说明

更新时间:
复制 MD 格式

阿里云容器服务 Kubernetes 版(ACK)严格遵循社区一致性认证标准,现已发布 Kubernetes 1.37 版本。升级前,请确认 SELinux 卷重新标记和 kubelet 事件记录速率两项变更对集群的影响。

组件版本

下表为 ACK 集群核心组件的版本信息。

组件

版本说明

Kubernetes

1.37.1-aliyun.1

etcd

v3.7.1

containerd

2.3.4

CoreDNS

v1.13.2.3

CSI

建议升级至最新版本。版本信息,请参见 csi-plugin 和 csi-provisioner 的组件变更记录。

CNI

Flannel 为 v0.28.0.6;Terway 和 TerwayControlplane 为 v1.15.0 及以上版本。

升级影响

以下变更可能影响存量业务。升级至 Kubernetes 1.37 前,请确认集群是否受影响,并按需调整。

变更

影响

处理建议

SELinux 卷重新标记(SELinuxMount)进阶至 GA 并默认启用

仅影响节点启用了 SELinux 强制模式(Enforcing)的集群。

1.37 起,kubelet 在挂载卷时直接指定 SELinux 上下文,不再由容器运行时递归重新标记卷内文件。由于同一节点上一个卷只能使用一个 SELinux 上下文,SELinux 标签不同的 Pod(例如特权 Pod 与非特权 Pod)共享同一个卷时,其中一个 Pod 会处于 ContainerCreating 状态,直至另一个 Pod 终止。

在节点上执行 getenforce,若返回 Enforcing,表示已启用强制模式,需排查共享卷的工作负载。对于存在冲突的工作负载,可将 Pod 的 spec.securityContext.seLinuxChangePolicy 设置为 Recursive,继续使用递归重新标记;或调整应用部署方式,避免 SELinux 标签不同的 Pod 共享同一个卷。

排查方法,请参见SELinux 卷标签变更进入 GA 阶段(以及 v1.37 中可能的影响)。

kubelet 事件记录速率(eventRecordQPS)取值 0 的含义修正

此前,kubelet 会将 eventRecordQPS: 0 按默认值处理。1.37 起,0 表示不限速。

通过 自定义节点池kubelet配置 设置的 eventRecordQPS 取值范围为 [1, 50],不会出现取值为 0 的情况,因此不受影响。

如果通过其他方式将 eventRecordQPS 设置为 0,且需要保留限速,请在升级前将其修改为非零值,例如 50。

功能变更

以下为 Kubernetes 1.37 社区版本的主要功能变更,特性的成熟度及默认启用状态均以社区版本为准。

存储

  • SELinuxMount(SELinux 卷重新标记)进阶至 GA,默认启用。该变更可能影响存量业务,详见升级影响。

  • StorageVersionMigration API(存储版本迁移)进阶至 GA,默认启用 storagemigration.k8s.io/v1,可自动迁移 etcd 中以旧版本序列化存储的数据。

  • StorageCapacityScoring(存储容量评分)进阶至 Beta。该特性扩展了 kube-scheduler 中 VolumeBinding 插件的 score 扩展点,支持根据节点的可用存储容量为节点动态评分。

调度与伸缩

  • HorizontalPodAutoscaler(HPA)缩容至零进阶至 Beta,默认启用。该特性于 Kubernetes 1.16 引入,支持在工作负载空闲时将 Pod 数量缩容至零,并在负载恢复时重新扩容。

  • Gang scheduling(编组调度)进阶至 Beta。该特性通过 Workload API 和 PodGroup 增强原生编组调度能力,确保一组 Pod 要么全部调度成功,要么全部不调度(All-or-Nothing)。

  • Workload-aware preemption(工作负载感知的抢占)进阶至 Beta。调度器在抢占时会以 PodGroup 为单位整体抢占低优先级工作负载,避免驱逐部分 Pod 后仍无法为待调度的工作负载腾出足够资源。

安全与准入

  • ManifestBasedAdmissionControlConfig(静态文件准入配置)进阶至 Beta。该特性支持从磁盘上的静态文件加载准入 Webhook 和基于通用表达式语言(Common Expression Language,CEL)的准入策略,无需完全依赖 API Server。

  • Pod 证书与 ClusterTrustBundles 进阶至 GA,支持向 Pod 分发私钥、X.509 证书和信任包。

  • Handling Undecryptable Resources(无法解密的资源处理)进阶至 Beta。当加密密钥不可用导致资源无法解密时,管理员可通过 Kubernetes API 安全地识别并移除这些资源。

可观测性与指标

  • metrics.k8s.io(资源指标 API)在 Beta 阶段停留近九年后进阶至 GA,提供查询 Pod 和节点 CPU、内存用量的标准接口。

  • NativeHistograms(原生直方图指标)进阶至 Beta。该特性在 NativeHistograms 特性门控 Alpha 版本的基础上,优化了实现方式,并简化了启用流程。

  • PodAndContainerStatsFromCRI(通过 CRI 收集指标)进阶至 Beta。kubelet 可通过容器运行时接口(CRI)收集 Pod 和容器指标,不再依赖 cAdvisor 直接采集主机数据。

节点与资源管理

  • eventRecordQPS(kubelet 事件记录速率)取值为 0 时,含义修正为不限速。该变更可能影响存量业务,详见升级影响。

  • 动态资源分配(DRA):DRA 的扩展资源支持进阶至 GA,另有多项 DRA 特性进阶至 Beta 或 GA。详见Kubernetes v1.37 DRA 更新。

  • Node Declared Features(节点声明特性)进阶至 GA。kubelet 可通过 .status.declaredFeatures 字段向控制面上报节点支持的新特性及受特性门控控制的功能。

  • 内存 QoS:内存服务质量(Quality of Service,QoS)进阶至 Beta。该特性基于 cgroup v2 的 memory.min、memory.low 和 memory.high 等控制项,提供不同级别的内存保护和限流。例如,通过内存请求(requests)保护内存不被回收,或通过 memory.high 对超过阈值的工作负载限流。

  • PodLevelResourceManagers(Pod 级资源管理器)进阶至 Beta,默认禁用。启用后,拓扑管理器、CPU 管理器和内存管理器在进行资源分配和非统一内存访问(Non-Uniform Memory Access,NUMA)对齐时,可使用 Pod 级别定义的资源。

控制面与工具链

  • KYAML 格式支持:kubectl 对 KYAML 格式的支持进阶至 GA。KYAML 是为 Kubernetes 设计的 YAML 子集,用于解决标准 YAML 解析时的歧义和安全问题。详见KEP-5295: Introducing KYAML。

  • etcd RangeStream 进阶至 Beta,默认启用。RangeStream 是新增的服务端流式 RPC(Remote Procedure Call),复用现有的 RangeRequest,将结果分块返回,无需缓冲为单个大数据块,可降低 API Server 和 etcd 的内存占用。

  • ConcurrentWatchObjectDecode(并发解码 Watch 对象)为 Beta 特性,自 1.37 起默认启用。启用后,Watch 事件的解码和转换由多个协程(goroutine)并发处理,可提升处理效率。

  • StaleControllerConsistency(控制器一致性)进阶至 Beta,用于减少控制器因读取过期的本地缓存而做出错误决策的情况。

弃用与移除

已移除的功能和 API

  • 静态 Pod 资源引用:静态 Pod 不再支持引用 Secret 或 ConfigMap。

  • scheduling.k8s.io API 变更:DisruptionMode 由枚举字段改为结构体,以便后续扩展。由于该变更不向后兼容,scheduling.k8s.io API 组从 v1alpha2 升级到 v1alpha3,并移除 v1alpha2。如果您使用了 v1alpha2 版本,请在升级前改用 v1alpha3。

已弃用的功能

  • kube-dns:Kubernetes 社区已弃用 kube-dns,预计 1.40 版本之后不再提供新的 kube-dns 软件包。如果您仍在使用 kube-dns,请尽快规划迁移至 CoreDNS。ACK 集群默认使用 CoreDNS 提供 DNS 服务,详见服务发现DNS。

  • kubectl run 参数:kubectl run 的 --filename(或 -f)参数将被弃用。该命令创建的 Pod 始终只根据 NAME、--image 等命令行参数生成。详见kubernetes/kubernetes#138671。

参考链接