☰
深入解析 Kubernetes Python 客户端 V1AllocatedDeviceStatus 模型:DRA 设备分配状态上报实战指南
2026/9/28 2:46:17 网站建设 项目流程
  • 后端
  • 云原生
  • 容器编排

【免费下载链接】python

Official Python client library for kubernetes

项目地址:https://gitcode.com/gh_mirrors/python1/python
点击查看免费下载

V1AllocatedDeviceStatus是 Kubernetes 官方 Python 客户端(kubernetes/kubernetes.aio两个包)中用于承载 Dynamic Resource Allocation(DRA,动态资源分配)设备分配状态的核心数据模型。本文以 doc/source/kubernetes.aio.client.models.v1_allocated_device_status.rst 文档页为骨架,结合 模型源码 与仓库内生成的 API 参考文档,完整讲解该模型的 7 个字段语义、约束校验、关联类型、序列化行为与实战用法,读完即可在自己的 DRA 驱动或资源监控代码中正确读写设备分配状态。

一、模型定位:DRA 分配链路中的"状态回执"

Kubernetes 的 Dynamic Resource Allocation(DRA)允许第三方驱动(Driver)在集群中管理 GPU、FPGA、网卡等异构资源。当调度器为一个ResourceClaim完成分配后,驱动可以自行决定是否上报每个已分配设备的状态,这份状态信息正是由V1AllocatedDeviceStatus模型承载的。

从源码中的类文档可以确认其核心语义(见 kubernetes/aio/client/models/v1_allocated_device_status.py):

AllocatedDeviceStatus contains the status of an allocated device, if the driver chooses to report it. This may include driver-specific information. The combination of Driver, Pool, Device, and ShareID must match the corresponding key in Status.Allocation.Devices.

也就是说:

  • 状态上报是可选的(driver chooses to report);
  • 内容可以包含驱动自定义信息(driver-specific information);
  • Driver + Pool + Device + ShareID四元组必须与Status.Allocation.Devices中的键严格一致,这是驱动侧写入时必须遵守的契约,否则状态将无法与分配结果对应。

二、属性全景:7 个字段的完整语义与约束

以下是该模型全部属性的完整清单(继承自仓库生成的 V1AllocatedDeviceStatus.md 属性表,并补充了源码中Field定义里更详细的约束说明):

字段(Python 属性名)JSON 字段名类型是否必填语义与约束
conditionsconditionsList[V1Condition]可选设备状态的最新观测结果。若设备已按 class 与 claim 配置引用完成配置,则Ready条件应为True。最多不能超过 8 条。
datadataobject(任意字典)可选驱动自定义的任意数据。原始数据长度必须 ≤ 10 Ki。
devicedevicestr必填引用驱动资源池中的一个设备实例名称,必须是 DNS label。
driverdriverstr必填DRA 驱动的名称;当 claim 在某节点上被需要时,kubelet 将调用该驱动的插件处理分配。必须是 DNS subdomain,应以驱动厂商拥有的 DNS 域结尾,且只能使用小写字符。
network_datanetworkDataV1NetworkDeviceData可选分配设备的网络相关细节(详见下文关联模型)。
poolpoolstr必填与driver、device共同标识被分配的设备,格式为<driver name>/<pool name>/<device name>。长度不超过 253 字符,可包含一个或多个以斜杠分隔的 DNS 子域。
share_idshareIDstr可选唯一标识该设备的一个分配共享份额(individual allocation share)。

说明:表中"JSON 字段名"为序列化时的 wire name(驼峰形式),Python 属性名为下划线形式,二者由模型内部的别名机制自动映射,详情见下文"序列化与别名"章节。

三、字段逐项深挖:从描述到校验规则

3.1 必填三元组:driver/pool/device

这三个字段共同构成设备在集群中的唯一身份标识:

  • driver决定由哪个 DRA 驱动的 kubelet 插件来消费该分配结果。源码要求其为 DNS subdomain 且使用小写字符,建议以驱动厂商自有域名结尾,例如example.com/gpu-driver;
  • pool对应驱动资源池的名字,约束为最长 253 字符、可由斜杠分隔多个 DNS 子域;
  • device是资源池内某个具体设备实例的名称,约束为 DNS label(即小写字母、数字与连字符,最长 63 字符,以字母数字开头结尾)。

三者拼接即形成文档中明确给出的规范化引用形式:<driver name>/<pool name>/<device name>,这也是其他组件(如 kubelet、监控系统)反查设备归属时可直接解析的字符串。

3.2 可选share_id:共享份额标识

share_id(JSON 名shareID)用于标识设备被"切分"出的单个分配份额。当一个物理设备支持时间片或分区共享时,同一设备的不同份额可通过该字段区分。源码注释强调:该四元组必须与Status.Allocation.Devices中的键一致,因此写入时切勿漏填或改拼写。

3.3conditions:设备健康与就绪状态

conditions是List[V1Condition],描述设备当前的最新状态观测。其关键约定:

  • 当设备已按照 class 和 claim 的配置引用完成配置后,驱动应将Ready条件置为True;
  • 列表条目数上限为 8,超出即违反 API 约束。

V1Condition是 Kubernetes 通用的条件类型(含type、status、reason、message、lastTransitionTime等字段),其模型定义同样位于仓库中,可参见 v1_condition 模块 及其对应的 文档页。

3.4data:驱动自定义负载

data是任意object(Python 侧为Dict[str, Any]),驱动可以放入版本信息、拓扑位置、序列号等私有数据。源码中给出的硬性约束为:原始数据长度必须 ≤ 10 Ki(KiB)。在设计驱动上报逻辑时,应把大规模二进制信息放到独立 CRD 或 ConfigMap 中,data只承载轻量元数据,避免超出长度限制导致写入被拒绝。

3.5network_data:网络设备上下文

network_data是可选的V1NetworkDeviceData类型,由驱动或其他组件填充,用于在网络上下文中配置或标识设备。它包含三个字段(见 v1_network_device_data.py):

字段JSON 名类型约束
hardware_addresshardwareAddressstr设备网卡的硬件地址(如 MAC 地址),不超过 128 字节
interface_nameinterfaceNamestr关联的网络接口名称(物理或虚拟,如注入 Pod 的接口),不超过 256 字节
ipsipsList[str]分配给设备网卡的 IP 地址列表,使用 CIDR 记法,如 IPv4 的"192.0.2.5/24"、IPv6 的"2001:db8::5/64"

四、模型在资源对象图中的位置

V1AllocatedDeviceStatus并非孤立模型,它作为V1ResourceClaimStatus.devices的列表元素被引用(见 v1_resource_claim_status.py):

  • ResourceClaimStatus.devices:Optional[List[V1AllocatedDeviceStatus]],存放该 claim 下每个已分配设备的状态,条目由各自的驱动"拥有";
  • 同级的还有V1ResourceClaimStatus.allocation(V1AllocationResult,分配结果)与reservedFor(List[V1ResourceClaimConsumerReference],当前允许使用该 claim 的实体列表,最多 256 条)。

因此,一个典型的 DRA 状态读取链路是:ResourceClaim.status.devices[]→V1AllocatedDeviceStatus[]→ 逐设备查看driver/pool/device、conditions、network_data。这也解释了为何文档强调四元组必须与Status.Allocation.Devices的键对应——正是为了让allocation与devices两个状态子结构可互相索引。

五、源码级实现:Pydantic 模型与序列化细节

5.1 基类与配置

该模型基于pydantic.BaseModel实现(异步版与同步版源码完全同构)。model_config的关键设置(见 源码 L153-L159):

  • validate_by_name=True、validate_by_alias=True:构造对象时同时接受下划线属性名(share_id)和驼峰 wire 名(shareID);
  • validate_assignment=True:赋值时也触发校验;
  • extra="forbid":拒绝未声明的额外字段,传入未知键会直接报错,有助于及早发现拼写错误;
  • protected_namespaces=():允许使用model_之类前缀的字段名。

5.2 别名机制

字段的 wire 名映射集中在attribute_map中:

attribute_map = { "conditions": "conditions", "data": "data", "device": "device", "driver": "driver", "network_data": "networkData", # 下划线 ↔ 驼峰 "pool": "pool", "share_id": "shareID", # 下划线 ↔ 驼峰 }

__preprocess_input_names类方法会在反序列化前把network_data/share_id这类下划线输入归一化为networkData/shareID,确保两种命名风格都能被正确解析(见 L136-L151)。

5.3 序列化与反序列化

模型提供了一套完整的转换接口:

  • to_dict(serialize=False):返回所有声明字段的字典表示,默认使用公开/下划线命名(wire 名为驼峰形式);serialize=True时输出 wire 名称;
  • to_json():返回使用 alias 的 JSON 字符串表示;
  • from_json(json_str):从 JSON 字符串构造实例;
  • from_dict(obj):从字典构造实例,会递归调用V1Condition.from_dict与V1NetworkDeviceData.from_dict处理嵌套子模型;
  • to_str()/__repr__:以pprint美化输出可读文本,便于调试。

六、实战:读写设备分配状态

6.1 从 JSON 字符串构造

仓库生成的官方示例(见 V1AllocatedDeviceStatus.md,同步版见 kubernetes/docs/V1AllocatedDeviceStatus.md)演示了最基础的 JSON ↔ 对象转换流程:

from kubernetes.aio.client.models.v1_allocated_device_status import V1AllocatedDeviceStatus # 从 JSON 字符串创建实例 json = "{}" v1_allocated_device_status_instance = V1AllocatedDeviceStatus.from_json(json) # 输出 JSON 字符串表示 print(V1AllocatedDeviceStatus.to_json()) # 转换为字典 v1_allocated_device_status_dict = v1_allocated_device_status_instance.to_dict() # 从字典还原实例 v1_allocated_device_status_from_dict = V1AllocatedDeviceStatus.from_dict(v1_allocated_device_status_dict)

6.2 构造一份真实的设备状态

下面是一份贴合字段约束的完整构造示例(模拟某 GPU 驱动上报一块已分配网卡设备的状态):

from kubernetes.aio.client.models.v1_allocated_device_status import V1AllocatedDeviceStatus from kubernetes.aio.client.models.v1_condition import V1Condition from kubernetes.aio.client.models.v1_network_device_data import V1NetworkDeviceData status = V1AllocatedDeviceStatus( driver="example.com/gpu-driver", # DNS subdomain、小写、以厂商域名结尾 pool="gpu-pool-a", # 资源池名,最长 253 字符 device="gpu-0001", # 设备名,必须是 DNS label share_id="share-0", # 可选:共享份额标识 conditions=[ V1Condition( type="Ready", status="True", reason="Configured", message="device configured according to claim", ) ], network_data=V1NetworkDeviceData( hardware_address="00:1A:2B:3C:4D:5E", # ≤ 128 字节 interface_name="eth0", # ≤ 256 字节 ips=["192.0.2.5/24", "2001:db8::5/64"], # CIDR 记法 ), data={"firmware": "v2.3.1", "topology": "rack-07"}, # 总长度 ≤ 10 Ki ) # 序列化:默认输出下划线命名;serialize=True 输出 wire 驼峰命名 print(status.to_json())

注意:由于模型配置了extra="forbid",任何拼错字段名的键都会触发校验错误;由于validate_assignment=True,构造后的属性赋值同样会被校验,适合在驱动上报逻辑中作为写入 API Server 前的"最后一道关卡"。

6.3 从 ResourceClaim 中读取

实际业务中,V1AllocatedDeviceStatus通常作为ResourceClaim.status.devices列表元素被读取,可遍历判断每个设备的就绪状态:

from kubernetes.aio.client.models.v1_resource_claim_status import V1ResourceClaimStatus def dump_claim_devices(claim_status: V1ResourceClaimStatus) -> None: for dev in (claim_status.devices or []): ready = any( c.type == "Ready" and c.status == "True" for c in (dev.conditions or []) ) print(f"{dev.driver}/{dev.pool}/{dev.device} share={dev.share_id} ready={ready}")

七、同步与异步两个入口

仓库同时提供两套完全同构的客户端:

  • 同步版:kubernetes.client.models.v1_allocated_device_status(源码见 kubernetes/client/models/v1_allocated_device_status.py,文档见 kubernetes/docs/V1AllocatedDeviceStatus.md);
  • 异步版(asyncio):kubernetes.aio.client.models.v1_allocated_device_status(即本文关联文档 doc/source/kubernetes.aio.client.models.v1_allocated_device_status.rst 对应的 automodule 模块,源码见 kubernetes/aio/client/models/v1_allocated_device_status.py)。

两个版本的类定义、字段与约束完全一致,仅在导入路径上区分。异步包的使用方式可参考仓库中的 examples_asyncio 示例(如 list_pods.py);同步包则参考 examples 目录。两类模型均已通过 kubernetes/aio/client/init.py 与 kubernetes/aio/client/models/init.py 导出,也可以直接从包根直接导入:

from kubernetes.client import V1AllocatedDeviceStatus # 同步 from kubernetes.aio.client import V1AllocatedDeviceStatus # 异步

八、使用注意事项小结

  • 四元组一致性:driver/pool/device/share_id必须与ResourceClaim.status.allocation.devices中的键完全匹配,这是状态能被正确关联的前提;
  • 条件数量:conditions最多 8 条,超限的列表不要提交;
  • 数据大小:data原始长度 ≤ 10 Ki,network_data.hardware_address≤ 128 字节、interface_name≤ 256 字节,构造前先做长度校验;
  • 命名规则:driver必须是小写 DNS subdomain,device必须是 DNS label,pool最长 253 字符且可用斜杠分隔子域;
  • 严格模式:模型extra="forbid",多余字段会抛校验异常;validate_by_name/validate_by_alias让share_id与shareID两种写法都可直接作为关键字参数传入;
  • IP 记法:network_data.ips要求 CIDR 格式(含掩码),而不是裸 IP。

掌握了V1AllocatedDeviceStatus的字段语义与序列化行为后,无论是编写 DRA 驱动侧的状态上报,还是编写读取ResourceClaim.status.devices的资源监控/调度插件,都可以直接复用本仓库提供的官方模型,避免手工解析状态 JSON 带来的字段漂移与类型风险。

  • 后端
  • 云原生
  • 容器编排

【免费下载链接】python

Official Python client library for kubernetes

项目地址:https://gitcode.com/gh_mirrors/python1/python
点击查看免费下载

相关推荐

上一篇:Magic 1-For-1核心技术解析:双阶段视频生成架构详解
下一篇:PairDrop大文件传输终极优化指南:分块大小与并发数调整最佳实践

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询