首页
/ Kubernetes v1.36 版本演进全解:从 CHANGELOG-1.36 看调度、DRA 与集群升级要点

Kubernetes v1.36 版本演进全解:从 CHANGELOG-1.36 看调度、DRA 与集群升级要点

2026-09-06 18:09:01作者:郁楠烈Hubert

本指南以仓库 CHANGELOG/CHANGELOG-1.36.md 为骨架,系统梳理 Kubernetes v1.36 正式版及其后 4 个补丁版本(v1.36.0 → v1.36.4)在调度器、Dynamic Resource Allocation(DRA)、存储、节点、认证、网络、可观测性与依赖方面带来的全部关键变化,并给出"升级前必读"的可执行检查项。读者通读后可快速判断 v1.36 对自己的集群意味着什么、哪些默认行为被改变、哪些指标与 API 需要迁移、哪些新能力值得开启,并可从 调度器框架Feature Gate 注册表 等源码位置进一步追查实现细节。

一、版本家族与发布节奏概览

CHANGELOG-1.36 记录了自 v1.35.0 起整个 v1.36 迭代周期的全部变更,覆盖 alpha → beta → rc → GA → 补丁的完整发布链路:

版本 定位 主要变化密度
v1.36.0-alpha.1 / alpha.2 功能冻结前的试验特性 引入 Workload/PodGroup API、PreBind 并行化、KubeletPSI GA 等
v1.36.0-beta.0 / rc.0 / rc.1 特性固化与稳定化 大量 Feature Gate 转正、指标升级 Beta、DRA 子特性批量转 Beta
v1.36.0 正式发布 大版本核心变更(见下文各专题)
v1.36.1 首个补丁 修复 ZFS 上 kubelet 启动失败、Windows HNS 陈旧端点清理等
v1.36.2 补丁 Go 1.26.4 构建、SSA/调度指令/CSI 挂载等回归修复
v1.36.3 补丁 Go 1.26.5 构建、kubelet 内存泄漏与 cri-api JSON 编码修复
v1.36.4 补丁 DRA 结构化分配器计数错误、抢占竞态、golang.org/x 系列安全更新

从源码结构看,v1.36 的关键特性大多集中在三个目录中:

  • 调度与工作负载:新引入的 Workload/PodGroup 调度逻辑贯穿 pkg/scheduler/framework/interface.go(新增 PreBindPreFlightPlacementGeneratePlacementScorePlacementFeasible 等扩展点)与 pkg/scheduler/framework/plugins/ 下的各插件;
  • 特性开关:几乎全部新能力都以 Feature Gate 形式注册在 pkg/features/kube_features.go,如 TopologyAwareWorkloadSchedulingDRAAdminAccessDRAConsumableCapacityInPlacePodLevelResourcesVerticalScaling 等;
  • client-go 基础库:informer 行为变更由 AtomicFIFOUnlockWhileProcessingFIFO 等 gate 控制,定义于 staging/src/k8s.io/client-go/features/known_features.go

二、发布物与获取方式

每个小版本均按 Source / Client / Server / Node / Container Images 分类发布。源码包为 kubernetes.tar.gzkubernetes-src.tar.gz;Client 二进制覆盖 darwin(amd64/arm64)、linux(386/amd64/arm/arm64/ppc64le/s390x)、windows(386/amd64/arm64);Server 与 Node 二进制覆盖 linux amd64/arm64/ppc64le/s390x(Node 另有 windows-amd64)。每个文件均附带 sha512 哈希用于完整性校验。

容器镜像以 manifest list 形式发布,同一镜像名支持多架构,也可通过给镜像名追加 -amd64-arm64-ppc64le-s390x 后缀直接拉取特定架构。v1.36 各版本的镜像清单包括:

  • registry.k8s.io/kube-apiserver:v1.36.x
  • registry.k8s.io/kube-controller-manager:v1.36.x
  • registry.k8s.io/kube-scheduler:v1.36.x
  • registry.k8s.io/kube-proxy:v1.36.x
  • registry.k8s.io/kubectl:v1.36.x
  • registry.k8s.io/conformance:v1.36.x(用于运行 conformance 测试)

例如校验某版本源码包:sha512sum kubernetes.tar.gz,并与 CHANGELOG 中对应条目比对。拉取镜像示例:docker pull registry.k8s.io/kube-apiserver:v1.36.4

三、升级前必读:v1.36 的 Action Required 清单

CHANGELOG 中明确标记为 "ACTION REQUIRED / (No, really, you MUST read this before you upgrade)" 的变更必须在你升级前完成评估:

1. 两个指标改名(涉及监控告警迁移)

  • kube-controller-manager:volume_operation_total_errorsvolume_operation_errors_total。基于旧指标的仪表盘与告警规则必须更新。
  • apiserver/etcd:etcd_bookmark_countsetcd_bookmark_total

这体现了 v1.36 在可观测性规范化上的整体取向:多个计数器型指标被统一为 <name>_total 命名(详见"可观测性"章节)。

2. 调度器 PreBind 插件并行化(插件作者必须适配)

v1.36 在调度框架中新增了"PreBind 前检查"(PreBindPreFlight)扩展点,使 PreBind 阶段可以并行执行以降低绑定延迟:

  • 插件可在 PreBindPreFlight 方法中返回 AllowParallel: true 选择并行执行;
  • 插件实现必须将返回值改为 *PreBindPreFlightResult;返回 nil 则维持原有串行行为。

该接口已落地于源码:框架层通过 pkg/scheduler/framework/runtime/framework.goRunPreBindPreFlights 批量调度各插件的 PreBindPreFlight,接口定义见 pkg/scheduler/framework/interface.go。内置插件中,DRA 动态资源插件卷绑定插件 均已在 PreBindPreFlight 中返回 AllowParallel: true,使 DRA 分配与 CSI 卷绑定成为首批受益于并行化的 PreBind 工作。

3. kubeadm 移除 flex-volume 内置支持

SIG Storage 自 v1.22 起就建议从 flexVolume 迁移到 CSI。v1.36 中 kubeadm 不再自动为 KCM static pod 挂载 flexVolume 插件目录。若仍要使用 flexVolume,必须自行:

  1. 使用非 distroless 基础镜像的自定义 KCM 镜像;
  2. 给 KCM 传 --flex-volume-plugin-dir
  3. 通过 kubeadm 的 extraVolumes 机制把 /usr/libexec/kubernetes/kubelet-plugins/volume/exec 挂载进 KCM static pod。

4. DRA 资源状态更新的细粒度 RBAC(Beta)

启用 DRAResourceClaimGranularStatusAuthorization(v1.36 进入 Beta)后,更新 ResourceClaim 状态所需的权限被收紧:

  • 调度器与控制面控制器须被授予 resourceclaims/binding 上的 update/patch
  • DRA 驱动须被授予 resourceclaims/driver 上的 associated-node:updatearbitrary-node:update(或其 patch 等价),并按 resourceNames 限制到自己的 claim。

不满足上述 RBAC 的调度器/控制器/驱动将无法正常回写 claim 状态。

5. 审计日志轮转默认值调整(防止磁盘被写满)

kube-apiserver 的三个审计参数默认值发生变化:--audit-log-maxsize=0 现在表示关闭按大小轮转(默认仍为 100 MB);--audit-log-maxage 默认变为 366(保留 1 年);--audit-log-maxbackup 默认变为 100。如需永久保留全部轮转日志,需显式传 --audit-log-maxage=0 --audit-log-maxbackup=0

6. 抢占(Preemption)语义相关提示

  • PostFilter 扩展点结果类型扩展:PostFilterResult 现在携带被抢占 Pod 列表,PostFilter 插件实现需更新为从 PostFilter 方法返回被抢占 Pod;返回 nil 表示未抢占任何 Pod。
  • PreBind 阶段被抢占的 Pod 改为重新进入 backoff 队列,而不是通过 API server 删除,抢占处理更平滑。

四、调度与工作负载:Workload/PodGroup API 与拓扑感知调度

v1.36 是"以组(group)为单位调度"的里程碑版本,CHANGELOG 的 API Change 条目大量围绕此主题。

1. Workload 与 PodGroup API 演进

  • 引入 scheduling.k8s.io/v1alpha2 的 Workload 与 PodGroup API,用于表达工作负载级调度需求,并移除 v1alpha1 Workload API
  • Workload 与 PodGroup API 与 Job 控制器集成,支持 gang scheduling(整组调度);
  • 新增准入插件,校验 PodGroup 引用的 Workload 存在且匹配声明的 PodGroupTemplate spec;
  • PodGroup 对象新增删除保护机制;
  • 调度成功后 kube-scheduler 更新 PodGroup 状态,写入 PodGroupScheduled condition,反映整组已调度或不可调度;
  • 为支持 workload-aware 抢占,Workload 与 PodGroup API 新增 DisruptionModePriorityClassNamePriority 字段(受 WorkloadAwarePreemption gate 控制);
  • 破坏性改动:PodGroupInfo 重命名为 PodGroupState,使用 Handle.WorkloadManager 的自定义调度插件可能受影响;
  • 新插件 PodGroupPodsCount:在组内优先为 Pod 数量更高的 placement 打分。

2. Topology-Aware Workload Scheduling(TAS,Alpha)

TopologyAwareWorkloadScheduling Feature Gate 之后新增了整套 TAS 能力:

  • PodGroup 上可表达 SchedulingConstraints 拓扑约束;
  • 调度器新增 PlacementGenerate 扩展点用于生成候选 placement,新增 PlacementScore 扩展点用于给 placement 打分,并将 MinNodeScore/MaxNodeScore 弃用为 MinScore/MaxScore
  • 新增 TopologyPlacement 插件实现 PlacementGenerate,调度 PodGroup 时把约束纳入考量;
  • PodGroup 调度周期内加入 TAS 逻辑,支持把 PodGroup 调度到拓扑域匹配的节点上;
  • NodeResourcesFit 插件被扩展以实现 PlacementScore
  • 主调度循环新增 PodGroup 调度周期,使一个 PodGroup 内所有 Pod 在单个周期内完成调度。

3. 抢占行为细化

  • WorkloadAwarePreemption 开启后,PodGroup 找不到 placement 时会对整组执行 workload-aware 抢占,而非对每个 Pod 执行默认抢占;
  • 处于 WaitOnPermit 的 Pod 被抢占时进入 backoff 队列而非标记为不可调度;
  • scheduler_preemption_victims 指标在异步/同步抢占两种模式下口径统一(均表示被选为 victims 的 Pod 数量)。

上述扩展点(PreBindPreFlightPlacementGeneratePlacementFeasible 等)的接口均定义于 pkg/scheduler/framework/interface.go,可供自定义插件作者查阅与实现。

五、DRA(Dynamic Resource Allocation):主版本推进最密集的子系统

v1.36 中 DRA 相关的 API Change/Feature 条目数量最多,整体呈现"核心能力全面 Beta/GA、周边新能力持续 Alpha"的态势。汇总如下:

能力 v1.36 状态 备注
DRA API 稳态化 Stable 更新 API 注释以反映 DRA 已稳定
DRAAdminAccess GA 允许 admin 对任意 claim/设备操作
DRAPrioritizedList GA 优先级列表分配
DRAConsumableCapacity 默认开启 可消费容量/共享计数器
DRA 扩展资源(extended resource) Beta 配额语义同时加固(修复了绕过管理员配额的口子)
DRAPartitionableDevices Beta 可分区设备
Device Binding Conditions(KEP #5007) Beta,默认开启 设备绑定条件
Device taints / tolerations(KEP #5055) Beta ResourceSlice 中 DeviceTaints 默认开启;DeviceTaintRules 需启用 resource.k8s.io/v1beta2 与 gate;修改 effect 时 taint 的 TimeAdded 自动更新
DRAListTypeAttributes(KEP-5491) Alpha(默认关闭) 设备属性支持 list 类型
DRANodeAllocatableResources Alpha ResourceSlice 新增 NodeAllocatableResourceMappings 映射设备到节点可分配资源
DRAResourcePoolStatus Alpha 新增 ResourcePoolStatusRequest API(v1alpha1)供外部调度器查询各 pool 设备可用性
DRAResourceClaimGranularStatusAuthorization Beta 细粒度 RBAC(见升级清单)

值得展开的 Alpha 新特性:

  • List 类型属性(KEP-5491,DRAListTypeAttributes:驱动可在 ResourceSlice 的设备属性中使用 bools/ints/strings/versions list 字段,单设备属性值(含标量与 list)总数上限 48matchAttribute 约束在候选设备 list 值交集非空时匹配,distinctAttribute(受 ConsumableCapacity 控制)要求各候选设备 list 值两两不相交,标量被隐式视为单元素集合;新增 CEL 函数 .includes,例如 device.attributes["dra.example.com"].model.includes("model-a"),便于驱动在标量与 list 类型之间平滑迁移。
  • PodGroup 共享 claim(突破 256 Pod 上限):PodGroup 可通过 spec.resourceClaims 引用 ResourceClaim/ResourceClaimTemplate;由 PodGroup 发起的 claim 为整组保留而非单 Pod,从而支持超过 256 个 Pod 共享同一个 ResourceClaim;PodGroup 引用的 ResourceClaimTemplate 会复制为专属该组的 ResourceClaim。
  • kubeletplugin 发布设备元数据:DRA 驱动可在 Pod 的 CDI 挂载中发布设备元数据(对应 CDI spec 升级到 v0.5.0)。
  • ReconcilePoolWithName:ResourceSlice 控制器新增按 pool 粒度协调的可选接口,无需在 slice 上设置 NodeName;"全节点可见"不再是默认值,需要显式声明集群级资源。

DRA 调度器内置实现位于 pkg/scheduler/framework/plugins/dynamicresources/(含测试 dynamicresources_test.go),其 PreBindPreFlight 已并行化。v1.36 还对其分配算法做了一系列正确性修复(详见第九节),例如结构化分配器(structured allocator)在探索候选时对共享计数器计数错误、同设备被双分配给不同 claim 的竞态、allocationMode: All 与 PrioritizedList 组合失效等。

六、存储与节点(Node/Kubelet/CSI/Volume)变化

1. 存储相关

  • ImageVolume 转 Stable,并新增 ImageVolumeWithDigest:容器状态中包含镜像卷的 digest;
  • VolumeAttributesClass gate 锁定为 true,首选存储版本升到 storage.k8s.io/v1
  • git-repo 卷插件默认禁用且无法再开启(deprecation);
  • 移除 in-tree Portworx 卷插件:删除 GA gate CSIMigrationPortworx(v1.33 起锁定)与 alpha gate InTreePluginPortworxUnregister,全部操作转向 CSI;
  • MutableCSINodeAllocatableCountGA(gate 锁定启用);
  • CSI 卷调度新行为可选择性开启(opt-in scheduling behavior for CSI volumes);
  • 新增 alpha(PersistentVolumeClaimUnusedSinceTime gate):PVC 保护控制器在无非终止 Pod 引用 PVC 时把 Unused=True(含 lastTransitionTime)写入 PVC status 的 Unused condition,便于外部自动化回收闲置存储;
  • SnapshotMetadataService 升到 v1beta1,移除 v1alpha1;
  • KCM pv-controller 减少对 CSI 卷的 get PV 请求;
  • CRD/Snapshot:HonorPVReclaimPolicy GA gate 删除(v1.33 起锁定)。

2. 节点与 kubelet

  • Feature Gate 转正/升 Beta
    • UserNamespacesSupportGA
    • NodeLogQueryGA(Windows 上亦生效);
    • ProcMountTypeGA
    • KubeletPSIGA(kubelet 通过 Summary API 暴露 Linux cgroup PSI 指标,含 CPU/内存/I/O 的 CPU/IO/内存压垮信息),并修复不支持 PSI 的 OS 上误报 0 值的问题;
    • InPlacePodLevelResourcesVerticalScalingBeta(默认开启):支持 Pod 级 CPU/内存资源原地 resize,修复 Pod 创建时误报 resize-in-progress 的缺陷;
    • RestartAllContainersOnContainerExitsBeta(默认开启):单容器 Pod 可快速重启,重启容器日志保留,lastTerminationStatus 匹配该动作;禁止对非 sidecar initContainer 设置 RestartContainer resize 策略(其 resize 从未被支持);
    • PLEGOnDemandRelist:保持在 Beta 但默认关闭
    • ReloadKubeletClientCAFile(默认开启):运行中更新 --client-ca-file 后,向 TLS 客户端宣告的受信 CA 立即生效。
  • MemoryQoS(cgroup v2,KEP-2570):新增分层内存保护——Guaranteed Pod 用 memory.min、Burstable Pod 用 memory.low,并配套节点级指标与回滚协调;KubeletConfiguration 新增 MemoryReservationPolicy 选项;当计算出的 requests 为 0 时显式写入 memory.min=0
  • Pod 级资源与拓扑/CPU/内存管理器联动:Topology、CPU、Memory 管理器可识别并作用于 pod.spec.resources,支持"混合容器 + Pod 级共享资源池"两种灵活模型。
  • 其他 kubelet 行为修复:ZFS 上因缺少 cadvisor 插件导致启动失败;修复 mirror pod 在 NodeDeclaredFeatures 开启时更新导致的空指针;server 证书按 IP 拨号时热加载;PodReadyToStartContainers 条件在 sandbox 创建后立即置位(不再等镜像拉取);CRI runtime handlers 排序输出避免无谓 Node 更新;插件管理器对注册失败改用指数退避重试(初值 500ms、每次翻倍、上限约 2 分钟)。
  • CRI 与流式传输:新增 RuntimeService 流式 RPC(StreamPodSandboxesStreamContainersStreamContainerStatsStreamPodSandboxStatsStreamPodSandboxMetrics)与 ImageService StreamImages;kubelet 新增提供节点上 Pod 信息的 gRPC 服务;cri-api 的 PullImageResponse.image_id 字段一度新增后又被回退。

七、API Machinery 与 client-go:informer 模型与序列化演进

v1.36 对 client-go 的 informer 核心做了多年少见的大改,全部以 Feature Gate 包裹:

  • AtomicFIFO(默认开启):默认 informer 行为改为——在逐个调用 handler 的 OnDelete/OnAdd/OnUpdate 之前,先用 list/relist 中的全部对象更新 store 状态,保证 handler 内观察到的 store 快照对应服务器某个 resourceVersion 的真实对象集合;同时改进 resync 处理,降低 store 锁竞争。需要时可关闭以临时恢复旧行为。
  • UnlockWhileProcessing(默认开启):informer 在排队事件处理期间即可入队新 watch 事件,避免事件突发时因慢处理竞争而丢 watch。
  • LastStoreSyncResourceVersion:store 跟踪自己已同步到的 resourceVersion,并提供 LastStoreSyncResourceVersion() 获取(未同步时返回空串,依赖 AtomicFIFO)。相关 gate 常量定义见 staging/src/k8s.io/client-go/features/known_features.go
  • InOrderInformers/RealFIFO GA:通过 RealFIFO 落实顺序化 informer;内部实现将逐步用 RealFIFO 取代 DeltaFIFO
  • 其他 client-go 修复:修复 informer 启动期罕见死锁;修复 Reflector 在收到 resourceVersion "0" 合成 ADDED 事件时对 watch 重启版本的误判;修复 StartEventWatcher 的 goroutine 热循环。

序列化与对象管理方面:

  • metav1.FieldsV1Raw 字段直接访问被弃用,迁移到 NewFieldsV1(string)GetRawBytes()GetRawString()SetRawBytes() 访问器;
  • k8s.io/api REST 类型移除临时 build-tag 的 ProtoMessage() 标记方法(protobuf 序列化应使用 k8s.io/apimachinery/pkg/runtime/serializer/protobuf);
  • 新增 staging 模块 k8s.io/streamingk8s.io/cri-streaming,承载流式传输与 CRI 流式服务端;apimachinery/pkg/util/httpstream(含 spdy/wsstream)保留为不推荐使用的兼容包装;抽出的 SPDY roundtripper 保留 NO_PROXY/no_proxy 的 CIDR 匹配;
  • CRD 校验严格化:schema 声明数值格式(int32/int64/float/double)时强制范围检查,存量越界对象通过 validation ratcheting 保留;
  • 服务端应用(SSA)系列修复:空数组/空 map 不再被误判为"不存在"、associative list 原子元素不再被复制、/status 子资源写入的字段属主修正。

八、认证、授权与安全

  • MutatingAdmissionPolicy 转 GA(v1,默认开启):变更准入策略正式可用;
  • ConstrainedImpersonation 转 Beta(默认开启):限制 impersonation 逃逸风险;慢请求可通过 apiserver.latency.k8s.io/impersonation 审计注解追踪;新增 4 个指标(labels:mode、decision):apiserver_impersonation_attempts_totalapiserver_impersonation_attempts_duration_secondsapiserver_impersonation_authorization_attempts_totalapiserver_impersonation_authorization_attempts_duration_seconds
  • ExternalServiceAccountTokenSignerGACSIServiceAccountTokenSecretsGA
  • kubelet 细粒度 API 鉴权 → stable
  • Pod Certificates(Beta):新增 spec.stubPKCS10Request,向期望 PKCS#10 CSR 的既有 CA 实现提供兼容(pkixPublicKeyproofOfPossession 被弃用);
  • manifest 形式的准入控制配置(KEP-5793,Alpha):开启 ManifestBasedAdmissionControlConfig 后,可通过 AdmissionConfiguration.staticManifestsDir 从磁盘加载准入 webhook 与 CEL 策略;这些策略自 apiserver 启动即生效、在 etcd 不可用时仍然存活、并防止基于 API 的准入资源被篡改;
  • client-go/transport:CA 根证书热加载(ClientsAllowCARotation,默认开启);TLS 缓存与证书轮换 goroutine 的垃圾回收(ClientsAllowTLSCacheGC,默认开启;未接入 gate 的二进制可用环境变量 KUBE_FEATURE_ClientsAllowTLSCacheGC=false 关闭),配套 rest_client_transport_cert_rotation_gc_calls_totalrest_client_transport_cache_gc_calls_total 指标;
  • 凭据插件 allowlist 中 AllowlistEntry.Name 重命名为 AllowlistEntry.Commandkubectl kuberc set 可设置 credentialPluginPolicycredentialPluginAllowlist
  • StrictIPCIDRValidation 在 kube-apiserver 默认开启:不再允许带前导 0 的 IP(如 010.000.000.005)或语义含糊的 CIDR(如 192.168.0.5/24 必须写成 192.168.0.0/24192.168.0.5/32)。

九、网络与集群生命周期

1. 网络(Service / kube-proxy)

  • Service .spec.externalIPs 开始输出弃用警告
  • RelaxedServiceNameValidation 转 Beta(默认开启):新建 Service 名称改用 NameIsDNSLabel() 校验,规则放宽;
  • discovery.k8s.io/v1 EndpointSlice 的 endpoints 字段在 OpenAPI 中更正为可选(与真实服务端行为一致);
  • ServiceCIDR 主资源写入时忽略请求中的 status 变更(与其余 API 一致),ServiceCIDRStatusFieldWiping gate 可临时关闭;
  • kube-proxy:修复 nftables 模式在 nft v1.1.3 上的兼容、大规则集加载的 CPU 优化、conntrack 陈旧 UDP 条目清理的时间复杂度优化、endpoints 全 unready 时的日志刷屏;大集群模式(超过 1000 个 endpoint)不再执行 full-sync;
  • kube-proxy IPVS/winkernel 回退到 v1.34 前行为(无变更时也定期复查规则,修复 v1.34 回归);winkernel 按 IP 族跟踪 load balancer,修复 Windows 上 PreferDualStack/RequireDualStack;Windows HNS 陈旧远端端点清理(L2Bridge,Pod IP 跨节点复用导致的 DNS 超时);
  • nf_conntrack_max 自动计算值被钳制到 1,048,576,防止高核机器内存过度消耗。

2. kubeadm 与 etcd

  • etcd 学习成员(learner)提升链路韧性:等待 learner 启动后再 promote;promote 对已是 voting member 的节点跳过 API 调用;learner 的 client URL 不再追加进 Endpoints
  • 检查 etcd 集群状态改用仲裁(quorum)判断而非所有成员健康,成员足够时不再失败;
  • kubeadm init 使用默认 admin.conf/super-admin.conf 路径时在内存中构造指向 localAPIEndpoint 的 kubeconfig,规避负载均衡器晚于首个 apiserver 就绪的问题;
  • kubeadm join:worker 节点跳过 LocalAPIEndpoint 默认值填充;获取 kubeadm-config ConfigMap 改用 KubernetesAPICall 超时(默认 1 分钟)而非可选的 350ms 短重试(kubeadm reset 等通过新参数 shortConfigMapGet 仍走短重试);以 --v=1+ 日志打印 discovery 用 CA 证书信息;
  • kube-apiserver 的 kubelet 客户端改用专用 ClusterRole system:kubelet-api-admin
  • extraArgs 覆盖不再按字母排序(仅默认参数排序),保留用户顺序以便控制 --service-account-issuer 等敏感顺序;
  • kubeadm upgrade 的 CreateJob 预检超时增至 1 分钟(Windows 更从容;pause 镜像拉取慢可先 kubeadm config images pull --kubernetes-version <目标版本> 预拉,或用 --ignore-preflight-errors 跳过);
  • 修复 kubeadm-flags.env 内容为 KUBELET_KUBEADM_ARGS="" 时 upgrade 失败;reset 时忽略 EINVAL;etc < v3.6.0 不再在版本映射支持范围内,弃用 etcd 的 --experimental-initial-corrupt-check/--experimental-watch-progress-notify-interval,改由 --feature-gates=InitialCorruptCheck=true--watch-progress-notify-interval 提供;
  • kubeadm init phase certs --dry-run 正确复制既有 CA 文件。

十、可观测性与 kubectl

1. 指标:Prometheus 原生直方图与大批量升级

所有核心组件(kube-apiserver、kube-controller-manager、kube-proxy、kube-scheduler、kubelet)在开启对应 Feature Gate 后支持 Prometheus 原生直方图,以经典与原生两种格式暴露,指数桶配置 factor=1.1、max buckets=160。

大批指标从 Alpha 升级到 Beta(获得更强的稳定性承诺):

  • component-base:kubernetes_build_inforest_client_requests_totalrest_client_request_duration_secondsrunning_managed_controllers
  • scheduler:scheduler_goroutinesscheduler_permit_wait_duration_secondsscheduler_plugin_evaluation_totalscheduler_plugin_execution_duration_secondsscheduler_scheduling_algorithm_duration_secondsscheduler_unschedulable_pods
  • 其他:workqueue 系列、HPA(reconciliations_totalreconciliation_duration_secondsmetric_computation_totalmetric_computation_duration_seconds)、Job 控制器两个指标、多个 EndpointSlice 指标、apiserver_storage_events_received_totalwatch_list_duration_seconds

新增的重要指标(按功能归类):

  • 调度:scheduler_pod_scheduled_after_flush_total(超时从 unschedulablePods 队列冲刷后被成功调度)、terminated_containers_total(按退出码分桶)、Device Binding Conditions 的两个指标;
  • apiserver:peer 代理错误指标 apiserver_peer_proxy_errors_totalapiserver_peer_discovery_sync_errors_total;informer 缓存层资源版本指标;informer_processing_latency_seconds(RealFIFO 事件处理延迟);WebSocket 流式 apiserver_websocket_streaming_requests_total / kubelet_streaming_websocket_requests_total
  • kubelet:kubelet_metrics_provider(识别指标来源);PSI GA;
  • 控制器:informer_queued_items(informer 队列长度)、daemonset_controller_stale_sync_skips_totaljob_controller_stale_sync_skips_total(stale cache 延迟同步计数);
  • cloud:route_controller_route_sync_total
  • 端到端告警注意事项:除改名指标外,dra_operations_duration_secondsis_error 标签此前反了,v1.36 修正为错误操作 is_error=true

2. /flagz/statusz/configz

  • config.k8s.io/flagzconfig.k8s.io/statusz API 升到 v1beta1
  • /flagz/statusz 启用 YAML 支持,并接入 apiserver 请求指标;
  • kubelet、kube-scheduler、cloud-controller-manager、kube-proxy 的 /configz 序列化 apiVersion/kind 并使用公开类型。

3. kubectl 与 CLI

  • kubectl explain -r--recursive 简写);kubectl explain 展示 EXTERNAL DOCS 区块;
  • kubectl diff 新增 --show-secretkubectl wait 支持多 condition;kubectl rollout undo 对 apply 管理的资源给出警告;
  • kubectl get node -o wide 输出新增 ARCH 列;kubectl describe node 展示聚合 ResourceSlice 并正确显示 Pod 级资源请求/限制;kubectl describe service 显示 appProtocol;CronJob describe 显示 timezonekubectl get ingressclass 为默认 IngressClass 标 (default)
  • kubectl exec/logs 指定不存在容器名时列出可用容器名;kubectl logs -f 在 ContainerCreating/PodInitializing 时等待容器启动而非立即失败;kubectl run -i/-it 不再丢失 attach 建立前的容器输出;kubectl attach/run 新增 --detach-keys
  • kubectl scale 输出反映期望副本数;kubectl describe 描述多对象时默认不展示相关事件(需显式 --show-events);kubectl kuberc 命令转 Beta;kustomize 升到 v5.8.1;kubectl delete 多个 StatefulSet Pod 修复。

十一、依赖与工具链演进

v1.36 全周期工具链与依赖升级信息(构建语言演进是补丁版本划分的重要标志):

版本 构建 Go 版本
v1.36.0-alpha.1/alpha.2 Go 1.25.6 → 1.25.7
v1.36.0 Go 1.26.0(后续补丁 1.26.1/1.26.2)
v1.36.1 Go 1.26.2
v1.36.2 Go 1.26.4
v1.36.3 Go 1.26.5
v1.36.4 不变

其余关键依赖:etcd client/镜像升至 v3.6.8;CoreDNS 升至 v1.14.2;pause 镜像 v3.10.2;cAdvisor 升至 v0.56.2(vendor 内 v0.53→v0.56);cri-tools v1.35.0;kube-dns v1.26.7;kustomize v5.8.1;structured-merge-diff/v6 升至 v6.3.3(1.36.3);sigs.k8s.io/knftables 0.0.21、grpc 1.79.3 等。v1.36.4 还专门升级 golang.org/x/textgolang.org/x/net 以包含安全更新。

被移除/替换的重要依赖值得注意:in-tree 的 github.com/docker/dockergithub.com/libopenstorage/openstorage(Portworx)、github.com/grpc-ecosystem/go-grpc-prometheusgo.uber.org/automaxprocsgotest.tools/v3 等退出依赖树;同时新引入 github.com/cenkalti/backoff/v5github.com/moby/moby/apigithub.com/moby/moby/clientgonum.org/v1/gonum 等。server 镜像改用 kube-log-runner 取代 go-runner(保留 /go-runner 路径兼容),为将来无 go-runner 的基础镜像做准备。

十二、补丁版本聚焦:值得逐个核对的修复

补丁版本集中修复了大版本引入或遗留的关键回归,建议升级到最新的 v1.36.4:

v1.36.1 关键修复

  • ZFS 文件系统上 kubelet 因缺少 cadvisor 插件启动失败;
  • Windows L2Bridge 网络下 Pod IP 复用导致的陈旧 HNS 端点未清理(曾引发 DNS 超时);
  • kube-proxy 大集群模式(>1000 endpoints)不再执行 full-sync;
  • kubeadm 若干 join/init 行为修正(localAPIEndpoint、quorum 检查、专用 kubelet ClusterRole)。

v1.36.2 关键修复

  • 服务端应用(SSA)回归:patch 容器类型(list/map)可能对原本成功的 apply 请求返回 422 required
  • 由 Secret 中二进制非 UTF-8 数据设置的容器环境变量在 v1.34+ 被破坏的问题;
  • 悬空 Job 调度指令(nodeSelector/tolerations/node affinity)在 JobSuspended 条件未置位前无法修改的回归;
  • CSI requiresRepublish=true 场景下 kubelet 误删挂载目录导致陈旧卷内容;
  • DRA 将互斥设备分区同时分配给多个 Pod 的缺陷(影响 SharedCounters + 多分配设备);
  • endpoint 控制器处理从未更新过的双栈前 Service 空 IPFamilies 时 panic。

v1.36.3 关键修复

  • kubelet 内存泄漏回归:每次 Pod sync 泄漏 context(v1.36 引入);
  • cri-api 回退到 v1.34 之前的 KeyValue.value JSON 编码;
  • kubeadm etcd learner 提升韧性、member 已是 voting member 时跳过 promote API 调用。

v1.36.4 关键修复

  • DRA 结构化分配器以 pool 名为共享计数器缓存键导致的错误分配判定(同名 pool 跨驱动串用);
  • 抢占竞态:preemptor Pod 可能卡在 unschedulable;
  • kubelet/DRA:重试部分失败的 PrepareResources 产生重复 CDI 设备 ID 导致容器启动失败;
  • FakeCustomStore 重新实现 Bookmark/LastStoreSyncResourceVersion,恢复对 cache.Store 接口的满足;
  • golang.org/x/textgolang.org/x/net 安全更新。

十三、升级检查清单与延伸阅读

结合以上内容,升级到 v1.36(或打满补丁的 v1.36.4)前建议按此清单自检:

  1. 监控:替换两个改名指标(volume_operation_errors_totaletcd_bookmark_total);确认依赖 Alpha 指标的告警会随升级变化。
  2. RBAC:若启用 DRA 细粒度授权(Beta),补齐 resourceclaims/bindingresourceclaims/driver 权限。
  3. 调度插件:若开发自定义 PreBind/PostFilter 插件,适配 PreBindPreFlightResult 与携带被抢占 Pod 的 PostFilterResult 新签名。
  4. 存储:确认无 git-repo/flexVolume/Portworx in-tree 依赖;如有,按上文方案迁移或自建 KCM 镜像。
  5. 网络:确认业务 IP/CIDR 字段无前导 0 写法;关注 Service externalIPs 弃用警告。
  6. 审计:按新默认值(maxage=366、maxbackup=100)评估磁盘容量。
  7. 清单 vs 现状:核对 pkg/features/kube_features.go 中上表列出的 gate 与默认值,结合自身版本确认。

如需追查某一具体变更的代码实现,建议按主题定位源码:调度扩展点见 pkg/scheduler/framework/interface.gopkg/scheduler/framework/plugins/;特性开关统一定义于 pkg/features/kube_features.go;client-go 新 gate 见 staging/src/k8s.io/client-go/features/known_features.go。仓库中的 CHANGELOG/README.md 还说明了 changelog 的组织方式,可按版本继续查阅 1.35 及更早版本的对应文件做对比。

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