Kubernetes Blog 中文 笔记

Kubernetes Blog 中文

Kubernetes 的官方主页,是一个容器编排系统,用于自动化容器化应用程序的部署、缩放和管理。该平台提供了 Kubernetes 的详细文档,Kubernetes 是 Cloud Native Computing Foundation 维护的一个项目。它包括关于使用 Kubernetes 运行无状态和有状态应用程序、批处理作业和 CI/CD 工作流的详细信息。该网站包括详细的指南、教程、参考资料、API 文档和社区参与计划,以帮助用户开始使用 Kubernetes 并充分利用其特点来高效地管理基于云的应用程序。

笔记线程

Kubernetes 集群往往在面临 CPU 限制之前先遭遇内存限制,而新的代理式 AI 工作负载进一步加剧了这一难题。这些 AI 工作负载需要大量内存来启动和运行不可信代码,随后便处于空闲状态。这种空闲内存成本高昂,并限制了单个节点可托管的 Pod 数量。交换内存(Swap),尤其是由高速 NVMe SSD 支持的交换内存,可以通过将休眠内存分页出去来解决这一问题。Kubernetes 现已普遍可用地支持交换内存,使节点能够托管更多 Pod。在 CI/CD 构建、沙箱化浏览器和 Python 运行时等场景下的基准测试表明,交换内存可将密度提升高达三倍,且对延迟的影响微乎其微。历史上,由于内存记账问题和高磁盘延迟,交换内存一直被避免使用。然而,cgroup v2 和高速 NVMe SSD 解决了这些顾虑,使交换内存成为可行的解决方案。传统工作负载(如内核构建)在启用交换内存时可以容忍降低的内存限制。高密度代理工作负载(如无头浏览器)在启用交换内存后,Pod 密度显著提升。沙箱化 Python 运行时同样受益于交换内存,可实现三倍的并发会话数。启用节点交换涉及配置 kubelet 并使用云提供商的本地磁盘。具有 Burstable QoS 的工作负载可利用交换内存进行动态内存平衡。最终,快速交换内存能够卸载空闲内存状态,从而提高代理式工作负载的 Pod 密度和节点利用率。
Kubernetes 的采用使得管理复杂的应用生命周期、支持多样化的工作负载并确保可靠性成为可能。SIG Apps 由 Deployment 和 StatefulSet 等控制器组成,构成了 Kubernetes 中应用管理的基石。该小组专注于提升工作负载的韧性、优化生命周期管理,并解决运营挑战。SIG Apps 主席 Janet Kuo 和 Maciej Szulik 讨论了工作负载管理的演进及未来方向。SIG Apps 对于应用在 Kubernetes 上的运行方式至关重要,负责管理应用的创建、更新、扩缩容和恢复。随着 Kubernetes 支持更多样化的工作负载(如 AI 和批处理),SIG Apps 正在演进其 API 以提升可靠性和简洁性。当前的工作重点包括服务工作负载、改进发布和扩缩容性能,以及解决用户报告的问题。一个主要焦点是提升工作负载的韧性,特别是针对节点故障及其对 DaemonSet 和 Job 等工作负载的影响。新的子项目如 JobSet 和 LeaderWorkerSet 旨在处理大规模 AI 训练和推理中的故障。成功交付这些改进将减少 Kubernetes 平台团队进行手动干预的需求。SIG Apps 面临的一个关键挑战是在激进的控制器行为、必要的信号以及现有用户自动化的关键向后兼容性之间取得平衡。为避免破坏遗留系统,SIG Apps 倾向于采用可选功能(opt-in)并通过自定义资源定义(CRD)引入新范式。该小组还重新审视了如 KEP-4443 等提案,以通过提供更具体的失败原因来增强 Job API,从而改善自动化能力。鼓励新贡献者加入 #sig-apps Slack 频道,或为不断发展的子项目(如 Agent Sandbox)做出贡献。
Kubernetes v1.37 引入了关键的存储安全增强功能,以加强工作负载保护。这些功能允许直接在 Kubernetes 中配置 emptyDir 卷的权限模式和绑定挂载选项。这使得开发人员和安全专业人员能够在无需复杂变通方案的情况下实施严格的安全策略。这些改进基于根本的 Linux 安全机制,如绑定挂载标志和目录权限。绑定挂载标志(例如 noexec、nosuid 和 nodev)控制允许在已挂载的文件系统上执行的操作。目录权限(包括粘滞位)规范访问权限,并防止在共享目录中进行未经授权的删除操作。这些功能的主要动机是通过允许设置安全相关的绑定挂载选项来提升 Kubernetes 工作负载的安全性。此前,卷在挂载时未包含这些保护标志,从而造成了安全漏洞。所解决的一个重大差距是:无法为 emptyDir 卷设置挂载选项,且目录的默认权限模式为 0777。这导致任何进程均可访问、修改或删除 emptyDir 卷中的文件,而不论其所有权归属。新功能提供了原生解决方案,例如允许在 emptyDir 上设置粘滞位,以实现安全的共享工作区,其行为类似于 /tmp。这些增强功能使应用程序开发人员能够防止在可写挂载点上发生权限提升,并强制对应用程序数据实施最小权限原则。使用场景包括防止从可写卷执行任意二进制文件,以及保护多容器 Pod 中的共享临时存储空间。开发人员现在可以自信地通过设置特定模式(如 0750)来锁定对临时存储的访问。这两项功能在 v1.37 中当前处于 Alpha 阶段,需要启用功能门控:VolumeBindMountOptions 和 EmptyDirVolumeMode。这些新功能仅适用于 Linux,不影响 Windows 节点。
Kubernetes 存储 CSI 驱动中的“块变更跟踪”(Changed Block Tracking, CBT)功能最初于 2025 年 9 月以 Alpha 版本发布。该功能通过跟踪块卷内的变更来增强存储操作。Alpha 版本的发布说明详细阐述了其动机、核心组件及使用方法。目前,CBT 仅支持块卷,暂不支持基于文件的存储。external-snapshot-metadata 项目最近的 v1.0.0 版本发布将该功能提升至 Beta 阶段。Beta 阶段的主要更新是将 SnapshotMetadataService 自定义资源定义(CRD)从 v1alpha1 升级至 v1beta1。尽管 schema 保持不变,但旧的 v1alpha1 版本已被移除,用户需进行相应调整。从 Alpha 迁移至 Beta 需要用户重新应用 CRD 定义,更新其清单以使用新的 API 版本,并调整任何客户端或控制器代码。此迁移为手动的一次性过程。Beta 版本要求 Kubernetes 最低版本为 1.33,CSI 规范版本为 1.10 或更高。兼容的容器镜像为 csi-snapshot-metadata:v1.0.0。为测试该功能,请确保您的 CSI 驱动支持快照并包含 external-snapshot-metadata sidecar。安装 v1beta1 CRD 并为您驱动创建 SnapshotMetadataService 资源。然后,使用 lister 工具或自定义实现来调用 GetMetadataAllocated 和 GetMetadataDelta 函数。开发团队目前正致力于推动更广泛的 CSI 驱动采用,并在 Beta 期间收集运营反馈。他们鼓励 CSI 驱动维护者评估添加支持,并欢迎应用程序开发人员就流式客户端和迭代器包提供反馈。更多信息可查阅 CSI 开发者文档、KEP-3314、external-snapshot-metadata 仓库、gRPC schema 以及 snapshot-metadata-lister 示例。对该功能的贡献十分显著,有兴趣的个人被鼓励与 SIG Storage 和数据保护工作组进行互动。
Kubernetes v1.37 标志着 Memory QoS 进入 Beta 毕业阶段,现已默认在 Linux 节点上启用(基于 cgroup v2)。该功能通过利用内核内存控制器提供更优的引导,从而增强容器内存管理。Memory QoS 最初于 v1.22 以 Alpha 版本引入,并在 v1.36 中通过分层内存预留功能进行了扩展。Beta 升级意味着 MemoryQoS 功能门控在 v1.37 的所有 kubelet 中默认激活,无需进行显式配置更改。关键在于,默认 kubelet 配置不会启用内存节流或预留,除非用户明确选择启用。用户可以通过 kubelet 配置字段启用特定的 Memory QoS 行为。例如,设置 memoryThrottlingFactor 可为 Burstable 和 BestEffort 容器激活 memory.high 节流。或者,将 memoryReservationPolicy 配置为 TieredReservation,可通过 memory.min 和 memory.low 实现分层内存保护。v1.37 中的一个重大变更是 memoryThrottlingFactor 的默认值从 0.9 调整为 null,从而防止现有集群在升级时自动启用内存节流。这确保了除非显式配置其他行为,否则运行时行为保持一致。要配置 Memory QoS,集群操作员可以设置 memoryThrottlingFactor 以启用节流,设置 memoryReservationPolicy 以启用分层预留。两者可同时启用或独立启用。完全禁用 Memory QoS 可通过将功能门控设置为 false 并相应调整 kubelet 配置来实现。一个已知限制是内存预留为节点级,一致地应用于所有 Pod,无论其期望行为如何,从而影响对单个 Pod 的控制。Memory QoS 的下一个开发阶段是其毕业至通用可用(General Availability),持续的反馈将塑造未来的调整。
Kubernetes 传统上缺乏一种统一的方式来描述 Node 的生命周期状态,仅能提供基本的状态信息。这往往导致理解碎片化,并可能引发不同集群组件之间的冲突。Kubernetes v1.37 引入了五个众所周知的 Node 条件以填补这一空白。这些新条件包括 DrainInProgress、Drained、MaintenancePlanned、MaintenanceInProgress 和 GracefulNodeShutdownInProgress。每个条件使用 True、False 或 Unknown 状态来表示其当前状态。管理员或授权控制器负责设置和清除这些条件。目前,核心工作负载控制器不会针对这些条件采取行动,但它们通过信号化 Node 生命周期事件提供了操作层面的清晰度。例如,自动化系统可以在工作开始前设置 MaintenancePlanned,在工作开始后设置 MaintenanceInProgress。同样,驱逐自动化系统可以相应地设置 DrainInProgress 和 Drained。推荐的模式是:使用这些条件进行状态报告,同时仍利用现有的 Kubernetes 机制执行实际的操作,如隔离(cordon)和驱逐(drain)。这种共享信号至关重要,因为从调度器到外部维护系统的各种集群组件都需要理解 Node 状态。如果没有它,组件可能会做出相互冲突的决策,例如 DaemonSet 控制器替换了在优雅关闭期间被有意终止的 Pod。这些新条件为 Node 生命周期管理的未来增强提供了稳定的基础。Kubernetes 社区正在积极征求对这些新条件的反馈,以改进优雅节点关闭和维护等场景。
Kubernetes 1.37 为动态资源分配(DRA)带来了重大进展,扩展资源支持已达到通用可用(GA)状态。这使得 DRA 驱动能够无需独立的设备插件即可管理传统扩展资源。ResourceClaim 的状态中现在包含 devices 字段,从而提升了对设备状态(如网络接口名称和 IP 地址)的可见性。DRA 设备污点和容忍度现已稳定,通过镜像节点污点来管理设备可用性和维护。标准化的 numaNode 设备属性确保了不同驱动之间命名的一致性。ResourceClaim 的工作负载支持已推进至 Beta 阶段,允许单个声明被多个 Pod 共享,克服了先前的限制。DRA 设备属性向下 API 现已进入 Beta 阶段,支持直接将设备属性注入工作负载,简化了自定义控制器的需求。Alpha 阶段的功能包括属性的列表类型,支持更复杂的设备匹配,以及节点可分配资源请求,以防止节点过度订阅。资源可用性可见性已进入第二个 Alpha 阶段,提供时间点快照。DRA 的可选节点操作允许驱动跳过不必要的节点设置调用。Derived Attributes 是一项新的 Alpha 功能,使用 CEL 表达式实现基于自定义规则的灵活设备匹配。DRA 设备兼容性组可防止调度不兼容的设备组合。PreQueueingHint 扩展点也处于 Alpha 阶段,通过减少扩缩容期间的扫描范围来优化 Pod 调度。DRA 可消耗容量现已支持分数值,提升了资源分配的精度。这些持续的发展彰显了 Kubernetes 致力于提升资源管理能力的承诺。
Kubernetes 引入了 Pod 证书(Pod Certificates)和集群信任捆绑包(Cluster Trust Bundles)作为新的生产级身份机制。该功能现已普遍可用,将 X.509 证书签发直接集成到核心 Kubernetes 中,用于 TLS 和 mTLS。这是相对于之前主要机制——服务账户 JWT——的重大进步。虽然 JWT 具有易用性和广泛的兼容性,但其存在一个关键弱点:作为持有者令牌(bearer tokens),一旦泄露便容易遭受未经授权的访问。相比之下,Pod 证书基于非对称密码学的“持有证明”凭据,主要采用 X.509 证书。这通过要求证明持有者身份而非仅仅共享凭据本身,从而增强了安全性。目标是使 Kubernetes 工作负载使用 X.509 证书的过程与使用 JWT 一样简便,同时保持高标准的安全性。Pod 证书旨在提供灵活性,通过可插拔接口支持单个集群内多种类型的证书,这与服务账户 JWT 单一标准化的形式形成对比。未来的 Kubernetes 版本预计将提供内置的证书颁发程序,用于服务 DNS 名称和 SPIFFE 客户端证书。该架构涉及应用程序请求证书、Kubelet 发起请求并管理信任捆绑包,以及签名控制器(signer controller)履行这些请求并发布信任捆绑包。签发过程按时间顺序进行,从 Pod 调度开始,直至应用程序访问其密钥和证书。自动轮换已内置,应用程序需处理这些更新。安全检测已集成到 kube-apiserver 中,以强制实施隔离并防止受损节点获得不当访问权限。若要实验这些功能,用户需要安装第三方签名器(如 Tinycert),它提供示例签名器和库,以帮助应用程序加载 SPIFFE 证书。
Kubernetes 控制器通常使用 Go 语言,借助 kubebuilder 和 controller-runtime 进行开发,能够高效地处理分布式工作负载。然而,随着负载增加,深入理解 controller-runtime 的内部机制变得至关重要,以避免生产环境问题。其核心概念是:Reconciler 中的 r.Get() 和 r.List() 并不直接查询 API Server,而是访问本地内存缓存。该缓存最初通过一次列表操作填充,随后通过 Watch 机制持续维护。这种设计使得本地读取速度极快,避免了对控制平面的压力。然而,其代价是本地缓存可能消耗大量内存,且可能返回陈旧数据。相反,写入操作始终直接指向 API Server,绕过缓存。本地缓存的大小及索引策略直接影响内存使用。低效的 List() 操作可能导致对大量对象进行缓慢的线性扫描。Reconciliation Loop(对等循环)持续比较期望状态与实际状态,以使其保持一致。事件被加入队列,触发 Reconcile 函数,该函数读取当前状态、确定必要操作,并可能生成新事件。缓存的主要目的是为这些对等循环提供快速、最新的对象状态视图。这种基于 Watch 的模型源自 client-go,通过维护单个长连接来接收更新,从而避免了对 API 的持续轮询。controller-runtime 抽象了底层 client-go 组件(如 Reflector、DeltaFIFO 和 Indexer)的复杂性。Manager 负责协调共享缓存、控制器及其他服务。Informer 监控特定的 GVK,维护本地存储(Indexer),并将事件分发给订阅者。ResourceEventHandlers 处理这些事件,更新存储,进而反映在控制器的视图中。Workqueue 管理待由 Worker 处理的对象键,而 Predicates 则在入队前过滤事件。Reflector 是唯一直接与 API Server 交互的组件,执行初始列表操作,随后建立 Watch。它利用 resourceVersion 恢复 Watch 并确保不遗漏任何事件。如果 Watch 连接丢失或 API Server 指示 resourceVersion 过时,则执行重新列表(relist)。DeltaFIFO 充当变更的有序缓冲区,按对象键对 Delta 进行分组。它为自上次 Pop() 调用以来对象累积的所有变更提供数据,确保有序、批量的处理。然而,它不会合并连续的"Added"或"Updated"事件,这可能导致对快速变化的对象进行多次处理轮次。
Kubernetes 基于 CPU 和内存进行扩缩容,但现实场景中的需求往往需要自定义指标,例如队列深度或活跃连接数。Prometheus 指标导出器通过 HTTP 的 /metrics 端点以纯文本形式暴露应用状态,供 Prometheus 抓取,从而弥合这一差距。导出器可以是独立服务,也可以直接嵌入应用程序中,具体取决于数据源以及对应用代码的控制程度。Prometheus 期望指标采用特定格式:计数器(counters)用于持续递增的值,观测值(gauges)用于波动值,直方图(histograms)用于分布数据。指标名称应遵循清晰的蛇形命名法(snake_case)约定,即使用下划线分隔单词。使用 Go 构建导出器涉及初始化模块、配置 Prometheus 客户端库,并注册计数器、观测值和直方图等指标。这些指标随后由一个轮询循环更新,该循环从应用程序的数据源读取数据。HTTP 服务器暴露 /metrics 端点,同时提供 /healthz 端点用于存活探针。导出器通过多阶段 Docker 构建打包为精简的容器镜像,确保占用极小的资源。部署到 Kubernetes 集群时,需使用 Deployment 进行 Pod 管理,并使用 Service 为 Prometheus 提供稳定的地址。Prometheus 通过 ServiceMonitor 发现这些指标(若使用 Prometheus Operator),或通过 Pod 模板中的注解进行基于注解的发现。验证过程包括检查 Prometheus 的目标页面,确保导出器状态为"UP",并在表达式浏览器中查询指标。这一基础支持使用 HorizontalPodAutoscaler 进行自动扩缩容,该组件利用指标适配器(如 Prometheus Adapter)将自定义指标集成到 Kubernetes 自定义指标 API 中。这使得工作负载能够基于业务相关信号而非仅基础资源利用率进行扩缩容。
Volcano 是一款专为 Kubernetes 设计的云原生批处理调度器,面向高性能计算、AI/ML 及其他批处理工作负载。Kubernetes 最初是为长运行服务而构建,而批处理工作负载通常需要动态作业到达、资源竞争以及同时启动多个工作节点。Volcano 通过引入队列、优先级、配额和 Gang 调度等概念扩展了 Kubernetes,将工作负载视为整体而非独立的 Pod 进行管理。Volcano 为 Headlamp(一个可扩展的 Kubernetes Web UI)提供的插件将这些调度细节集成到单一界面中。该插件为 Volcano Jobs、Queues 和 PodGroups 提供专用视图,使批处理工作负载的运维和故障排查更加便捷。Job 视图显示工作负载状态、任务详情、Pod 状态,并支持直接执行挂起/恢复操作及访问日志。Queue 视图提供资源分配、容量及预留详情的洞察。PodGroup 视图则清晰展示 Gang 调度状态及潜在阻塞因素。关键特性是地图视图,它以可视化方式呈现 Jobs、Queues、PodGroups 和 Pod 之间的互联关系,有助于快速识别处于待处理或非进展状态的工作负载中的问题。该插件通过集中相关资源、结构化详情和运行时输出,增强了交互式故障排查体验,同时不替代用于自动化的 CLI 工具。未来的增强功能可能包括 Prometheus 集成及更丰富的调度洞察。用户可通过 Headlamp 的插件目录安装该插件,并提供反馈以推动其开发演进。
CdXz5zHNQW_lVauTs2nj6.png
CdXz5zHNQW_uA3Yt1MH58.png
本文聚焦于 SIG Storage,即负责持久化数据与卷管理的 Kubernetes 特殊兴趣组。SIG Storage 联合主席杨兴探讨了该小组从管理基础持久化卷到推进复杂存储功能的演进历程。Kubernetes 最初设计用于无状态工作负载,如今已支持有状态应用,因此需要专门的存储解决方案。SIG Storage 应运而生,引入了持久化卷(PersistentVolumes)和持久化卷声明(PersistentVolumeClaims)等基础原语。一项重大进展是容器存储接口(Container Storage Interface, CSI),它使第三方存储提供商能够在无需修改 Kubernetes 核心的情况下将其系统集成。当前工作包括卷组快照(Volume Group Snapshot)和变更块跟踪(Changed Block Tracking),前者支持崩溃一致的多卷快照,后者用于高效备份,两者近期均已晋升至稳定版本。容器对象存储接口(Container Object Storage Interface, COSI)也在推进中,旨在标准化对象存储集成。用户近期的收获包括 VolumeAttributesClass 晋升至通用可用(General Availability)阶段,允许动态调整存储属性(如 IOPS)。未来路线图涵盖卷健康检查(Volume Health),以提升运维可见性并实现潜在的自动修复。SIG Storage 寻求社区协助,包括修复漏洞、编写测试、审查代码以及对可变卷亲和性(Mutable PV Affinity)和卷复制等功能提供反馈。有状态工作负载面临的挑战包括数据重力、日常运维复杂性以及数据迁移。随着 AI 工作负载的增长,Kubernetes 中的存储预计将变得更加智能,对象存储的地位也将日益凸显。高性能、低延迟存储以及数据感知调度也是预期的趋势。SIG Storage 邀请社区参与,以应对这些不断演进的存储需求。
压力停滞信息(PSI)自 2018 年起已集成到 Linux 内核中,为在故障发生前识别资源饱和提供了高保真信号。与传统利用率指标不同,PSI 量化了 CPU、内存和 I/O 上的停滞任务及丢失时间。随着 Kubernetes v1.36 的发布,现已提供稳定的接口,用于在节点、Pod 和容器级别观察资源争用。PSI 提供停滞时间的累计总量以及移动平均值(10 秒、60 秒、300 秒),以区分瞬时尖峰与持续的资源紧张。SIG Node 对高密度工作负载(80+ 个 Pod)进行了广泛的性能测试,证明了 PSI 在生产环境中的就绪状态。通过切换 KubeletPSI 功能门控来测量的 Kubelet 开销显示,其对资源使用的影响微乎其微。Kubelet 的收集逻辑被证明非常轻量,能够无缝融入标准的维护周期,消耗的 CPU 资源低于 0.1 个核心或节点总容量的 2.5%。关于内核开销,在 Linux 内核中启用 PSI(psi=1 对比 psi=0)在重负载下导致一致的差值,为 0.037 至 0.125 个核心(占节点容量的 0.925% - 3.125%)。作为主要收集器的 kubelet 进程也保持了极低的 CPU 使用率,其尖峰不超过 0.25 个核心(6.25%),且持续时间未超过一秒。v1.36 中的改进包括更智能的指标发布机制:Kubelet 现在会在报告之前通过 cgroup 配置检测操作系统级别的 PSI 支持,从而防止出现误导性的零值指标。要使用 PSI,节点必须运行 Linux 内核 4.20+,使用 cgroup v2,并在操作系统层面启用 PSI(CONFIG_PSI=y,且无 psi=0 启动参数)。PSI 指标在 v1.36 中通常可用,无需功能门控选项。用户可以通过抓取 /metrics/cadvisor 端点或查询 Summary API 来获取数据。PSI 是 Linux 内核功能,在 Windows 节点上不可用。通过控制平面的 API 服务器代理到 Kubelet 的 HTTP API 可从 Summary API 获取实时压力数据,但这属于特权操作。
CdXz5zHNQW_xWB13lRlZh.png
Kubernetes v1.36 为卷组快照(volume group snapshots)提供了通用可用(General Availability, GA)支持,该功能此前曾作为 Alpha 和 Beta 阶段的增强特性。此功能利用扩展 API,支持对多个卷同时创建崩溃一致性快照。系统通过标签选择器对 PersistentVolumeClaim 对象进行分组,从而实现将工作负载恢复到一致恢复点。该功能仅支持 CSI 卷驱动,为需要写入顺序一致性的多卷应用程序提供了显著优势。此前,若在不同时间点单独对卷进行快照,可能导致数据不一致,尤其对于多卷应用程序而言。卷组快照消除了手动使应用程序静默的需求,可在无需繁琐、顺序执行单个卷快照的情况下,为组内所有卷提供崩溃一致性。Kubernetes 通过三种自定义 API 类型管理卷组快照:VolumeGroupSnapshot、VolumeGroupSnapshotContent 和 VolumeGroupSnapshotClass。这些 CRD 在 GA 版本中已晋升至 v1,分别允许用户请求卷组快照、跟踪其已配置的资源以及定义其创建策略。GA 版本带来了增强的稳定性、错误修复以及基于先前 Beta 版本反馈改进的 restoreSize 报告。要使用此功能,用户需对其 PersistentVolumeClaim 添加标签以进行分组,然后定义一个 VolumeGroupSnapshot 对象,其选择器匹配这些标签,并指定一个 VolumeGroupSnapshotClass。在恢复过程中,新的 PersistentVolumeClaim 将从属于更大 VolumeGroupSnapshot 的单个 VolumeSnapshot 对象创建。存储供应商可通过在其 CSI 驱动中实现新的组控制器服务和 RPC 来添加支持。
Kubernetes v1.36 中的动态资源分配(DRA)引入了重大进展,将其能力从专用硬件扩展至原生资源(如 CPU 和内存)。对各类硬件(包括网络)的驱动支持正在扩展,使 DRA 成为一种更硬件无关的解决方案。多项关键功能已毕业,增强了调度灵活性和集群利用率。优先级列表功能为设备请求提供回退偏好,提升了资源分配效率。扩展资源支持允许通过传统的扩展资源逐步过渡到 DRA。可划分设备为物理硬件动态划分为更小的逻辑实例提供了原生的 DRA 支持。设备污点使管理员能够更有效地管理硬件,通过防止故障设备被分配或预留特定硬件。设备绑定条件通过延迟 Pod 提交直至外部资源完全就绪,提高了调度可靠性。资源健康状态直接在 Pod 状态中暴露设备健康信息,有助于快速识别和应对硬件故障。新的 Alpha 功能包括针对工作负载的 ResourceClaim 支持,通过跨 PodGroup 管理共享资源来优化大规模 AI/ML。节点可分配资源将 CPU 和内存分配纳入 DRA 范畴,支持细粒度性能调优。DRA 资源可用性可见性为管理员提供实时设备容量信息,以更好地进行规划。确定性设备选择允许驱动通过字典序排序影响调度。容器中的可发现设备元数据为驱动向容器暴露设备属性提供了标准协议。未来路线图侧重于成熟现有功能,提升性能、可扩展性,以及与工作负载感知和拓扑感知调度的集成,并重点强调将用户从 Device Plugin 迁移至 DRA。
Kubernetes v1.36 引入了作为 Alpha 特性的 Pod 级资源管理器(Pod-Level Resource Managers),以增强对性能敏感型工作负载的资源管理。该特性将 kubelet 的拓扑管理器(Topology Manager)、CPU 管理器和内存管理器的功能扩展至以 Pod 为中心的资源分配模型,超越了以往仅针对容器的规格定义。此举解决了为主应用容器提供独占且与 NUMA 对齐的资源,同时高效支持轻量级边车容器(sidecars)的挑战。此前,要实现可预测的性能,通常需为所有容器分配独占资源,这对边车容器而言是一种浪费;反之,若不这样做,则会牺牲 Pod 的 Guaranteed QoS。Pod 级资源管理器支持混合分配模式,使高性能工作负载能够在不浪费资源的前提下实现 NUMA 对齐。例如,一个对延迟敏感的数据库 Pod 可使其主容器获得独占的 CPU 和内存,而边车容器则共享一个独立的 Pod 共享池(pod shared pool),该池与其他节点资源隔离。另一个应用场景涉及机器学习工作负载,其中训练容器获得独占的 NUMA 对齐资源,而服务网格边车容器则在节点范围的共享池中运行。CPU 隔离通过为独占容器禁用 CFS 配额执行,并在共享池容器层面强制执行来实现。启用该功能需要特定的 kubelet 功能门控(feature gates)、Topology Manager 策略以及静态的 CPU 和内存管理器配置。新的 kubelet 指标提供了对资源分配和容器分配的可见性。该功能目前处于 Alpha 阶段,存在已知限制和注意事项,欢迎用户通过 Kubernetes 社区渠道提供反馈。