Skip to content

云原生

Kubernetes v1.36『Haru』:这个版本里真正要紧的是什么

Kubernetes v1.36 实践者导览:按负责各项变更的 SIG 分组:auth、node、scheduling、storage、DRA。

Todea Engineering

云原生实践

5 分钟阅读
#kubernetes#release#platform-engineering#security#dra
Kubernetes v1.36『Haru』:这个版本里真正要紧的是什么

Kubernetes 1.36 是一次巩固型版本:70 项增强中,动作最大的集中在 DRA 与加速器调度,以及最小权限安全(细粒度 kubelet 授权、user namespaces);另有两处可能破坏运行中集群的变更:被移除的 gitRepo 卷类型,和新近废弃的 service.spec.externalIPs。下面按 SIG 逐一说明变了什么,以及本周该做什么。

Kubernetes v1.36,代号 Haru,共包含 70 项增强:Stable 18 项、Beta 25 项、Alpha 25 项。下面是以运维者视角按负责各项变更的 SIG 分组整理的内容。每一节先以可快速扫读的表格列出该领域的条目,然后用一段短注释说明本季度值得动手去做的那一两件事。

SIG Auth 与 API Machinery

细粒度的 Kubelet API 授权 (#2862)StableKubeletFineGrainedAuthz 功能门升级为 GA,允许对 kubelet 的 HTTPS API(例如 nodes/healthznodes/metrics)进行细粒度的访问控制,而无需授予过于宽泛的 nodes/proxy 权限。
Mutating Admission Policies (#3962)Stable使用 Common Expression Language(CEL)在 YAML 中以声明式方式定义变更策略,作为 mutating webhook 的进程内替代方案。
服务账户令牌的外部签名 (#740)StableAPI server 现在可以把服务账户令牌的签名委派给外部 KMS。
节点日志查询 (#2258)Stable无需 SSH 即可读取节点系统日志的 kubelet 原生 API,例如 kubectl get --raw "/api/v1/nodes/node-1/logs?query=kubelet"
Constrained Impersonation (#5284)BetaConstrainedImpersonation 功能门升级为 Beta。允许有边界的 impersonation 授予,这样用户就无法模拟一个权限比自己更高的主体,堵住了一条常见的权限升级路径。
将 kubectl 用户偏好与集群配置分离 (#3104)Beta.kuberc 扩展支持为 credential exec 插件定义策略(allowlist 或 denylist),以强制更安全的认证实践。
IP/CIDR 校验改进 (#4858)BetaStrictIPCIDRValidation 特性升级为 Beta。加强地址校验以捕捉格式不正确的地址和前缀,例如 012.000.001.002 这类带前导零的地址,以及 ::ffff:1.2.3.4 这类 IPv4-mapped IPv6 地址。
Kubernetes 组件的 Flagz (#4828)BetaComponentFlagz 特性升级为 Beta,标准化了 /flagz 端点以暴露各组件启动时的命令行参数,方便集群运维者排障。
基于 manifest 的 admission 控制配置 (#5793)Alpha把 admission 控制配置从存储在 etcd 的对象迁移到 kube-apiserver 的基于文件的 manifest。

SIG Node

Pod 中的 User Namespaces (#127)Stable升级为 Stable。将容器里的 root 用户映射为宿主机上的非特权用户,这样即使进程逃出容器,也不会在底层节点上拥有管理员权限。对于需要在容器内以 root 运行的工作负载特别有用。
ProcMount 选项 (#4265)Stable升级为 Stable。在 securityContext 中新增 ProcMountType 字段,允许有选择地取消对 /proc 路径的屏蔽(/proc 的一部分默认被屏蔽以防止意外暴露宿主机信息)。
基于 cgroupv2 的 PSI 支持 (#4205)Stable升级为 Stable。kubelet 现在会报告 CPU、内存、I/O 的 Pressure Stall Information(任务等待资源的时间),相比传统的利用率指标,提供对资源争用的更细粒度视图。
Resource Health Status (#4680)Beta升级为 Beta。统一的 .status.allocatedResourcesStatus 字段会报告所有专用硬件的设备健康状态,无论其是通过旧的 Device Plugin API 还是 DRA 分配的。
HostNetwork Pod 的 User Namespaces (#5607)Alpha带有 hostNetwork: truehostUsers: false 的 Pod 只会被调度到明确声明支持该特性的节点上。有了 user namespaces,逃出受损容器的攻击者在宿主机层面的权限会被削减。

SIG Scheduling 与 Dynamic Resource Allocation (DRA)

如果你在运营加速器,这一块就是要紧的领域。DRA 是 Kubernetes 用于分配 GPU、FPGA 等专用硬件的灵活的、基于 claim 的 API,为工作负载提供了比旧的 Device Plugin API 更丰富的约束和共享策略。Core DRA 在 v1.34 升级为 GA;v1.36 延续了周边生态的成熟,关键的治理和选择类特性达到 Stable 和 Beta。

DRA: 为 ResourceClaims 添加 AdminAccess (#5018)Stable升级为 Stable。通过在 ResourceClaimResourceClaimTemplate 上新增的 adminAccess 标志,支持对设备的特权访问(用于调试、检查或管理任务)。命名空间必须被显式标记为 admin-access 才能允许创建这类 claim。这完成了多租户 GPU 和 AI 平台治理基础中的一个关键部分。
DRA: 设备 taints 和 tolerations (#5055)BetaDRA 驱动现在可以把设备标记为已 taint,从而将其排除在新 Pod 的调度之外;已经在使用被 taint 设备的 Pod 可以被自动停止。管理员也可以通过 DeviceTaintRule 对匹配选择条件的设备施加 taint(例如某驱动下的所有设备)。
DRA: 可分区设备 (#4815)Beta升级为 Beta。动态地把 GPU、TPU 这类硬件按需切分成更小的片段,而不要求提前固定分区,从而提升 NVIDIA MIG、多主机 TPU 切片等场景的利用率。
DRA: Resource Claim Status (#4817)BetaResourceClaim.Status 中新增 devices 字段,DRA 驱动可以在其中为每个分配的设备上报驱动自有的信息(conditions、任意数据,以及以标准化形式提供的网络相关信息,如接口名、MAC 地址、IP 地址)。提升了可观测性,并让第三方控制器(例如网络服务)可以直接从 claim 中消费设备信息。
Workload Aware Scheduling (多个 KEP)Alpha让调度器把一组相关的 Pod 当作单个逻辑单元来处理,而不是各自独立。引入了修订过的 Workload API 和一个新的、解耦的 PodGroup API,以及一个以原子方式对整组进行评估的调度周期:要么所有 Pod 一起被绑定,要么都不绑定。可以防止 ML 训练作业等分布式工作负载出现碎片化调度和资源浪费。

SIG Storage

OCI VolumeSource (#4639)Stable升级为 Stable。将 OCI artifact 和镜像直接作为只读卷挂载。
跳过递归式的 SELinux relabel (#1710)Stable升级为 Stable。在 SELinux 处于强制模式时加速 PersistentVolume 的挂载:通过传入 context 挂载选项,Kubernetes 把安全上下文应用于整个卷,而不是递归地给每个文件打标签。
CSI 驱动通过 secrets 获取 SA 令牌的 opt-in (#5538)Stable升级为 Stable。引入新的 secrets 字段,用来安全地存放挂载云桶时使用的服务账户令牌等敏感数据。当 serviceAccountTokenInSecrets 为 true 时,CSI 驱动会从 secrets 字段读取令牌。

SIG Autoscaling

HPA 基于 object 和 external 指标的 scale to/from zero (#2021)AlphaHPAScaleToZero 功能门后继续处于 Alpha。允许 HorizontalPodAutoscaler 在使用 Object 或 External 指标(例如队列长度)时把副本数缩到零,而不再要求至少有一个存活的 Pod 来采样 CPU 或内存。HPA 会在新的 ScaledToZero 状态字段中记录这一状态,因而不会复活被运维者固定为 replicas: 0 的 deployment,并在外部指标显示有新工作时立刻拉起第一个副本。对那些当前得为常开最小副本数付费的、突发性、队列驱动的工作负载很有用。

废弃与移除

service.spec.externalIPs (#5707)Deprecatedservice.spec.externalIPs 长期以来允许非特权用户在没有适当授权或校验的情况下声明任意地址。v1.36 将该字段废弃,并新增 AllowServiceExternalIPs 功能门以阻止 kube-proxy 为 externalIPs 编写规则。请迁移到 LoadBalancer 或 Gateway API。
gitRepo 卷插件 (#5040)RemovedgitRepo 卷类型自 v1.11 起就被废弃。v1.36 将其永久禁用,无法再被开启。仍在依赖 gitRepo 的工作负载必须迁移到受支持的替代方案,例如 init 容器或外部的 git-sync 式工具。
gogo/protobuf 依赖 (#5589)RemovedKubernetes API 以前依赖 gogoprotobuf,该库在 2021 年被废弃。本次增强完成了它在 Kubernetes API 对象上的最后移除。对终端用户基本不可见,但与 API 客户端维护者有关。

真正值得当作一次迁移项目来处理的废弃是 service.spec.externalIPs。多年来,这个字段在多租户集群中一直是中间人攻击和流量重定向的一条入口;废弃得都太晚了。如果你还在用它,请在字段被移除之前,而不是被移除之后,切换到 LoadBalancer 或 Gateway API 资源。从 v1.11 就一路走来的 gitRepo 移除终于落地了;如果你的 manifest 里还有,早就该换掉了。

本周该做什么

Kubernetes 1.36 主要是一次沿两条线推进的巩固型版本:作为加速器原生平台的 Kubernetes,日趋成熟的 DRA 治理、HPA scale-to-zero,以及更具工作负载感知的调度;以及作为最小权限平台的 Kubernetes,细粒度 kubelet 授权到达 GA、user namespaces 进入 Stable、externalIPs 走上废弃之路。

所以行动清单其实相当直接。审计任何 nodes/proxy 权限,迁移到细粒度的 kubelet 子资源。在 manifest 中搜索现在已经被废弃的 service.spec.externalIPs,以及在 1.36 中被移除、会让仍依赖它的 Pod 直接挂掉的 gitRepo。如果你用加速器,在非生产集群上启用 DRA,把关于 AdminAccess 和设备 taints 的立场先摸清楚。其他大多数变更都可以作为常规升级流程的一部分来处理。

FAQ

关于这次发布,我们最常被问到的三个问题。

Kubernetes 1.36 升级到生产集群安全吗?

对大多数团队来说是安全的。1.36 是一次把稳定、成熟特性整合在一起的版本。升级之前,请在 manifest 里检查一下 gitRepo(已被移除)和 service.spec.externalIPs。

我必须立刻把 service.spec.externalIPs 迁移掉吗?

不需要立刻迁移。计划在 v1.43 移除,但越早开始越好。迁移到 LoadBalancer Service 或 Gateway API 资源。

DRA AdminAccess 进入 Stable 对 GPU 和 AI 平台意味着什么?

在 ResourceClaim 上设置 adminAccess: true,你就能对共享 GPU 提交用于调试或检查的特权请求。这种请求只允许在带有 admin-access 标签的命名空间里创建。

本网站使用Cookie进行分析。