首页
/ Kubernetes v1.37 发布全览:Workload 感知调度、DRA 深度演进与 nftables 网络栈迁移实战指南

Kubernetes v1.37 发布全览:Workload 感知调度、DRA 深度演进与 nftables 网络栈迁移实战指南

2026-09-06 18:12:03作者:薛曦旖Francesca

导读

本文以 CHANGELOG/CHANGELOG-1.37.md 为绝对主体,系统梳理 Kubernetes v1.37.0(及 rc/beta/alpha 演进阶段)相对 v1.36.0 的全部重大变化。内容包括升级前必须处理的破坏性变更、以 PodGroup/Workload 为核心的调度体系重构、Dynamic Resource Allocation(DRA)在 v1.37 中的大规模毕业与修正、kube-proxy 由 iptables 向 nftables 过渡、kubelet 内嵌 cAdvisor 的精简,以及大量 feature gate 的阶段跃迁。读者读完可掌握 v1.37 升级要点、主要新 API 的用法与定位,以及如何结合仓库源码(pkg/features/kube_features.gopkg/apis/schedulingpkg/apis/resource 等)验证各项变更的落地形态。

一、版本与发布产物概览

v1.37.0 是继 v1.36.0 之后的一个特性密集版本,发布说明按阶段依次包含 v1.37.0-alpha.1alpha.2alpha.3beta.0rc.0rc.1 直至正式版,每个阶段均有独立的下载清单与依赖变更记录。正式版相对 v1.36.0 的完整变更汇总,是评估升级影响的最权威依据。

1.1 下载物与校验方式

官方发布说明为下列产物给出了逐文件的 sha512 哈希,用于下载后完整性校验:

  • 源码包kubernetes.tar.gzkubernetes-src.tar.gz
  • 客户端二进制kubernetes-client-<os>-<arch>.tar.gz,覆盖 darwin/linux/windows 三平台与 amd64/arm64/arm/386/ppc64le/s390x 等架构;
  • 服务端二进制kubernetes-server-linux-{amd64,arm64,ppc64le,s390x}.tar.gz
  • 节点二进制kubernetes-node-linux-{amd64,arm64,ppc64le,s390x}.tar.gzkubernetes-node-windows-amd64.tar.gz

下载后可用发布说明中对应行的 sha512 哈希执行校验,例如:

echo "<sha512 哈希>  kubernetes.tar.gz" | sha512sum -c -

1.2 容器镜像清单

v1.37.0 发布说明明确:所有容器镜像均以 manifest list 形式发布并支持所声明的多架构;如需直接拉取特定架构镜像,可在镜像名后追加 -$ARCH 后缀。核心镜像如下:

镜像 支持架构
registry.k8s.io/conformance:v1.37.0 amd64、arm64、ppc64le、s390x
registry.k8s.io/kube-apiserver:v1.37.0 amd64、arm64、ppc64le、s390x
registry.k8s.io/kube-controller-manager:v1.37.0 amd64、arm64、ppc64le、s390x
registry.k8s.io/kube-proxy:v1.37.0 amd64、arm64、ppc64le、s390x
registry.k8s.io/kube-scheduler:v1.37.0 amd64、arm64、ppc64le、s390x
registry.k8s.io/kubectl:v1.37.0 amd64、arm64、ppc64le、s390x

二、升级前必读:破坏性变更(Urgent Upgrade Notes)

发布说明中标注了数条 ACTION REQUIRED 级别的变更,任何从 v1.36 升级到 v1.37 的集群都应逐条核对。官方特别用「No, really, you MUST read this before you upgrade」来强调其重要性。

2.1 SELinuxMount 晋升 GA,默认启用(#139956)

  • 影响SELinuxMount feature gate 在 v1.37 中晋升 GA 并默认启用。在开启了 SELinux 的集群中,这可能破坏现有工作负载——因为节点将按新的 SELinux 卷标注语义去挂载卷。
  • 行动:升级前应在 v1.36 集群中识别出可能受影响的负载并修复,或提前选择退出 SELinuxMount 行为变更;未启用 SELinux 的集群可忽略该条目。
  • 源码佐证:在 pkg/features/kube_features.go 中可看到 SELinuxMount 从 v1.30 Alpha(默认关)、v1.33 Beta(默认关)演进到 v1.37 GA(默认 true),并注明"计划在 1.38 锁定"。同一文件还保留了 SELinuxChangePolicy(已于 1.36 锁定 GA,计划 1.39 移除)与 SELinuxMountReadWriteOncePod(1.36 锁定 GA,1.39 移除)两个相邻 feature gate 的完整生命周期。

2.2 scheduling.k8s.io v1alpha2 整体下线,DisruptionMode 改为结构体(#138572)

  • DisruptionMode 枚举字段被重构为 struct,以便未来扩展;
  • scheduling.k8s.io API 组从 v1alpha2 升为 v1alpha3v1alpha2 被彻底移除
  • 行动:执行集群更新前,必须先从 kube-apiserver 中删除全部 v1alpha2 对象,否则升级过程会因残留旧版本对象而失败。

2.3 kubelet eventRecordQPS 语义修正:0 表示不限制(#117119)

  • 修复了 eventRecordQPS 为 0 时被当作"默认值"而非"无限制"处理的 bug,使其与字段文档描述一致;
  • 行动:若此前依赖旧的默认行为,需显式设置为非 0 值(例如 50);保持 0 将得到"完全不限流"的新语义。

2.4 kubelet 启动时打印生效配置(#139837)

  • kubelet 将在启动时把生效配置记录到日志中。由于这些日志可能暴露配置细节,集群管理员应限制 nodes/logs ClusterRole 仅授权给可信用户;
  • 发布说明同时强调这更多是对既有最佳实践的提醒——大多数生效配置项此前已可通过其他日志或 kubelet 行为推断。

三、按类别解读 Changes by Kind

3.1 依赖层变更(Dependency)

  • grpc 升级到 v1.82.1(#140740):为 HTTP/2 控制帧洪水增加服务端限额,同时移除了 GRPC_GO_EXPERIMENTAL_DISABLE_STRICT_PATH_CHECKING 环境变量,严格路径检查永久开启;
  • etcd 默认版本升至 v3.7.0(经 v3.7.0-rc.0 #139427 过渡到 #140333),etcd 客户端库同步更新到 v3.6.10(#138393)、v3.6.11(#138747);
  • kubelet 内嵌 cAdvisor 换用精简模块 github.com/google/cadvisor/lib(#139870,详见下文「kubelet 与节点」一节)。

3.2 弃用通告(Deprecation)

  • kube-proxy ipvs 模式弃用(#139067、#139777):kubeadm 在未提供 KubeProxyConfigurationmode 字段为空时,显式将 mode 设为 iptables;v1.37 起 kube-proxy 会对未显式指定 mode 的启动给出警告。官方规划是未来版本将默认模式从 iptables 切换为 nftables(nftables 模式已于 v1.33 GA);同时新增 KubeProxyIPVS feature gate(#139397),为后续停用并移除 ipvs 模式做准备;
  • kubectl run 的 --filename/-f 被弃用(#138671),该参数原本就被忽略;
  • DeclarativeValidationTakeover feature gate 被锁定(#139212),不再允许设置。

3.3 API 变更:GA 毕业清单(v1.37 主旋律)

v1.37 是多个长期 Alpha/Beta 功能集中毕业的版本,逐项列举如下:

功能 / API 变化 关键 PR
Pod Certificates 晋升 GA,PodCertificateRequest feature gate 默认开启;v1beta1 中弃用的 PKIXPublicKeyProofOfPossession 字段从 v1 API 移除 #139579
Pod hostname overrides GA,HostnameOverride feature gate 锁定为开启 #139116
ClusterTrustBundle / ClusterTrustBundleProjection GA 并默认启用 #139437
StorageVersionMigration GA,storagemigration.k8s.io/v1 默认启用 #138560
DRA Device Taints and Tolerations GA,经 resource.k8s.io/v1 提供 #138676
DRA extended resource GA #138488
metrics.k8s.io API 从 v1beta1 升为 v1,无 schema 变更 #139223
HPAConfigurableTolerance GA #140107
NodeDeclaredFeatures GA #139763
PLEGOnDemandRelist GA #140805
InPlacePodVerticalScalingInitContainers GA #140728
PodReadyToStartContainers 条件 GA #140488
MaxUnavailableStatefulSet 默认启用 #139466
MemoryQoS 升 Beta;memoryThrottlingFactor 默认 nil,未显式配置则不再设置 memory.high #140007
KubeletInUserNamespace 升 Beta #134639
VolumeLimitScaling 升 Beta(CSIDriver 新增 preventPodSchedulingIfMissing 字段) #140612
PersistentVolumeClaimUnusedSinceTime 升 Beta 并默认启用,PVC 上报 Unused 条件辅助清理 #139620
PodLevelResourceManagers Beta 默认启用后被回退为默认关闭(见 Bug 修复节 #141209) #140573 / #141209

两类被删除的 API/类型

  • AnyVolumeDataSource(GA 锁定功能)与 SidecarContainersRetryGenerateNameBtreeWatchCacheOrderedNamespaceDeletionStreamingCollectionEncodingToJSON/ProtobufAPIServerTracingResilientWatchCacheInitializationConsistentListFromCache 等 feature gate 从代码中移除(#135336、#137755、#138907);
  • 自 2015 年起就无 REST endpoint 的 PodStatusResult 类型被彻底删除(#136271)。

3.4 StatefulSet 新增 Recreate 更新策略

v1.37 为 StatefulSet 引入与 Deployment Recreate 语义对齐的 Recreate 更新策略(#137187):先删除全部 Pod,等待其完全终止,再依据 podManagementPolicy 字段创建新 Pod。

源码佐证:在 pkg/apis/apps/types.go 中可见三种策略类型并存——RollingUpdateStatefulSetStrategyType("RollingUpdate")、OnDeleteStatefulSetStrategyType("OnDelete")以及新增的 RecreateStatefulSetStrategyType("Recreate")。注释表明 Recreate 为 Alpha 类型,需要启用 StatefulSetRecreateStrategy feature gate,且仅在该 gate 开启时允许切换到 Recreate 策略。使用时可在 StatefulSet 的 spec.updateStrategy.type 中声明:

spec:
  updateStrategy:
    type: Recreate   # 或 RollingUpdate / OnDelete

3.5 探针与安全上下文细节

  • httpGet 探针支持 HTTP/2 Cleartext(H2C)(#139429):liveness/readiness/startup 探针的 httpGet 新增 protocol 字段,可显式使用 H2C 协议;
  • 安全上下文放宽(#138834):对 Pod 的更新操作允许同时设置 allowPrivilegeEscalationCAP_SYSADMIN(Pod 创建仍拒绝该组合);
  • 绑定挂载选项细化(#140013):每个容器卷挂载可单独指定 noexecnodevnosuid
  • emptyDir 目录创建时可设 Unix 权限位(#140244):通过 mode 字段设置 0000-01777;
  • Pod 级资源与 QoS 判定收紧(#137150):仅当 Pod 级资源包含 request 或 limit 时才参与 QoS 计算,空的 {}{requests:{}}{limits:{}} 不再影响 QoS。

四、核心专题:Workload 感知调度(WAS)与 PodGroup 体系

v1.37 对调度体系的改造是本版本最大的结构性变化,核心是围绕 Workload / PodGroup / CompositePodGroup 的一组构建块 API,以及调度框架对它们的一等公民支持。

4.1 API 演进与命名收敛

  • Workload 与 PodGroup 晋升 scheduling.k8s.io/v1beta1(#140184),升级前必须清理全部 v1alpha2 对象;
  • DisruptionMode 改为 structscheduling.k8s.io 升 v1alpha3(#138572,同升级须知 2.2);
  • PodGroup 引用工作负载的字段由 PodGroupTemplateRef 重构为更直接简洁的 WorkloadRef(#140080);
  • PodGroup 条件 PodGroupScheduled 更名为 PodGroupInitiallyScheduled(#139743),以澄清该条件仅在 PodGroup 首次成功调度后被设置、可能不反映其当前调度状态;
  • PodGroup / PodGroupTemplate 的 minCount 创建后允许修改,但修改模板不影响已存在的 PodGroup(#139279);
  • GangSchedulingWorkloadAwarePreemption 两个 feature gate 被移除,统一由 GenericWorkload 承载核心 workload 感知调度能力(#139520)。

源码佐证:在 pkg/apis/scheduling/types.go 中可看到 scheduling.k8s.io 组内新增的复合 API 形态——PodGroupTemplates/CompositePodGroupTemplates(#L166、#L178)、WorkloadRef(#L529、#L781)、PodGroup/CompositePodGroup 各自的 DisruptionModePreemptionPolicy 字段,以及 PodGroupInitiallyScheduledDisruptionTargetPodGroupReasonUnschedulablePodGroupReasonSchedulerErrorPodGroupReasonPreemptionByScheduler 等条件常量(#L645-L661)。对应目录还同时存在 pkg/apis/scheduling/v1alpha3pkg/apis/scheduling/v1beta1 两个版本化子包,印证了 v1.37 的多版本并存过渡。

4.2 调度框架层面的支持

  • 调度队列抽象化:active/backoff/unschedulable 三条队列统一存储 QueuedEntityInfo,既可容纳单个 Pod 也可容纳 PodGroup(#138567),并新增 incompletePodGroupPods 结构暂存等待 PodGroup 对象被 scheduler 观测到的 Pod(#139952);
  • 新增扩展点 PodGroupPostFilter(#139674):取代对 WorkloadAwarePreemption 的内部硬编码;PodGroup 调度循环中不再逐个 Pod 触发 PostFilter 插件,仅当整个 PodGroup 不可调度时才执行 PodGroupPostFilter(#140412);
  • 新增扩展点 PlacementFeasible(#138643):GangScheduling 插件借此在 minCount 已不可满足时提前终止 PodGroup 调度循环;
  • PodGroupManager 与 SharedLister 新增 PodGroup 方法(#140077),PodGroupInfo 新增 PodGroup 字段(#140075),使插件在整个调度周期内获得一致的 PodGroup 状态;
  • 抢占(Preemption)语义升级:支持把 PodGroup 作为抢占受害者(#137981);PodGroup 抢占成功后为其 Pod 设置 nominatedNodeName(#138967);抢占前先移除全部潜在受害者再做单次调度尝试以换取性能(#139980);避免对已存在终止中受害 Pod 的提名节点做冗余抢占(#138710);PodGroup 状态在抢占成功时记录 pod group preemption found a placement for podgroup, preempting <victim_count> victims(#140311);
  • 一致性校验:保证被评估 Pod 的优先级与 PodGroup 一致(#139920),在启用 PodGroupPreemptionPolicy 时校验抢占策略与优先级匹配(#140359);PodGroup 因成员 schedulerName 不一致被拒时在 status.conditions 记录失败原因(#140183);
  • 队列细节修正:PodGroup 调度成功后,剩余未调度 Pod 直接回到 active 队列而非 backoff 队列并保留原始时间戳,维持调度优先级(#139613);默认抢占在找到候选节点时,会在 FailedScheduling 事件与 PodScheduled 条件中输出 preemption: found a potential placement for pod on node <node_name>, preempting <victim_count> victims(#140180);
  • Job 集成:Job controller 通过 workloadbuilder 库接入 Workload building block API,获得 Workload 感知调度能力(#140188)。

五、核心专题:DRA(Dynamic Resource Allocation)的深度演进

DRA 在 v1.37 的变更密度冠绝全版本,可归纳为"新增能力、状态晋升、调度修复"三个层面。仓库侧对应实现集中在 pkg/apis/resource(API 类型)以及 staging/src/k8s.io/dynamic-resource-allocation 下的 kubeletplugin 辅助库。

5.1 新增 Alpha 能力(均默认关闭)

  • 设备兼容组 DRADeviceCompatibilityGroups(#139795):DRA driver 可在 ResourceSlice 的 device.consumesCounters[] 上声明不透明 compatibilityGroups,scheduler 仅在同一 counter 集合上声明的组相交时才共分配设备,将不兼容共分配的检测从"准备期失败"提前到"调度期拒绝";
  • 资源可用性可视化 DRAResourcePoolStatus 第二版(#140170,KEP-5677):ResourcePoolStatusRequest controller 修正可分区/可消耗设备的计数——每台设备只计一次、忽略 AdminAccess、将带污点设备视为不可用,并新增可选字段描述分区与共享可用性(注意:计数口径修正会改变 v1.36 上报的数字);
  • DRAOptionalNodeOperations(#139933):ResourceSlice / ResourceClaim 新增 SkipNodeOperations 字段,允许跳过节点级准备与清理操作;
  • 派生属性(derived attributes)(#140029):claim 可用 CEL 表达式定义"虚拟属性"并用于设备约束,实现跨域共分配(如同一 NUMA 节点上的 GPU 与 NIC),即使 driver 物理属性发布方式不同;
  • DRANodeAllocatableResources 功能更新(#140009):ResourceSlice 映射与 PodStatus 支持直接分配(driver 将 CPU/内存/hugepages 建模为资源)与开销分配(加速器宿主机开销);kubelet 在配置 Pod/容器 cgroup、OOM 分数与 Memory QoS 阈值时计入 DRA 分配资源;使用 DRA claim 的 Pod 支持标准资源原位 resize;
  • DRAWorkloadResourceClaims 升 Beta(#140334,默认仍关闭);
  • DRA metadata API 升 Beta(#140722):启用该功能的 driver 作者必须在 metadata 输出中显式选择要支持的版本;
  • resource.kubernetes.io/numaNode 标准设备属性及 sysfs 辅助函数(#139929)。

5.2 设备健康与 gRPC API 一次性 Go 破坏

DRAResourceHealth kubelet gRPC API 晋升 v1(#139477)是一次性的 Go 层破坏:

  • k8s.io/dynamic-resource-allocation/kubeletplugin 辅助库中,DRAPlugin.WatchHealthStatus 成为 DRAPlugin 接口的强制方法,取代原先可选的带版本 gRPC 接口——既有 driver 必须补上该方法才能编译;
  • 不支持健康上报的 driver 返回 ErrHealthNotSupported,或通过 HealthService(false) 关闭服务;
  • 辅助库默认同时服务 v1 与 v1alpha1,因此面向 v1.36 及更老 kubelet 的 driver 无需额外配置即可上报健康;kubelet 优先选择 v1,并在三个版本的过渡期内仍消费旧 driver 的 v1alpha1;
  • v1alpha1 DRAResourceHealth API 已弃用,计划在 v1.40 移除;
  • 仓库侧实现可参阅 staging/src/k8s.io/dynamic-resource-allocation/kubeletplugin/health.gostaging/src/k8s.io/dynamic-resource-allocation/kubeletplugin/draplugin.go,其配套测试(如 metadata_compatibility_test.go)覆盖了多版本兼容路径。

5.3 其他 API 面变更

  • ResourceSlice 支持按 pool 名过滤:field selector spec.pool.name(#138456);
  • DRA 设备 metadata v1alpha1 为 Go 消费者提供生成式声明校验函数(#140687);
  • DRAPrioritizedList feature gate 在 v1.36 GA 后于本版本锁定为默认开启、不可再关闭(#139110);
  • CDI spec 版本选择改为动态,避免生成不兼容的 CDI 规范(#137699);
  • Pod status 的 DRA 相关字段(resourceClaimStatusesextendedResourceClaimStatusnodeAllocatableResourceClaimStatuses)在旧客户端更新省略这些字段时被保留,防止 Pod 永久卡在 Terminating(#139876)。

5.4 密集的调度与校验修复

v1.37 修复了大量 DRA 计数与分配正确性问题,主要集中在可消耗容量(consumable capacity)与共享计数器(shared counters)分配器。代表性修复包括:

  • 结构化分配器在拒绝/回溯候选后错误保留 counter 预留、清除共享设备 in-use 标记导致二次计费(#140431、#140437);
  • 仅按 pool 名缓存共享计数器导致同名 pool 的 driver 串用对方定义(#140435);
  • allocationMode: All 在设备余量不足时被部分分配(#140769)、触发 panic(#138885);
  • validRange.step/min/max/default 取非法值(0、负数、超 int64)导致的除零 panic 与错误校验(#139698、#140666),以及高精度小数在 informer 缓存中被就地篡改(#140702、#140518);
  • DistinctAttribute 约束在多设备分配时未逐一校验(#140600)、不可表示或负值的 capacity request 被当作可满足(#140442);
  • CapacityRequestPolicyRange 支持毫级小数(#140161);
  • 多个 Pod 共享同一 ResourceClaim 时卡调度、被调度到无该 claim 的节点、或与多节点 claim 混用时卡 Pending(#140269、#140089、#139418、#139017、#140831);
  • driver 被外部删除 ResourceSlice 后未按时间窗口重建(#140063);PrepareResources 重试导致重复 CDI 设备 ID(#140274)与并发 prepare/unprepare 竞争(#140527)。

六、核心专题:kube-proxy 网络栈——nftables 化与弃用铺垫

v1.37 的网络侧主题是 iptables → nftables 的平滑过渡 与 ipvs 的退出铺垫。

  • 未指定 mode 即告警(#139957):kube-proxy 未显式指定 iptables/ipvs/nftables 模式启动时会告警,因为 Linux 上的默认模式未来将切到 nftables;
  • nftables 后端默认启用 netlink 直连(#137536):kube-proxy 通过 NFTablesNetlink(Beta,默认开启)gate 直接以 netlink 列举规则与链,避免执行并解析 nft 命令行,性能显著提升;可关闭该 gate 恢复旧行为;
  • 本地 NodePort 用户态 TCP 代理(opt-in)(#138427):nftables 后端新增可选用户态 TCP 代理,用于在 IPv4/IPv6 上服务 localhost NodePort Service;
  • 细节修复:nftables 注释按内核 128 字节上限截断以防长 Service 名引发同步失败(#139516);单 endpoint Service 不再使用 maps 以提升编程速度(#140723);kube-proxy 镜像内置 nft 升级到 nftables v1.0.6.1(#140405);IPVS 模式 syncProxyRules 修复每个接口全量 netlink dump 导致的数十秒延迟(#138927);UDP Service 缩容到零时清理陈旧 conntrack 条目(#139629);Node 的 IP 变化或被删除时 kube-proxy 主动退出以便以新网络状态重启(#138183);kube-proxy 内存优化——丢弃不需要的 .metadata.managedFields(#140056);大集群模式(endpoints 超 1000)跳过全量同步(#138571)。

七、核心专题:kubelet 与节点侧变更

7.1 cAdvisor 精简:三条弃用面被移除(#139870)

kubelet 内嵌 cAdvisor 改用更精简的 github.com/google/cadvisor/lib 模块,移除了三类长期弃用/遗留表面:

  1. 被弃用的 cAdvisor flags 不再被接受,一旦设置 kubelet 将拒绝启动(唯一保留 --housekeeping-interval)。需从 kubelet 配置中移除的 flag 包括:--application-metrics-count-limit--boot-id-file--container-hints--containerd--containerd-namespace--enable-load-reader--event-storage-age-limit--event-storage-event-limit--global-housekeeping-interval--log-cadvisor-usage--machine-id-file,以及全部 --storage-driver-* 系列;
  2. cAdvisor 应用/自定义指标不再采集/stats/summary 中的 userDefinedMetrics 字段与 /metrics/cadvisor 下自定义的 container_application_* 序列被移除;
  3. 不再导出 /metrics/cadvisorcontainer_cpu_load_average_10scontainer_cpu_load_d_average_10scontainer_tasks_state 三个序列。

7.2 其它 kubelet 行为与配置

  • eventRecordQPS 语义修正(同 2.3);
  • 启动打印生效配置(同 2.4);
  • DefaultPodSysctls(Alpha,默认关闭)(#140052):新增 kubelet 配置字段,为 Linux 节点上的 Pod 提供默认 sysctl;对 user.* sysctl 评估时未设置 spec.hostUsers 视为 true(#140892);
  • 日志相关端点收紧 HTTP 方法(#138088):只读端点拒绝非 GET(405),NodeLogQuery 仅允许 GET/POST;
  • 节点事件填充 involvedObject.uid(#139921):节点注册后尽力而为地填充,便于 kubectl describe node 按 UID 关联事件;
  • 新增 Node 生命周期条件(#139993):GracefulNodeShutdownInProgressDrainInProgressDrainedMaintenancePlannedMaintenanceInProgress
  • eviction 修正:hugepage 预留内存不再计入 memory.availableHugepageAwareEviction,默认开启,#138127);maxParallelImagePulls 高于 31 时修复镜像拉取凭据校验 panic(#138937);修复 v1.36 每 Pod 同步泄漏 context 造成的内存泄漏(#139850);
  • sidecar(可重启 init)容器强制临时存储限制(#138462);Pod sandbox 重建时不再跳过 init 容器(#138514);exec 就绪探针在优雅终止期不再因 "context canceled" 冻结 Ready 条件(#140882);
  • kubelet PodsAPI gRPC 服务升 Beta(#140286);PodAndContainerStatsFromCRI 升 Beta(默认关闭,#140081);
  • PodLevelResourceManagers 反复:曾在 rc 阶段启用为 Beta(#140573),后因发布前发现的关键问题被默认关闭(#141209)——这提示生产环境在升级到正式 v1.37 前应复核该 gate 的实际默认值。

八、kube-apiserver 与 API 机制变更

  • WatchList 响应支持 gzip 压缩(Beta,默认开启)(#139308、#140140):客户端发送 Accept-Encoding: gzip 时 API server 返回压缩的 WatchList 响应;普通 watch 请求不受影响,可用 WatchListCompression gate 关闭;
  • EtcdRangeStream 升 Beta 并默认开启(#136915、#140085):watch cache 初始化改为单个 RangeStream RPC 流式拉取 etcd 对象,取代分页 Range 请求;
  • ConsistentListFromCacheSkipTimeoutFallback(Alpha)(#138701):开启后,无法在超时窗口内从 watch cache 服务的强一致 LIST 请求返回 HTTP 429,而不是回退到存储层;
  • CBOR 扩展(#138808、#139632):CBOR encoder 改为逐项编码集合;在 CBORServingAndStorage gate 下,discovery endpoint 与结构化错误也支持 CBOR;
  • admission webhook 负载均衡(#139237):--enable-aggregator-routing=true 时请求将均匀分发到各 webhook endpoint,可用 WebhookRoundTripLoadBalancing(Beta,默认 true)临时退出;
  • webhook 虚拟资源豁免(#140019):admission webhook 跳过 tokenreviews/subjectaccessreviews 等 auth/authz 虚拟资源(ExcludeAdmissionWebhookVirtualResources,Beta 默认开启);
  • 不健康节点判定改进(#138698):标记节点不健康前先用 live GET 校验 lease 是否过期,避免陈旧缓存误判;
  • SchedulerPreQueueingHints 发布前回退(#138916 → #140959):曾在 beta 默认开启,因发布前夕发现的问题被降级为 Alpha 默认关闭,DRA 插件已实现该接口优化 ResourceClaimTemplate 负载的吞吐;
  • 修复多项正确性SIGTERM 时 identity Lease 创建失败导致 kube-apiserver 永久挂起(#140241);CEL 中 quantity.Add 篡改接收者(#140556);多 ValidatingAdmissionPolicy binding 审计只记录首个失败改为合并上报(#140001);Server-Side Apply 打补丁 list/map 容器类型回归 422(#140294);create-via-update/apply 补齐 metadata 字段(#140908)等。

九、可观测性与 kubectl/CLI 改进

9.1 新增与晋升的关键指标

指标 阶段 说明
apiserver_watch_events_dispatch_duration_seconds Alpha 事件从 etcd 解码到写入 watcher 结果通道的耗时,含 storage_to_cachecache_to_watcher 两个阶段标签
apiserver_watch_cache_initialization_duration_seconds 新增 最近一次 watch cache 初始化耗时,按 group/resource 打标
apiserver_storage_list_duration_seconds 新增 LIST 端到端延迟(etcd 读 + 对象解码),标注是否使用 RangeStream
queued_entities / queue_incoming_entities_total 新增 调度队列中 Pod/PodGroup 实体数与累计入队数
scheduler_generated_placements_total 等 3 个 TAS 指标 新增 TopologyAwareWorkloadScheduling gate 下的 placement 阶段指标
kubelet_pod_deferred_resize_duration_secondspod_level_resources_admission_total Alpha 原位 resize 延迟、Pod 级资源采纳统计
kubeproxy_sync_proxy_rules_winkernel_lb_*_failures_total 新增 Windows winkernel LB 操作失败计数,带 ip_family/lb_type/error 标签
scheduler_plugin_execution_duration_secondsscheduler_scheduling_algorithm_duration_seconds Alpha→Beta 调度插件执行与算法耗时
apiserver_watch_events_total / apiserver_watch_events_sizes →Beta watch 事件计数与体积
serviceaccount_legacy_tokens_total 等 3 个 →Beta 服务账号 token 族指标
kubelet 卷指标 storage_operation_duration_secondsvolume_operation_total_seconds Alpha→Beta 卷操作延迟

同时,三支弃用的 Alpha 指标 apiserver_cache_list_totalapiserver_cache_list_fetched_objects_totalapiserver_cache_list_returned_objects_total 不再默认暴露,应迁移到带 storage="watchcache" 标签的统一 apiserver_storage_list_* 指标(#139154)。kube-controller-manager 与 kube-scheduler 统一暴露 dynamic_resource_allocation_resourceclaim_creates_total,并新增 owner_api_groupowner_api_kind 标签区分 Pod 与 PodGroup 创建的 claim(#138542、#140422)。

9.2 kubectl / CLI

  • kubectl top 支持 metrics.k8s.io/v1(#139726),且 kubectl top pod 应用 --field-selector(#139107);
  • kubectl get crd 新增 GROUP、SCOPE、VERSIONS、CREATED AT 列(#131599);
  • kubectl explain --recursive 新增 --max-depth 限制嵌套深度(#138809);
  • kubectl get -o kyaml 输出晋升 Stable(#140076);
  • 新增 kubectl --proxy-url 覆盖 kubeconfig 中的代理地址(#139862);执行插件时向其注入 KUBECTL_PATH(#138694);
  • kubectl describe statefulset 补充 ServiceName、PodManagementPolicy、PersistentVolumeClaimRetentionPolicy(#137547);
  • 安全修复kubectl cluster-info dump --output-directory 落盘文件改为 0600、目录 0700,防止 Pod 日志中的敏感数据被全局可读(#140189);kubectl drain --disable-eviction --dry-run=server 挂死修复(#137543);
  • 资源类型未找到时报错带上 group 名(#140759);kubectl run--restart/--image-pull-policy 报错列出合法取值(#138188)。

十、发布进程中的反向修正(值得注意的"反复")

正式 changelog 如实记录了发布过程中被回退或纠正的决策,这些对实际升级判断同样重要:

  • PodLevelResourceManagers:Beta 默认启用(#140573)→ 发布前发现关键问题后默认关闭(#141209);
  • SchedulerPreQueueingHints:Beta 默认开启(#138916)→ 发布前夕发现问题后降级 Alpha 默认关闭(#140959);
  • 这两个案例说明,以 rc/beta 阶段的 release note 为准做升级判断存在风险,应以最终 v1.37.0 正式版 changelog 汇总为准

十一、依赖清单变化要点

v1.37.0 的依赖变更体现了对安全与性能的双重关注:

  • 升级:grpc v1.79.3 → v1.82.1、etcd 系列 v3.6.8 → v3.7.0(api/client/pkg/server/raft)、cel-go v0.26.0 → v0.29.2、google/cadvisor 全面切换到精简的 google/cadvisor/libgo.opentelemetry.io/otel 相关 → v1.44.0、prometheus/client_golang → v1.24.0、golang.org/x/sys → v0.47.0、sigs.k8s.io/knftables → v0.0.22 等;
  • 新增github.com/google/nftablesgithub.com/mdlayher/netlinkgithub.com/mdlayher/socket(配合 nftables netlink 直连)、tags.cncf.io/container-device-interface/specs-gogolang.org/x/perf 等;
  • 移除:AWS SDK v2 全套、google/cadvisor 主模块、opencontainers/runcmoby 相关模块、euank/go-kmsg-parsergolang/groupcache 等,与 cAdvisor 精简方向一致;
  • 构建 kubelet 时使用的 Go 版本最终锁定为 v1.26.6(其间经历了 1.26.3 → 1.26.6 的多次微调);
  • CoreDNS 升级至 v1.14.6、cri-tools 升级至 v1.36.0。

十二、升级行动清单(可操作总结)

  1. 在 v1.36 集群中完成 scheduling.k8s.io/v1alpha2 对象清理,再升级 control plane(#138572、#140184);
  2. 若集群启用 SELinux,先识别并修复可能受 SELinuxMount GA 影响的负载,或按需 opt-out(#139956);
  3. 检查 kubelet 配置:移除全部已弃用 cAdvisor flags、核对 eventRecordQPS 语义、评估"启动打印生效配置"后的 nodes/logs RBAC 收敛(#139870、#117119、#139837);
  4. 关注 kube-proxy:显式设置 mode(建议评估 nftables),为默认模式切换做准备(#139957、#139777);
  5. DRA driver 开发者:为 DRAPlugin 接口补齐 WatchHealthStatus 方法以通过编译(#139477);
  6. 复核受影响组件默认状态,尤其是 PodLevelResourceManagers 的最终默认值,以 v1.37.0 正式版为准(#141209)。

Kubernetes v1.37 用"毕业一批、重构一批、铺垫一批"的方式,在保持向后兼容的同时为 v1.38+ 的 nftables 默认化、Pod 级资源管理与更成熟的 Workload 调度铺平了道路。更多逐 PR 细节可直接查阅仓库内完整发布说明 CHANGELOG/CHANGELOG-1.37.md,并通过 pkg/features/kube_features.go(feature gate 生命周期)、pkg/apis/scheduling(WAS API 版本化)、pkg/apis/resource(DRA 类型)与 staging/src/k8s.io/dynamic-resource-allocation/kubeletplugin(DRA 健康上报辅助库)追验证到源码层。

登录后查看全文
热门项目推荐
相关项目推荐