Kubernetes v1.37 发布全览:Workload 感知调度、DRA 深度演进与 nftables 网络栈迁移实战指南
导读
本文以 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.go、pkg/apis/scheduling、pkg/apis/resource 等)验证各项变更的落地形态。
一、版本与发布产物概览
v1.37.0 是继 v1.36.0 之后的一个特性密集版本,发布说明按阶段依次包含 v1.37.0-alpha.1、alpha.2、alpha.3、beta.0、rc.0、rc.1 直至正式版,每个阶段均有独立的下载清单与依赖变更记录。正式版相对 v1.36.0 的完整变更汇总,是评估升级影响的最权威依据。
1.1 下载物与校验方式
官方发布说明为下列产物给出了逐文件的 sha512 哈希,用于下载后完整性校验:
- 源码包:
kubernetes.tar.gz、kubernetes-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.gz与kubernetes-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)
- 影响:
SELinuxMountfeature 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.ioAPI 组从v1alpha2升为v1alpha3,v1alpha2被彻底移除;- 行动:执行集群更新前,必须先从
kube-apiserver中删除全部v1alpha2对象,否则升级过程会因残留旧版本对象而失败。
2.3 kubelet eventRecordQPS 语义修正:0 表示不限制(#117119)
- 修复了
eventRecordQPS为 0 时被当作"默认值"而非"无限制"处理的 bug,使其与字段文档描述一致; - 行动:若此前依赖旧的默认行为,需显式设置为非 0 值(例如 50);保持 0 将得到"完全不限流"的新语义。
2.4 kubelet 启动时打印生效配置(#139837)
- kubelet 将在启动时把生效配置记录到日志中。由于这些日志可能暴露配置细节,集群管理员应限制
nodes/logsClusterRole 仅授权给可信用户; - 发布说明同时强调这更多是对既有最佳实践的提醒——大多数生效配置项此前已可通过其他日志或 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 在未提供
KubeProxyConfiguration或mode字段为空时,显式将 mode 设为iptables;v1.37 起 kube-proxy 会对未显式指定 mode 的启动给出警告。官方规划是未来版本将默认模式从 iptables 切换为 nftables(nftables 模式已于 v1.33 GA);同时新增KubeProxyIPVSfeature gate(#139397),为后续停用并移除 ipvs 模式做准备; - kubectl run 的
--filename/-f被弃用(#138671),该参数原本就被忽略; DeclarativeValidationTakeoverfeature gate 被锁定(#139212),不再允许设置。
3.3 API 变更:GA 毕业清单(v1.37 主旋律)
v1.37 是多个长期 Alpha/Beta 功能集中毕业的版本,逐项列举如下:
| 功能 / API | 变化 | 关键 PR |
|---|---|---|
| Pod Certificates | 晋升 GA,PodCertificateRequest feature gate 默认开启;v1beta1 中弃用的 PKIXPublicKey、ProofOfPossession 字段从 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 锁定功能)与SidecarContainers、RetryGenerateName、BtreeWatchCache、OrderedNamespaceDeletion、StreamingCollectionEncodingToJSON/Protobuf、APIServerTracing、ResilientWatchCacheInitialization、ConsistentListFromCache等 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 的更新操作允许同时设置
allowPrivilegeEscalation与CAP_SYSADMIN(Pod 创建仍拒绝该组合); - 绑定挂载选项细化(#140013):每个容器卷挂载可单独指定
noexec、nodev、nosuid; - 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改为 struct、scheduling.k8s.io升 v1alpha3(#138572,同升级须知 2.2);- PodGroup 引用工作负载的字段由
PodGroupTemplateRef重构为更直接简洁的WorkloadRef(#140080); - PodGroup 条件
PodGroupScheduled更名为PodGroupInitiallyScheduled(#139743),以澄清该条件仅在 PodGroup 首次成功调度后被设置、可能不反映其当前调度状态; - PodGroup / PodGroupTemplate 的
minCount创建后允许修改,但修改模板不影响已存在的 PodGroup(#139279); GangScheduling与WorkloadAwarePreemption两个 feature gate 被移除,统一由GenericWorkload承载核心 workload 感知调度能力(#139520)。
源码佐证:在 pkg/apis/scheduling/types.go 中可看到 scheduling.k8s.io 组内新增的复合 API 形态——PodGroupTemplates/CompositePodGroupTemplates(#L166、#L178)、WorkloadRef(#L529、#L781)、PodGroup/CompositePodGroup 各自的 DisruptionMode 与 PreemptionPolicy 字段,以及 PodGroupInitiallyScheduled、DisruptionTarget、PodGroupReasonUnschedulable、PodGroupReasonSchedulerError、PodGroupReasonPreemptionByScheduler 等条件常量(#L645-L661)。对应目录还同时存在 pkg/apis/scheduling/v1alpha3 与 pkg/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.go 与 staging/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);
DRAPrioritizedListfeature gate 在 v1.36 GA 后于本版本锁定为默认开启、不可再关闭(#139110);- CDI spec 版本选择改为动态,避免生成不兼容的 CDI 规范(#137699);
- Pod status 的 DRA 相关字段(
resourceClaimStatuses、extendedResourceClaimStatus、nodeAllocatableResourceClaimStatuses)在旧客户端更新省略这些字段时被保留,防止 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 模块,移除了三类长期弃用/遗留表面:
- 被弃用的 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-*系列; - cAdvisor 应用/自定义指标不再采集:
/stats/summary中的userDefinedMetrics字段与/metrics/cadvisor下自定义的container_application_*序列被移除; - 不再导出
/metrics/cadvisor的container_cpu_load_average_10s、container_cpu_load_d_average_10s、container_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):
GracefulNodeShutdownInProgress、DrainInProgress、Drained、MaintenancePlanned、MaintenanceInProgress; - eviction 修正:hugepage 预留内存不再计入
memory.available(HugepageAwareEviction,默认开启,#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 请求不受影响,可用WatchListCompressiongate 关闭; EtcdRangeStream升 Beta 并默认开启(#136915、#140085):watch cache 初始化改为单个RangeStreamRPC 流式拉取 etcd 对象,取代分页Range请求;ConsistentListFromCacheSkipTimeoutFallback(Alpha)(#138701):开启后,无法在超时窗口内从 watch cache 服务的强一致 LIST 请求返回 HTTP 429,而不是回退到存储层;- CBOR 扩展(#138808、#139632):CBOR encoder 改为逐项编码集合;在
CBORServingAndStoragegate 下,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_cache、cache_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_seconds、pod_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_seconds、scheduler_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_seconds、volume_operation_total_seconds |
Alpha→Beta | 卷操作延迟 |
同时,三支弃用的 Alpha 指标 apiserver_cache_list_total、apiserver_cache_list_fetched_objects_total、apiserver_cache_list_returned_objects_total 不再默认暴露,应迁移到带 storage="watchcache" 标签的统一 apiserver_storage_list_* 指标(#139154)。kube-controller-manager 与 kube-scheduler 统一暴露 dynamic_resource_allocation_resourceclaim_creates_total,并新增 owner_api_group、owner_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/lib、go.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/nftables、github.com/mdlayher/netlink、github.com/mdlayher/socket(配合 nftables netlink 直连)、tags.cncf.io/container-device-interface/specs-go、golang.org/x/perf等; - 移除:AWS SDK v2 全套、
google/cadvisor主模块、opencontainers/runc、moby相关模块、euank/go-kmsg-parser、golang/groupcache等,与 cAdvisor 精简方向一致; - 构建 kubelet 时使用的 Go 版本最终锁定为 v1.26.6(其间经历了 1.26.3 → 1.26.6 的多次微调);
- CoreDNS 升级至 v1.14.6、cri-tools 升级至 v1.36.0。
十二、升级行动清单(可操作总结)
- 在 v1.36 集群中完成
scheduling.k8s.io/v1alpha2对象清理,再升级 control plane(#138572、#140184); - 若集群启用 SELinux,先识别并修复可能受 SELinuxMount GA 影响的负载,或按需 opt-out(#139956);
- 检查 kubelet 配置:移除全部已弃用 cAdvisor flags、核对
eventRecordQPS语义、评估"启动打印生效配置"后的nodes/logsRBAC 收敛(#139870、#117119、#139837); - 关注 kube-proxy:显式设置
mode(建议评估 nftables),为默认模式切换做准备(#139957、#139777); - DRA driver 开发者:为
DRAPlugin接口补齐WatchHealthStatus方法以通过编译(#139477); - 复核受影响组件默认状态,尤其是
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 健康上报辅助库)追验证到源码层。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0623
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00