ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

深入解析 Kubernetes Python 客户端 V1AllocatedDeviceStatus 模型:DRA 设备分配状态上报实战指南

深入解析 Kubernetes Python 客户端 V1AllocatedDeviceStatus 模型:DRA 设备分配状态上报实战指南 后端云原生容器编排【免费下载链接】pythonOfficial Python client library for kubernetes项目地址https://gitcode.com/gh_mirrors/python1/python点击查看免费下载V1AllocatedDeviceStatus是 Kubernetes 官方 Python 客户端kubernetes/kubernetes.aio两个包中用于承载 Dynamic Resource AllocationDRA动态资源分配设备分配状态的核心数据模型。本文以 doc/source/kubernetes.aio.client.models.v1_allocated_device_status.rst 文档页为骨架结合 模型源码 与仓库内生成的 API 参考文档完整讲解该模型的 7 个字段语义、约束校验、关联类型、序列化行为与实战用法读完即可在自己的 DRA 驱动或资源监控代码中正确读写设备分配状态。一、模型定位DRA 分配链路中的状态回执Kubernetes 的 Dynamic Resource AllocationDRA允许第三方驱动Driver在集群中管理 GPU、FPGA、网卡等异构资源。当调度器为一个ResourceClaim完成分配后驱动可以自行决定是否上报每个已分配设备的状态这份状态信息正是由V1AllocatedDeviceStatus模型承载的。从源码中的类文档可以确认其核心语义见 kubernetes/aio/client/models/v1_allocated_device_status.pyAllocatedDeviceStatus 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 informationDriver 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-driverpool对应驱动资源池的名字约束为最长 253 字符、可由斜杠分隔多个 DNS 子域device是资源池内某个具体设备实例的名称约束为 DNS label即小写字母、数字与连字符最长 63 字符以字母数字开头结尾。三者拼接即形成文档中明确给出的规范化引用形式driver name/pool name/device name这也是其他组件如 kubelet、监控系统反查设备归属时可直接解析的字符串。3.2 可选share_id共享份额标识share_idJSON 名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是任意objectPython 侧为Dict[str, Any]驱动可以放入版本信息、拓扑位置、序列号等私有数据。源码中给出的硬性约束为原始数据长度必须 ≤ 10 KiKiB。在设计驱动上报逻辑时应把大规模二进制信息放到独立 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.pyResourceClaimStatus.devicesOptional[List[V1AllocatedDeviceStatus]]存放该 claim 下每个已分配设备的状态条目由各自的驱动拥有同级的还有V1ResourceClaimStatus.allocationV1AllocationResult分配结果与reservedForList[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-L159validate_by_nameTrue、validate_by_aliasTrue构造对象时同时接受下划线属性名share_id和驼峰 wire 名shareIDvalidate_assignmentTrue赋值时也触发校验extraforbid拒绝未声明的额外字段传入未知键会直接报错有助于及早发现拼写错误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(serializeFalse)返回所有声明字段的字典表示默认使用公开/下划线命名wire 名为驼峰形式serializeTrue时输出 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( driverexample.com/gpu-driver, # DNS subdomain、小写、以厂商域名结尾 poolgpu-pool-a, # 资源池名最长 253 字符 devicegpu-0001, # 设备名必须是 DNS label share_idshare-0, # 可选共享份额标识 conditions[ V1Condition( typeReady, statusTrue, reasonConfigured, messagedevice configured according to claim, ) ], network_dataV1NetworkDeviceData( hardware_address00:1A:2B:3C:4D:5E, # ≤ 128 字节 interface_nameeth0, # ≤ 256 字节 ips[192.0.2.5/24, 2001:db8::5/64], # CIDR 记法 ), data{firmware: v2.3.1, topology: rack-07}, # 总长度 ≤ 10 Ki ) # 序列化默认输出下划线命名serializeTrue 输出 wire 驼峰命名 print(status.to_json())注意由于模型配置了extraforbid任何拼错字段名的键都会触发校验错误由于validate_assignmentTrue构造后的属性赋值同样会被校验适合在驱动上报逻辑中作为写入 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异步版asynciokubernetes.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 Kinetwork_data.hardware_address≤ 128 字节、interface_name≤ 256 字节构造前先做长度校验命名规则driver必须是小写 DNS subdomaindevice必须是 DNS labelpool最长 253 字符且可用斜杠分隔子域严格模式模型extraforbid多余字段会抛校验异常validate_by_name/validate_by_alias让share_id与shareID两种写法都可直接作为关键字参数传入IP 记法network_data.ips要求 CIDR 格式含掩码而不是裸 IP。掌握了V1AllocatedDeviceStatus的字段语义与序列化行为后无论是编写 DRA 驱动侧的状态上报还是编写读取ResourceClaim.status.devices的资源监控/调度插件都可以直接复用本仓库提供的官方模型避免手工解析状态 JSON 带来的字段漂移与类型风险。赞分享后端云原生容器编排【免费下载链接】pythonOfficial Python client library for kubernetes项目地址https://gitcode.com/gh_mirrors/python1/python点击查看免费下载相关推荐抖音视频无水印下载终极指南打造你的个人视频收藏库抖音视频无水印下载终极指南打造你的个人视频收藏库 你是否曾经被抖音上精彩的短视频所吸引却苦于无法保存这些转瞬即逝的精彩瞬间当看到那些精心制作的舞蹈教学、创后端云原生容器编排微信聊天记录永久保存终极指南WeChatMsg开源工具一键免费搞定微信聊天记录永久保存终极指南WeChatMsg开源工具一键免费搞定 一个残酷的现实是绝大多数人的微信聊天记录导出需求都是在数据真的丢了之后才被想起的。换手memorpy实战案例构建简单的游戏辅助工具 - Python内存操作终极指南memorpy实战案例构建简单的游戏辅助工具 Python内存操作终极指南 你是否曾经想过深入了解游戏内存的工作原理或者想要学习如何构建简单的游戏辅助工具上一篇Magic 1-For-1核心技术解析双阶段视频生成架构详解下一篇PairDrop大文件传输终极优化指南分块大小与并发数调整最佳实践创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表