这项工作是作为 SIG Node 领导的 KEP-753: Sidecar Containers 的一部分完成的。
Beta: Pod 垂直扩展的资源原地修改大小
工作负载可以使用 Deployment、StatefulSet 等 API 来定义。这些 API 描述了应该运行的 Pod 的模板,包括内存和 CPU 资源以及应该运行的 Pod 副本数量。工作负载可以通过更新 Pod 副本数量进行水平扩展,或者通过更新 Pod 容器所需的资源进行垂直扩展。在此增强之前,Pod 规范中定义的容器资源是不可变的,更新 Pod 模板中的任何这些细节都会触发 Pod 替换。
这项工作是作为 SIG CLI 领导的 KEP-3104: Separate kubectl user preferences from cluster configs 的一部分完成的。
毕业到 Stable 的特性
以下是 v1.33 版本后升级到 stable 的一些精选改进。
• 索引 Job 的每个索引回退限制 (Backoff limits per index for indexed Jobs)
此版本毕业了一个特性,允许为索引 Job 设置每个索引的回退限制。传统上,Kubernetes Job 中的 backoffLimit 参数指定了在将整个 Job 视为失败之前重试的次数。此增强功能允许索引 Job 中的每个索引拥有自己的回退限制,为单个任务的重试行为提供更细粒度的控制。这确保了特定索引的失败不会过早终止整个 Job,从而允许其他索引独立继续处理。
这项工作是作为 SIG Apps 领导的 KEP-3850: Backoff Limit Per Index For Indexed Jobs 的一部分完成的。
• 绑定的 ServiceAccount Token 安全性改进 (Bound ServiceAccount token security improvements)
此增强功能引入了一些特性,例如在 token 中包含唯一的 token 标识符(即 JWT ID Claim,也称为 JTI)和节点信息,从而实现更精确的验证和审计。此外,它支持节点特定的限制,确保 token 只能在指定的节点上使用,从而降低 token 滥用和潜在安全漏洞的风险。这些现已普遍可用的改进旨在增强 Kubernetes 集群中 Service Account token 的整体安全性。
这项工作是作为 SIG Auth 领导的 KEP-4193: Bound service account token improvements 的一部分完成的。
• kubectl 中的子资源支持 (Subresource support in kubectl)--subresource 参数现已普遍可用于 kubectl 子命令,例如 get, patch, edit, apply 和 replace,允许用户为所有支持子资源的资源获取和更新子资源。要了解更多关于支持的子资源的信息,请访问 kubectl 参考文档。
这项工作是作为 SIG CLI 领导的 KEP-2590: Add subresource support to kubectl 的一部分完成的。
• 多个 Service CIDR (Multiple Service CIDRs)
此增强功能引入了 Service IP 分配逻辑的新实现。在整个集群中,每个类型为 ClusterIP 的 Service 必须分配一个唯一的 IP 地址。尝试创建已分配特定集群 IP 的 Service 将返回错误。更新后的 IP 地址分配器逻辑使用了两个新稳定的 API 对象:ServiceCIDR 和 IPAddress。这些现已普遍可用的 API 允许集群管理员动态增加 ClusterIP 类型 Service 可用的 IP 地址数量(通过创建新的 ServiceCIDR 对象)。
这项工作是作为 SIG Network 领导的 KEP-1880: Multiple Service CIDRs 的一部分完成的。
• kube-proxy 的 nftables 后端 (nftables backend for kube-proxy)
kube-proxy 的 nftables 后端现已稳定,增加了一个新的实现,显著提高了 Kubernetes 集群内 Service 实现的性能和可扩展性。出于兼容性原因,iptables 在 Linux 节点上仍然是默认设置。如果您想尝试,请查看迁移指南。
这项工作是作为 SIG Network 领导的 KEP-3866: nftables kube-proxy backend 的一部分完成的。
• 带 trafficDistribution: PreferClose 的拓扑感知路由 (Topology aware routing with trafficDistribution: PreferClose)
此版本将拓扑感知路由和流量分发升级到 GA,这将允许我们在多区域集群中优化 Service 流量。EndpointSlices 中的拓扑感知提示将使 kube-proxy 等组件能够优先将流量路由到同一区域内的端点,从而降低延迟和跨区域数据传输成本。在此基础上,trafficDistribution 字段已添加到 Service 规范中,其 PreferClose 选项根据网络拓扑将流量导向最近的可用端点。此配置通过最大程度地减少区域间通信来增强性能和成本效益。
这项工作是作为 SIG Network 领导的 KEP-4444: Traffic Distribution for Services 和 KEP-2433: Topology Aware Routing 的一部分完成的。
• 拒绝非 SMT 对齐工作负载的选项 (Options to reject non SMT-aligned workload)
此功能为 CPU 管理器添加了策略选项,使其能够拒绝与同步多线程 (SMT) 配置不对齐的工作负载。此增强功能现已普遍可用,确保当 Pod 请求独占使用 CPU 核心时,CPU 管理器可以在启用 SMT 的系统上强制分配完整的核心对(包括主线程和兄弟线程),从而防止工作负载以非预期方式共享 CPU 资源的情况。
这项工作是作为 SIG Node 领导的 KEP-2625: node: cpumanager: add options to reject non SMT-aligned workload 的一部分完成的。
• 使用 matchLabelKeys 和 mismatchLabelKeys 定义 Pod 亲和性或反亲和性 (Defining Pod affinity or anti-affinity using matchLabelKeys and mismatchLabelKeys)matchLabelKeys 和 mismatchLabelKeys 字段在 Pod 亲和性条款中可用,使用户能够精细控制 Pod 预期共存(亲和性)或不共存(反亲和性)的范围。这些新稳定的选项补充了现有的 labelSelector 机制。亲和性字段有助于增强调度,适用于灵活的滚动更新,以及基于全局配置隔离由工具或控制器管理的 Service。
这项工作是作为 SIG Scheduling 领导的 KEP-3633: Introduce MatchLabelKeys to Pod Affinity and Pod Anti Affinity 的一部分完成的。
• 计算 Pod 拓扑分布倾斜时考虑污点和容忍度 (Considering taints and tolerations when calculating Pod topology spread skew)
此增强功能通过引入两个字段:nodeAffinityPolicy 和 nodeTaintsPolicy,改进了 PodTopologySpread。这些字段允许用户指定在计算 Pod 在节点间的分布时是否应考虑节点亲和性规则和节点污点。默认情况下,nodeAffinityPolicy 设置为 Honor,意味着只有符合 Pod 节点亲和性或选择器的节点才包含在分布计算中。nodeTaintsPolicy 默认为 Ignore,表示除非指定,否则不考虑节点污点。此增强功能提供了更精细的 Pod 放置控制,确保 Pod 被调度到满足亲和性和污点容忍度要求的节点上,从而防止 Pod 因未满足约束而保持 Pending 的情况。
这项工作是作为 SIG Scheduling 领导的 KEP-3094: Take taints/tolerations into consideration when calculating PodTopologySpread skew 的一部分完成的。
• 支持 Windows kube-proxy 中的直接服务返回 (DSR) (Support for Direct Service Return (DSR) in Windows kube-proxy)
DSR 通过允许通过负载均衡器路由的返回流量绕过负载均衡器并直接响应客户端来提供性能优化;减少负载均衡器上的负载,并降低总体延迟。有关 Windows 上 DSR 的信息,请阅读 直连服务器返回 (DSR) 简介。
最初在 v1.14 中引入,对 DSR 的支持已由 SIG Windows 作为 KEP-5100: Support for Direct Service Return (DSR) and overlay networking in Windows kube-proxy 的一部分提升到 beta。
• 用于网络接口的动态资源分配 (DRA) (Dynamic Resource Allocation (DRA) for network interfaces)
通过 DRA 标准化报告网络接口数据的功能于 v1.32 引入,并在 v1.33 中毕业到 beta。这使得更原生的 Kubernetes 网络集成成为可能,简化了网络设备的开发和管理。这已在之前的 v1.32 发布公告博客中介绍过。
这项工作是作为 SIG Network, SIG Node 和 WG Device Management 领导的 KEP-4817: DRA: Resource Claim Status with possible standardized network interface data 的一部分完成的。
• 当调度器 activeQ 中没有任何 Pod 时尽早处理未调度 Pod (Handle unscheduled pods early when scheduler does not have any pod on activeQ)
此功能改善了队列调度行为。在幕后,调度器通过在 activeQ 为空时从 backoffQ 中弹出因错误未退避的 Pod 来实现此目的。以前,即使 activeQ 为空,调度器也会处于空闲状态;此增强功能通过防止这种情况发生来提高调度效率。
这项工作是作为 SIG Scheduling 领导的 KEP-5142: Pop pod from backoffQ when activeQ is empty 的一部分完成的。
• Kubernetes 调度器中的异步抢占 (Asynchronous preemption in the Kubernetes Scheduler)
抢占通过驱逐较低优先级的 Pod 来确保较高优先级的 Pod 获得所需的资源。异步抢占于 v1.32 中作为 alpha 引入,并在 v1.33 中毕业到 beta。通过此增强功能,删除 Pod 等繁重操作可以并行处理,允许调度器继续调度其他 Pod 而不会延迟。此改进在 Pod churn 或频繁调度失败率高的集群中特别有益,确保了更高效和有弹性的调度过程。
这项工作是作为 SIG Scheduling 领导的 KEP-4832: Asynchronous preemption in the scheduler 的一部分完成的。
• 支持将镜像挂载为卷 (Support for mounting images as volumes)
支持在 Pod 中使用 Open Container Initiative (OCI) 镜像作为卷的功能于 v1.31 引入,并已毕业到 beta。此功能允许用户在 Pod 中将镜像引用指定为卷,同时在容器内将其作为卷挂载重复使用。这开启了将卷数据单独打包,并在 Pod 中的容器之间共享的可能性,而无需将其包含在主镜像中,从而减少漏洞并简化镜像创建。
这项工作是作为 SIG Node 和 SIG Storage 领导的 KEP-4639: VolumeSource: OCI Artifact and/or Image 的一部分完成的。
• 支持 Linux Pod 中的用户命名空间 (Support for user namespaces within Linux Pods)
截至撰写本文时,最老的开放 KEP 之一是 KEP-127,通过使用 Linux 用户命名空间改进 Pod 安全性。此 KEP 于 2016 年末首次开放,经过多次迭代,在 v1.25 中进行了 alpha 版本,在 v1.30 中进行了初始 beta 版本(默认禁用),并作为 v1.33 的一部分转移到默认启用 beta。
此支持不会影响现有 Pod,除非您手动指定 pod.spec.hostUsers 选择加入。正如 v1.30 抢先预览博客中强调的那样,这是缓解漏洞的重要里程碑。
这项工作是作为 SIG Node 领导的 KEP-127: Support User Namespaces in pods 的一部分完成的。
• Pod procMount 选项 (Pod procMount option)procMount 选项于 v1.12 中作为 alpha 引入,并在 v1.31 中作为默认禁用 beta,在 v1.33 中转移到默认启用 beta。此增强功能通过允许用户微调对 /proc文件系统的访问来改进 Pod 隔离。具体来说,它在 Pod securityContext 中添加了一个字段,允许您覆盖掩盖和标记某些 /proc 路径为只读的默认行为。这对于用户希望在使用用户命名空间的 Kubernetes Pod 中运行非特权容器的场景特别有用。通常,容器运行时(通过 CRI 实现)使用严格的 /proc 挂载设置启动外部容器。然而,要成功运行带有非特权 Pod 的嵌套容器,用户需要一种机制来放松这些默认设置,而此功能正提供了这一点。
这项工作是作为 SIG Node 领导的 KEP-4265: add ProcMount option 的一部分完成的。
• CPUManager 策略将 CPU 分布到 NUMA 节点 (CPUManager policy to distribute CPUs across NUMA nodes)
此功能为 CPU 管理器添加了一个新的策略选项,将 CPU 分布到非统一内存访问 (NUMA) 节点,而不是将它们集中在单个节点上。它通过平衡多个 NUMA 节点上的工作负载来优化 CPU 资源分配,从而提高多 NUMA 系统中的性能和资源利用率。
这项工作是作为 SIG Node 领导的 KEP-2902: Add CPUManager policy option to distribute CPUs across NUMA nodes instead of packing them 的一部分完成的。
• 容器 PreStop hook 的零秒休眠 (Zero-second sleeps for container PreStop hooks)
Kubernetes 1.29 在 Pod 的 preStop 生命周期 hook 中引入了 Sleep 操作,允许容器在终止前暂停指定时长。这提供了一种简单的方法来延迟容器关闭,以便进行连接耗尽或清理操作等任务。
preStop hook 中的 Sleep 操作现在可以接受零秒时长作为 beta 特性。这允许定义一个无操作的 preStop hook,这在需要 preStop hook 但不需要延迟时非常有用。
这项工作是作为 SIG Node 领导的 KEP-3960: Introducing Sleep Action for PreStop Hook 和 KEP-4818: Allow zero value for Sleep Action of PreStop Hook 的一部分完成的。
• 用于 Kubernetes 原生类型声明式验证的内部工具 (Internal tooling for declarative validation of Kubernetes-native types)
在幕后,Kubernetes 的内部机制开始使用一种新的机制来验证对象和对象的更改。Kubernetes v1.33 引入了 validation-gen,这是一个 Kubernetes 贡献者用于生成声明式验证规则的内部工具。总体目标是通过使开发人员能够声明式地指定验证约束来提高 API 验证的健壮性和可维护性,减少手动编码错误并确保代码库的一致性。
这项工作是作为 SIG API Machinery 领导的 KEP-5073: Declarative Validation Of Kubernetes Native Types With validation-gen 的一部分完成的。
Alpha 版新特性
以下是 v1.33 版本后进入 alpha 的一些精选改进。
• HorizontalPodAutoscaler 的可配置容忍度 (Configurable tolerance for HorizontalPodAutoscalers)
此功能引入了 HorizontalPodAutoscaler 的可配置容忍度,可以抑制对小指标变化的伸缩反应。
这项工作是作为 SIG Autoscaling 领导的 KEP-4951: Configurable tolerance for Horizontal Pod Autoscalers 的一部分完成的。
• 虽然自 v1.31 以来就可以使用设备分区,但供应商必须预先分区设备并相应地通告。通过在 v1.33 中启用 DRAPartitionableDevices feature gate,设备供应商可以通告多个分区,包括重叠的分区。Kubernetes 调度器将根据工作负载请求选择分区,并阻止同时分配冲突的分区。此功能使供应商能够在分配时动态创建分区。分配和动态分区是自动且对用户透明的,从而提高了资源利用率。这项工作是作为 KEP-4815: DRA: Add support for partitionable devices 的一部分完成的。
这些 feature gates 只有在您也启用了 DynamicResourceAllocation feature gate 时才会生效。
所有这些 DRA 工作都由 SIG Node, SIG Scheduling 和 SIG Auth 领导。
• 健壮的镜像拉取策略,用于验证 IfNotPresent 和 Never 的镜像 (Robust image pull policy to authenticate images for IfNotPresent and Never)
此功能允许用户确保 kubelet 对每组新的凭据都需要进行镜像拉取认证检查,无论镜像是否已存在于节点上。
这项工作是作为 SIG Auth 领导的 KEP-2535: Ensure secret pulled images 的一部分完成的。
• 节点拓扑标签通过 downward API 提供 (Node topology labels are available via downward API)
此功能使得节点拓扑标签可以通过 downward API 暴露。在 Kubernetes v1.33 之前,一个变通方法是使用 init 容器查询 Kubernetes API 以获取底层节点信息;此 alpha 功能简化了工作负载访问节点拓扑信息的方式。
这项工作是作为 SIG Node 领导的 KEP-4742: Expose Node labels via downward API 的一部分完成的。
• 通过 generation 和 observed generation 提供更好的 Pod 状态 (Better pod status with generation and observed generation)
在此更改之前,pod 的 metadata.generation 字段未使用。除了扩展以支持 metadata.generation 外,此功能还将引入 status.observedGeneration 以提供更清晰的 pod 状态。
这项工作是作为 SIG Node 领导的 KEP-5067: Pod Generation 的一部分完成的。
• 支持 kubelet 的 CPU 管理器中的拆分 L3 缓存架构 (Support for split level 3 cache architecture with kubelet’s CPU Manager)
之前的 kubelet 的 CPU 管理器不知道拆分 L3 缓存架构(也称为末级缓存,即 LLC),并且可能会在不考虑拆分 L3 缓存的情况下分配 CPU,导致“吵闹的邻居”问题。此 alpha 功能改进了 CPU 管理器,以更好地分配 CPU 核心,从而提高性能。
这项工作是作为 SIG Node 领导的 KEP-5109: Split L3 Cache Topology Awareness in CPU Manager 的一部分完成的。
• PSI (Pressure Stall Information) 指标用于改进调度 (PSI (Pressure Stall Information) metrics for scheduling improvements)
此功能增加了在 Linux 节点上使用 cgroupv2 提供 PSI 统计信息和指标的支持。它可以检测资源短缺,并为节点提供更细粒度的 Pod 调度控制。
这项工作是作为 SIG Node 领导的 KEP-4205: Support PSI based on cgroupv2 的一部分完成的。
• 使用 kubelet 进行无 Secret 的镜像拉取 (Secret-less image pulls with kubelet)
kubelet 的 on-disk 凭证提供程序现在支持可选的 Kubernetes ServiceAccount (SA) token 获取。通过允许云提供商更好地与 OIDC 兼容的身份解决方案集成,这简化了与镜像仓库的认证。
这项工作是作为 SIG Auth 领导的 KEP-4412: Projected service account tokens for Kubelet image credential providers 的一部分完成的。