
后端云原生容器編排【免費下載鏈接】pythonOfficial Python client library for kubernetes項目地址https://gitcode.com/gh_mirrors/python1/python點擊查看免費下載導(dǎo)讀本文面向使用官方 Kubernetes Python 客戶端本項目倉庫gh_mirrors/python1/python的開發(fā)者系統(tǒng)講解V1beta2ResourceClaim模型——它是 Kubernetes 動態(tài)資源分配Dynamic Resource Allocation簡稱 DRA體系中描述工作負載需要訪問集群中哪些資源的核心對象。讀完本文你將掌握該模型的字段結(jié)構(gòu)、JSON 序列化規(guī)則、與ResourceV1beta2Api的聯(lián)動方式以及如何在同步kubernetes.client與異步kubernetes.aio.client兩種客戶端形態(tài)下構(gòu)造并提交一個真實的 ResourceClaim。本文以 doc/source/kubernetes.aio.client.models.v1beta2_resource_claim.rst 自動生成的模塊文檔為入口結(jié)合 kubernetes/aio/client/models/v1beta2_resource_claim.py 等源碼進行縱深解讀。一、模塊文檔與模型定位1.1 文檔入口與 automodule 機制關(guān)聯(lián)文檔 doc/source/kubernetes.aio.client.models.v1beta2_resource_claim.rst 是典型的 Sphinxautomodule自動 API 參考頁.. automodule:: kubernetes.aio.client.models.v1beta2_resource_claim :members: :show-inheritance: :undoc-members:它并不手工羅列成員而是指示 Sphinx 從kubernetes.aio.client.models.v1beta2_resource_claim模塊中提取全部公開成員:members:、繼承關(guān)系:show-inheritance:以及未寫文檔字符串的成員:undoc-members:最終渲染出V1beta2ResourceClaim類的完整參考。也就是說本文講述的真實文檔內(nèi)容就是該模型類的 docstring 與全部公開 API。1.2 模型在 DRA 架構(gòu)中的位置從源碼 docstring 與 OpenAPI 定義scripts/swagger.json中的v1beta2.ResourceClaim可知ResourceClaim 描述了工作負載對集群內(nèi)資源的訪問請求。例如若某個工作負載需要具有特定屬性的加速器設(shè)備accelerator device該請求正是通過 ResourceClaim 表達的status段記錄了該請求是否已被滿足以及具體分配了哪些資源。兩個關(guān)鍵前提源碼與 swagger 雙重確認見 kubernetes/aio/client/models/v1beta2_resource_claim.py這是一個alpha 級類型需要啟用DynamicResourceAllocationfeature gate生成的 OpenAPI 文檔版本為release-1.37見文件頭注釋。模型類繼承自pydantic.BaseModel采用 Pydantic v2 校驗體系配套生成類屬性openapi_types字段到類型的映射與attribute_mapPython 屬性名到 JSON 線上名映射并實現(xiàn)了to_dict/from_dict/to_json/from_json等序列化方法。完整的同步版本位于 kubernetes/client/models/v1beta2_resource_claim.py二者內(nèi)容一致分別服務(wù)于kubernetes.client與kubernetes.aio.client兩套包。二、字段結(jié)構(gòu)全景V1beta2ResourceClaim共聲明 5 個字段對應(yīng)__properties [apiVersion, kind, metadata, spec, status]下表匯總了字段、類型、JSON 線上名與說明字段Python類型JSON 線上名說明api_versionOptional[str]apiVersion對象的版本化 schema 標(biāo)識服務(wù)端應(yīng)將已識別的 schema 轉(zhuǎn)換為最新的內(nèi)部值并可能拒絕未識別的值kindOptional[str]kind對象所代表的 REST 資源類型字符串CamelCase不可更新metadataOptional[V1ObjectMeta]metadata標(biāo)準(zhǔn)對象元數(shù)據(jù)specOptional[V1beta2ResourceClaimSpec]spec描述請求什么資源以及如何配置該字段不可變immutablestatusOptional[V1beta2ResourceClaimStatus]status描述聲明是否已就緒可用以及已分配了什么資源對應(yīng)實現(xiàn)位于 kubernetes/aio/client/models/v1beta2_resource_claim.py其中openapi_types與attribute_map完整給出openapi_types: ClassVar[Dict[str, str]] { api_version: str, kind: str, metadata: V1ObjectMeta, spec: V1beta2ResourceClaimSpec, status: V1beta2ResourceClaimStatus } attribute_map: ClassVar[Dict[str, str]] { api_version: apiVersion, kind: kind, metadata: metadata, spec: spec, status: status }2.1 specV1beta2ResourceClaimSpeckubernetes/aio/client/models/v1beta2_resource_claim_spec.py 定義的V1beta2ResourceClaimSpec只有一個字段devices: Optional[V1beta2DeviceClaim]JSON 線上名同為devices含義為如何請求設(shè)備。也就是說v1beta2 的 ResourceClaim 聲明內(nèi)容全部收斂在DeviceClaim上。V1beta2DeviceClaim見 kubernetes/aio/client/models/v1beta2_device_claim.py包含三個列表字段字段類型說明configList[V1beta2DeviceClaimConfiguration]為多個潛在 driver 提供的配置在分配聲明時被忽略constraintsList[V1beta2DeviceConstraint]必須被分配給該聲明的設(shè)備集合整體滿足的約束requestsList[V1beta2DeviceRequest]對獨立設(shè)備的逐個請求必須全部被滿足為空則無需分配任何東西其中V1beta2DeviceConstraintv1beta2_device_constraint.py必須恰好設(shè)置requests之外的其中一個字段match_attribute要求所有設(shè)備都具有該屬性且類型與值一致例如dra.example.com/numa可確保設(shè)備處于同一 NUMA 節(jié)點屬性名必須帶域名限定符distinct_attribute與match_attribute相反要求所有設(shè)備在該屬性上互不相同例如為兩個網(wǎng)絡(luò)接口分配來自不同物理 NIC 的設(shè)備requests約束所作用的請求名列表支持main request/[subrequest]格式。而V1beta2DeviceRequestv1beta2_device_request.py則要求必須提供nameDNS label可在pod.spec.containers[].resources.claims中引用并通過互斥的兩種方式之一聲明所需設(shè)備exactly: V1beta2ExactDeviceRequest請求一個或多個完全相同的設(shè)備first_available: List[V1beta2DeviceSubRequest]按優(yōu)先級列出多個候選子請求調(diào)度器按列表順序嘗試第一個可用者勝出DRA 當(dāng)前尚未實現(xiàn)打分scoring。V1beta2ExactDeviceRequestv1beta2_exact_device_request.py的字段要點device_class_name必填引用某個 DeviceClass可繼承其額外的配置與選擇器allocation_mode可選ExactCount默認或AllExactCount下未指定count時默認 1count僅用于ExactCount模式必須大于 0selectors設(shè)備候選的過濾條件所有選擇器必須同時滿足tolerations最多 16 條用于容忍設(shè)備的 taint需啟用DRADeviceTaintsgatebetaadmin_access管理性訪問聲明需啟用DRAAdminAccessgatealphaderived_attributes通過 CEL 表達式計算的虛擬屬性最多 32 個需啟用DRADerivedAttributesgatealpha。V1beta2DeviceSubRequestv1beta2_device_sub_request.py與ExactDeviceRequest類似但不暴露adminAccess字段且額外要求name引用格式main request/subrequest。2.2 statusV1beta2ResourceClaimStatuskubernetes/aio/client/models/v1beta2_resource_claim_status.py 定義了三個字段字段Python類型JSON 線上名說明allocationOptional[V1beta2AllocationResult]allocation聲明被成功分配后由控制器寫入devicesList[V1beta2AllocatedDeviceStatus]devicesdriver 報告的每個已分配設(shè)備的狀態(tài)可包含 driver 專屬信息reserved_forList[V1beta2ResourceClaimConsumerReference]reservedFor當(dāng)前允許使用該聲明的實體最多 256 條預(yù)留值得關(guān)注的是 swagger 定義scripts/swagger.json中v1beta2.ResourceClaimStatus補充的兩種 OpenAPI 元數(shù)據(jù)devices為x-kubernetes-list-type: map以driver、device、pool、shareID為 map 鍵reservedFor同樣為 map 列表以uid為鍵并聲明x-kubernetes-patch-merge-key: uid與x-kubernetes-patch-strategy: merge即服務(wù)端支持按uid合并式 PATCH。V1beta2AllocatedDeviceStatusv1beta2_allocated_device_status.py包含conditions最多 8 條V1Condition設(shè)備就緒時Ready條件應(yīng)為 True、datadriver 自定義數(shù)據(jù)原始長度 ≤ 10 Ki、device、driver、pool三者共同構(gòu)成driver/pool/device標(biāo)識以及可選的shareID、networkData。V1beta2ResourceClaimConsumerReferencev1beta2_resource_claim_consumer_reference.py則用apiGroup、name、resource、uid四個字段精確定位一個消費者必須與 ResourceClaim 處于同一 namespace。V1beta2AllocationResultv1beta2_allocation_result.py記錄分配結(jié)果allocationTimestamp資源分配時間beta需啟用DRADeviceBindingConditions與DRAResourceClaimDeviceStatusgate、devicesV1beta2DeviceAllocationResult以及nodeSelector限定資源所在節(jié)點。三、字段名的駝峰轉(zhuǎn)換validation_alias 與序列化機制與早期python-legacy生成器不同本倉庫的模型以 Pydantic v2 為基礎(chǔ)對線上名wire name采用駝峰、Python 屬性名采用下劃線命名。例如api_version?apiVersionreserved_for?reservedForfirst_available?firstAvailabledevice_class_name?deviceClassName這在源碼中以validation_aliasAliasChoices(apiVersion, api_version)與serialization_aliasapiVersion成對出現(xiàn)見 v1beta2_resource_claim.py。__preprocess_input_names負責(zé)在反序列化時把下劃線鍵名映射為駝峰鍵名見 v1beta2_resource_claim_status.py因此構(gòu)造對象時兩種寫法均可V1beta2ResourceClaim(api_version...)或V1beta2ResourceClaim(apiVersion...)序列化到 JSON 時to_json()/to_dict(serializeTrue)一律輸出駝峰線上名與 Kubernetes API 服務(wù)器要求的 JSON 完全一致反序列化時from_dict()/from_json()對 API 服務(wù)器返回的駝峰 JSON 同樣可正確處理。模型配置model_config同時開啟了validate_by_nameTrue、validate_by_aliasTrue、validate_assignmentTrue并將extra設(shè)為forbid未知字段會觸發(fā)校驗錯誤protected_namespaces()允許字段名以model_等保留前綴開頭見 v1beta2_resource_claim.py。四、CRUD 操作與 ResourceV1beta2Api 聯(lián)動V1beta2ResourceClaim對象本身只是數(shù)據(jù)模型真正提交給集群需通過ResourceV1beta2Api異步版類位于 kubernetes/aio/client/api/resource_v1beta2_api.py。對應(yīng) REST 端點已在scripts/swagger.json中定義POST /apis/resource.k8s.io/v1beta2/namespaces/{namespace}/resourceclaimsDELETE /apis/resource.k8s.io/v1beta2/namespaces/{namespace}/resourceclaims/{name}GET /apis/resource.k8s.io/v1beta2/namespaces/{namespace}/resourceclaimsGET /apis/resource.k8s.io/v1beta2/resourceclaims跨 namespace 列舉4.1 異步創(chuàng)建create_namespaced_resource_claim核心方法簽名見 resource_v1beta2_api.pyasync def create_namespaced_resource_claim( self, namespace: Annotated[StrictStr, ...], body: V1beta2ResourceClaim, pretty: Optional[str] None, dry_run: Optional[str] None, field_manager: Optional[str] None, field_validation: Optional[str] None, ... ) - V1beta2ResourceClaim:參數(shù)說明namespace對象所在命名空間必填bodyV1beta2ResourceClaim實例必填請求成功返回 200/201/202 與新建的對象prettytrue時輸出美化 JSONdry_runAll表示執(zhí)行所有 dry-run 階段但不持久化field_manager關(guān)聯(lián)的 fieldManager 名稱≤ 128 個可打印字符field_validationIgnore丟棄未知字段v1.23 之前默認、Warn返回警告頭v1.23 默認、Strict遇到未知/重復(fù)字段直接報 BadRequest。4.2 完整的異步創(chuàng)建示例import asyncio from kubernetes import config from kubernetes.aio import config as aio_config from kubernetes.aio.client import ApiClient from kubernetes.aio.client.api import ResourceV1beta2Api from kubernetes.aio.client.models import ( V1ObjectMeta, V1beta2DeviceClaim, V1beta2DeviceRequest, V1beta2ExactDeviceRequest, V1beta2ResourceClaim, V1beta2ResourceClaimSpec, ) async def main(): # 使用集群外 kubeconfig也可改用 load_incluster_config await aio_config.load_kube_config() async with ApiClient() as client: api ResourceV1beta2Api(client) claim V1beta2ResourceClaim( api_versionresource.k8s.io/v1beta2, kindResourceClaim, metadataV1ObjectMeta(namegpu-claim, namespacedefault), specV1beta2ResourceClaimSpec( devicesV1beta2DeviceClaim( requests[ V1beta2DeviceRequest( namegpu, exactlyV1beta2ExactDeviceRequest( device_class_namegpu.example.com, count1, allocation_modeExactCount, ), ) ] ) ), ) created await api.create_namespaced_resource_claim( namespacedefault, bodyclaim, field_managermy-app ) print(created.to_dict()) asyncio.run(main())該示例使用了 examples_asyncio/ 目錄所體現(xiàn)的async with ApiClient()資源管理慣例以及kubernetes.aio.config的異步配置加載方式見 examples_asyncio/list_pods.py。4.3 同步形態(tài)若使用同步客戶端將導(dǎo)入路徑換成kubernetes.client即可類與方法的簽名保持一致from kubernetes import client, config config.load_kube_config() api client.ResourceV1beta2Api() claim client.V1beta2ResourceClaim( api_versionresource.k8s.io/v1beta2, kindResourceClaim, metadataclient.V1ObjectMeta(namegpu-claim, namespacedefault), specclient.V1beta2ResourceClaimSpec( devicesclient.V1beta2DeviceClaim( requests[ client.V1beta2DeviceRequest( namegpu, exactlyclient.V1beta2ExactDeviceRequest( device_class_namegpu.example.com, count1, allocation_modeExactCount, ), ) ] ) ), ) created api.create_namespaced_resource_claim(namespacedefault, bodyclaim)兩種客戶端的完整方法列表可見 kubernetes/README.mdResourceV1beta2Api一節(jié)包含 create/delete/list/patch/read/replace 以及 resourceclaimtemplate 相關(guān)方法。五、對象序列化與反序列化實踐V1beta2ResourceClaim繼承自 PydanticBaseModel并覆蓋了序列化接口常用方法方法說明to_dict(serializeFalse)返回 Python 字典鍵為 Python 屬性名下劃線風(fēng)格to_dict(serializeTrue)/to_json()輸出線上格式鍵為駝峰 JSON 名如apiVersion、reservedForfrom_dict(obj)從字典構(gòu)建實例自動處理駝峰/下劃線鍵名映射from_json(json_str)從 JSON 字符串構(gòu)建實例to_str()/__repr__打印友好的多行字符串表示便于調(diào)試?yán)鏲laim V1beta2ResourceClaim.from_dict({ apiVersion: resource.k8s.io/v1beta2, kind: ResourceClaim, metadata: {name: gpu-claim, namespace: default}, spec: {devices: {requests: [...]}}, }) print(claim.to_json()) # 輸出駝峰 JSON可直接用于 API 請求體源碼中的__openapi_generator_modern_projection見 v1beta2_resource_claim.py保證嵌套模型metadata、spec、status也通過各自的to_dict()遞歸轉(zhuǎn)換從而得到與 API 服務(wù)器一致的完整線上 JSON。六、使用前提與限制綜合源碼 docstring 與 swagger 定義使用V1beta2ResourceClaim需注意以下前提與限制feature gate類型本身為 alpha需在集群開啟DynamicResourceAllocation部分子字段還依賴額外 gate——DRAAdminAccessalpha、DRADerivedAttributesalpha、DRADeviceTaintsbeta、DRADeviceBindingConditions/DRAResourceClaimDeviceStatusbeta影響allocationTimestamp、DRAListTypeAttributes影響約束屬性的集合語義比較。不可變性spec不可更新swagger 明確標(biāo)注 The spec is immutable變更聲明需重建對象。配額與上限status.reservedFor最多 256 條預(yù)留ExactDeviceRequest.tolerations最多 16 條AllocatedDeviceStatus.conditions最多 8 條data原始長度 ≤ 10 KiBderived_attributes最多 32 個。name 約束DeviceRequest.name、DeviceSubRequest.name、AllocatedDeviceStatus.device必須為 DNS labeldriver必須為 DNS 子域且建議以廠商擁有的域名結(jié)尾。并發(fā)調(diào)度語義多調(diào)度器實例并發(fā)為同一 claim 預(yù)留消費者時僅最先到達 API Server 的更新會被存儲其余調(diào)度器需將 Pod 重新入隊等待聲明恢復(fù)可用見reservedFor的字段說明。七、源碼擴展閱讀指引模型主文件kubernetes/aio/client/models/v1beta2_resource_claim.py同步版模型kubernetes/client/models/v1beta2_resource_claim.pyspec 與 statusv1beta2_resource_claim_spec.py、v1beta2_resource_claim_status.py設(shè)備請求相關(guān)v1beta2_device_claim.py、v1beta2_device_request.py、v1beta2_exact_device_request.py、v1beta2_device_sub_request.py分配狀態(tài)相關(guān)v1beta2_allocation_result.py、v1beta2_allocated_device_status.py、v1beta2_resource_claim_consumer_reference.pyAPI 層kubernetes/aio/client/api/resource_v1beta2_api.py異步、kubernetes/client/api/resource_v1beta2_api.py同步OpenAPI 定義scripts/swagger.jsonv1beta2.ResourceClaim等定義客戶端方法索引kubernetes/README.md結(jié)語V1beta2ResourceClaim是官方 Kubernetes Python 客戶端中表達 DRA 資源請求的標(biāo)準(zhǔn)載體它以spec.devices描述要什么設(shè)備、滿足什么約束以status承載分配結(jié)果與消費方預(yù)留配合ResourceV1beta2Api的 CRUD 方法即可完整落地按需分配加速器/網(wǎng)卡等異構(gòu)設(shè)備的典型場景。理解其駝峰別名、不可變 spec 與各 feature gate 前提是正確、安全地使用這一 alpha 類型的基礎(chǔ)。贊分享后端云原生容器編排【免費下載鏈接】pythonOfficial Python client library for kubernetes項目地址https://gitcode.com/gh_mirrors/python1/python點擊查看免費下載相關(guān)推薦Kubernetes Python 客戶端 V1ResourceClaimTemplateSpec 模型詳解Dynamic Resource Allocation 的資源聲明模板開發(fā)指南Kubernetes Python 客戶端 V1ResourceClaimTemplateSpec 模型詳解Dynamic Resource Allocati后端云原生容器編排Kubernetes Python 客戶端 V1ResourceSliceSpec 模型詳解Dynamic Resource Allocation 資源切片聲明與序列化實踐Kubernetes Python 客戶端 V1ResourceSliceSpec 模型詳解Dynamic Resource Allocation 資源切片聲后端云原生容器編排Kubernetes Python 客戶端 V1beta2ResourceSliceSpec 模型全解析Dynamic Resource Allocation 的資源發(fā)布協(xié)議Kubernetes Python 客戶端 V1beta2ResourceSliceSpec 模型全解析Dynamic Resource Allocation后端云原生容器編排創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考