ResourceClaim
apiVersion: resource.k8s.io/v1
import "k8s.io/api/resource/v1"
ResourceClaim
ResourceClaim 描述了工作負載對叢集中資源訪問的請求。例如,如果一個工作負載需要一個具有特定屬性的加速器裝置,這就是如何表達該請求的方式。Status 部分跟蹤此宣告是否已滿足以及分配了哪些特定資源。
這是一個 Alpha 型別,需要啟用 DynamicResourceAllocation 功能門控。
apiVersion: resource.k8s.io/v1
kind: ResourceClaim
metadata (ObjectMeta)
標準物件元資料
spec (ResourceClaimSpec),必需
Spec 描述了正在請求的內容以及如何配置它。該 spec 是不可變的。
status (ResourceClaimStatus)
Status 描述了宣告是否已準備好使用以及已分配了什麼。
ResourceClaimSpec
ResourceClaimSpec 定義了 ResourceClaim 中正在請求的內容以及如何配置它。
devices (DeviceClaim)
Devices 定義瞭如何請求裝置。
DeviceClaim 定義瞭如何使用 ResourceClaim 請求裝置。
devices.config ([]DeviceClaimConfiguration)
原子性:在合併期間將被替換
此欄位包含可滿足此宣告中請求的多個潛在驅動程式的配置。在分配宣告時將忽略它。
DeviceClaimConfiguration 用於 DeviceClaim 中的配置引數。
devices.config.opaque (OpaqueDeviceConfiguration)
Opaque 提供驅動程式特定的配置引數。
OpaqueDeviceConfiguration 包含驅動程式供應商定義的格式的驅動程式配置引數。
devices.config.opaque.driver (string),必需
Driver 用於確定需要將這些配置引數傳遞給哪個 kubelet 外掛。
驅動程式開發者提供的准入策略可以使用此欄位來決定是否需要驗證它們。
必須是 DNS 子域名,並且應該以驅動程式供應商擁有的 DNS 域名結尾。
devices.config.opaque.parameters (RawExtension),必需
Parameters 可以包含任意資料。驅動程式開發者負責處理驗證和版本控制。這通常包括自識別和版本(對於 Kubernetes 型別為 “kind” + “apiVersion”),以及不同版本之間的轉換。
原始資料長度必須小於或等於 10 Ki。
要使用它,請在您的外部版本化結構中建立一個型別為 RawExtension 的欄位,並在您的內部結構中建立一個 Object 欄位。您還需要註冊各種外掛型別。
// 內部包
type MyAPIObject struct { runtime.TypeMeta `json:",inline"` MyPlugin runtime.Object `json:"myPlugin"` } type PluginA struct { AOption string `json:"aOption"` }
// 外部包
type MyAPIObject struct { runtime.TypeMeta `json:",inline"` MyPlugin runtime.RawExtension `json:"myPlugin"` } type PluginA struct { AOption string `json:"aOption"` }
// 在線上傳輸時,JSON 看起來像這樣
{ "kind":"MyAPIObject", "apiVersion":"v1", "myPlugin": { "kind":"PluginA", "aOption":"foo", }, }
那麼會發生什麼?首先,Decode 使用 json 或 yaml 將序列化資料反序列化到外部 MyAPIObject 中。這導致原始 JSON 被儲存,但未解包。下一步是複製(使用 pkg/conversion)到內部結構中。執行時包的 DefaultScheme 安裝了轉換函式,這些函式將解包儲存在 RawExtension 中的 JSON,將其轉換為正確的物件型別,並將其儲存在 Object 中。(TODO:如果物件是未知型別,將建立並存儲一個 runtime.Unknown 物件。)*
devices.config.requests ([]string)
原子性:在合併期間將被替換
Requests 列出了配置適用的請求名稱。如果為空,則適用於所有請求。
對子請求的引用必須包含主請求的名稱,並且可以使用 <主請求>/[<子請求>] 的格式包含子請求。如果只給出主請求,則配置適用於所有子請求。
devices.constraints ([]DeviceConstraint)
原子性:在合併期間將被替換
這些約束必須由為宣告分配的裝置集合滿足。
DeviceConstraint 除了 Requests 之外,必須正好設定一個欄位。
devices.constraints.distinctAttribute (string)
DistinctAttribute 要求所有相關裝置都具有此屬性,並且其型別和值在這些裝置中是唯一的。
這與 MatchAttribute 的作用相反。
此約束用於透過確保屬性級別的差異化來避免將多個請求分配給同一裝置。
這對於資源請求必須由單獨的物理裝置滿足的場景很有用。例如,容器請求兩個網路介面,這些介面必須從兩個不同的物理網絡卡分配。
devices.constraints.matchAttribute (string)
MatchAttribute 要求所有相關裝置都具有此屬性,並且其型別和值在這些裝置中是相同的。
例如,如果您指定 "dra.example.com/numa"(一個假設的例子!),那麼將只選擇同一 NUMA 節點中的裝置。沒有該屬性的裝置將不會被選擇。所有裝置應為該屬性使用相同型別的值,因為這是其規範的一部分,但如果某個裝置不使用,則它也不會被選擇。
必須包含域名限定符。
devices.constraints.requests ([]string)
原子性:在合併期間將被替換
Requests 是此宣告中必須共同滿足此約束的一個或多個請求的列表。如果請求由多個裝置滿足,則所有裝置都必須滿足約束。如果未指定此項,則此約束適用於此宣告中的所有請求。
對子請求的引用必須包含主請求的名稱,並且可以使用 <主請求>/[<子請求>] 的格式包含子請求。如果只給出主請求,則約束適用於所有子請求。
devices.requests ([]DeviceRequest)
原子性:在合併期間將被替換
Requests 表示對必須全部滿足的不同裝置的單個請求。如果為空,則無需分配任何內容。
DeviceRequest 是對宣告所需裝置的請求。這通常是對單個資源(如裝置)的請求,但也可以請求多個相同的裝置。透過 FirstAvailable,還可以提供一個按優先順序排序的請求列表。
devices.requests.name (string),必需
Name 可用於在 pod.spec.containers[].resources.claims 條目和宣告的約束中引用此請求。
當 Exactly 欄位設定時,使用 DeviceRequest 中的名稱引用將唯一標識一個請求。當 FirstAvailable 欄位設定時,對 DeviceRequest 名稱的引用將匹配排程器選擇的任何子請求。
必須是 DNS 標籤。
devices.requests.exactly (ExactDeviceRequest)
Exactly 指定了單個請求的詳細資訊,該請求必須完全滿足才能使請求得到滿足。
Exactly 或 FirstAvailable 必須設定一個。
ExactDeviceRequest 是對一個或多個相同裝置的請求。
devices.requests.exactly.deviceClassName (string),必需
DeviceClassName 引用一個特定的 DeviceClass,該 DeviceClass 可以定義此請求將繼承的附加配置和選擇器。
DeviceClassName 是必需的。
管理員可以使用此項來限制哪些裝置可以透過僅安裝帶有允許裝置選擇器的類來請求。如果使用者可以自由請求任何內容而沒有限制,則管理員可以為使用者建立一個空的 DeviceClass 以供引用。
devices.requests.exactly.adminAccess (boolean)
AdminAccess 表示這是一個對裝置進行管理訪問的宣告。具有 AdminAccess 的宣告預計用於裝置的監控或其他管理服務。它們將忽略裝置的所有普通宣告,無論訪問模式和任何資源分配如何。
這是一個 Alpha 欄位,需要啟用 DRAAdminAccess 功能門控。如果此欄位未設定或設定為 false,則停用管理訪問;否則啟用。
devices.requests.exactly.allocationMode (string)
AllocationMode 及其相關欄位定義瞭如何分配裝置以滿足此請求。支援的值為:
ExactCount:此請求針對特定數量的裝置。這是預設值。確切數量在 count 欄位中提供。
All:此請求針對池中所有匹配的裝置。節點上至少需要存在一個裝置才能成功分配。如果某些裝置已被分配,則分配將失敗,除非請求了 adminAccess。
如果未指定 AllocationMode,則預設模式為 ExactCount。如果模式為 ExactCount 且未指定 count,則預設數量為 1。任何其他請求必須指定此欄位。
將來可能會新增更多模式。客戶端必須拒絕處理具有未知模式的請求。
devices.requests.exactly.capacity (CapacityRequirements)
Capacity 定義了針對每個容量的資源要求。
如果此欄位未設定且裝置支援多重分配,則將根據 requestPolicy 將預設值應用於每個容量。對於沒有 requestPolicy 的容量,預設值為完整容量值。
適用於每個裝置分配。如果 Count > 1,如果滿足要求的裝置不足,則請求失敗。如果 AllocationMode 設定為 All,如果存在其他匹配請求且具有此容量的裝置,其值 >= 請求量,但無法分配給此請求,則請求失敗。
CapacityRequirements 定義了特定裝置請求的容量要求。
devices.requests.exactly.capacity.requests (map[string]Quantity)
Requests 表示對不同資源的單個裝置資源請求,所有這些資源都必須由裝置提供。
此值用作裝置可用容量的附加過濾條件。這在語義上等同於帶有 `device.capacity[\<domain>].\<name>.compareTo(quantity(\<request quantity>)) >= 0` 的 CEL 選擇器。例如,device.capacity['test-driver.cdi.k8s.io'].counters.compareTo(quantity('2')) >= 0。
當定義了 requestPolicy 時,請求的數量會根據策略向上調整到最接近的有效值。如果請求的數量無法調整到有效值(因為它超出了 requestPolicy 允許的範圍),則該裝置被視為不符合分配條件。
對於任何未明確請求的容量:- 如果未設定 requestPolicy,則預設消耗容量等於裝置的全部容量(即,整個裝置被宣告)。
- 如果設定了 requestPolicy,則預設消耗容量根據該策略確定。
如果裝置允許多重分配,則所有請求的總量不得超過容量值。消耗的容量(如果定義了 requestPolicy,可能會根據策略進行調整)記錄在資源宣告的 status.devices[*].consumedCapacity 欄位中。
devices.requests.exactly.count (int64)
Count 僅在計數模式為 "ExactCount" 時使用。必須大於零。如果 AllocationMode 為 ExactCount 且未指定此欄位,則預設值為 1。
devices.requests.exactly.selectors ([]DeviceSelector)
原子性:在合併期間將被替換
Selectors 定義了特定裝置必須滿足的條件,以便該裝置被考慮用於此請求。所有選擇器都必須滿足才能考慮裝置。
devices.requests.exactly.selectors.cel (CELDeviceSelector)
CEL 包含用於選擇裝置的 CEL 表示式。
CELDeviceSelector 包含用於選擇裝置的 CEL 表示式。
devices.requests.exactly.selectors.cel.expression (string),必需
Expression 是一個評估單個裝置的 CEL 表示式。當所考慮的裝置滿足所需條件時,它必須評估為 true,否則評估為 false。任何其他結果都是錯誤,並導致裝置分配中止。
表示式的輸入是一個名為 "device" 的物件,它具有以下屬性:
- driver (字串): 定義此裝置的驅動程式名稱。
- attributes (map[string]object): 裝置的屬性,按字首分組(例如 device.attributes["dra.example.com"] 評估為一個包含所有以 "dra.example.com" 為字首的屬性的物件)。
- capacity (map[string]object): 裝置的容量,按字首分組。
- allowMultipleAllocations (bool):裝置的 allowMultipleAllocations 屬性(v1.34+ 啟用 DRAConsumableCapacity 功能時)。
示例:考慮一個驅動程式為 "dra.example.com" 的裝置,它暴露了名為 "model" 和 "ext.example.com/family" 的兩個屬性,並暴露了一個名為 "modules" 的容量。此表示式的輸入將具有以下欄位:
device.driver device.attributes["dra.example.com"].model device.attributes["ext.example.com"].family device.capacity["dra.example.com"].modules
device.driver 欄位可用於檢查特定驅動程式,既可以作為高階前提條件(即您只考慮此驅動程式的裝置),也可以作為多子句表示式的一部分,旨在考慮來自不同驅動程式的裝置。
每個屬性的值型別由裝置定義確定,編寫這些表示式的使用者必須查閱其特定驅動程式的文件。每個容量的值型別為 Quantity。
如果在 device.attributes 或 device.capacity 中使用未知字首進行查詢,將返回一個空對映。任何對未知欄位的引用都將導致評估錯誤並中止分配。
健壯的表示式應在引用屬性之前檢查它們是否存在。
為了便於使用,cel.bind() 函式已啟用,可用於簡化訪問具有相同域的多個屬性的表示式。例如:
cel.bind(dra, device.attributes["dra.example.com"], dra.someBool && dra.anotherBool)
表示式的長度必須小於或等於 10 Ki。評估成本也根據估計的邏輯步驟數受到限制。
devices.requests.exactly.tolerations ([]DeviceToleration)
原子性:在合併期間將被替換
如果指定,則為請求的容忍度。
需要 NoSchedule 的容忍度才能分配具有該效果的汙點裝置。NoExecute 亦然。
此外,如果任何已分配裝置在分配後被 NoExecute 汙點汙染且該效果未被容忍,則所有使用 ResourceClaim 的 Pod 都將被刪除以驅逐它們。排程器將不允許新 Pod 在具有這些汙點裝置時保留該宣告。一旦所有 Pod 被驅逐,該宣告將被解除分配。
容忍度的最大數量為 16。
這是一個 Alpha 欄位,需要啟用 DRADeviceTaints 功能門控。
此 DeviceToleration 所附加的 ResourceClaim 容忍任何使用匹配運算子
匹配三元組 <key,value,effect> 的汙點。 devices.requests.exactly.tolerations.effect (string)
Effect 指示要匹配的汙點效果。空表示匹配所有汙點效果。如果指定,允許的值為 NoSchedule 和 NoExecute。
devices.requests.exactly.tolerations.key (string)
Key 是容忍度適用的汙點鍵。空表示匹配所有汙點鍵。如果鍵為空,則 operator 必須是 Exists;這種組合表示匹配所有值和所有鍵。必須是標籤名稱。
devices.requests.exactly.tolerations.operator (string)
Operator 表示鍵與值的關係。有效運算子是 Exists 和 Equal。預設為 Equal。Exists 等同於值的萬用字元,因此 ResourceClaim 可以容忍特定類別的所有汙點。
devices.requests.exactly.tolerations.tolerationSeconds (int64)
TolerationSeconds 表示容忍度(必須是 NoExecute 效果,否則此欄位將被忽略)容忍汙點的時間段。預設情況下,它未設定,這意味著永遠容忍汙點(不驅逐)。零和負值將被系統視為 0(立即驅逐)。如果大於零,則計算 Pod 需要被驅逐的時間為 <汙點新增時間> + <容忍秒數>。
devices.requests.exactly.tolerations.value (string)
Value 是容忍度匹配的汙點值。如果 operator 是 Exists,則 value 必須為空,否則只是一個普通字串。必須是標籤值。
devices.requests.firstAvailable ([]DeviceSubRequest)
原子性:在合併期間將被替換
FirstAvailable 包含子請求,排程器將從中選擇一個。它會按照它們在此處列出的順序嘗試滿足它們。因此,如果列表中有兩條條目,排程器只有在確定第一條條目無法使用時才會檢查第二條。
DRA 尚未實現評分,因此排程器將選擇滿足宣告中所有請求的第一組裝置。如果要求可以在多個節點上滿足,則其他排程功能將決定選擇哪個節點。這意味著分配給宣告的裝置集可能不是叢集可用的最佳裝置集。評分將在以後實現。
*DeviceSubRequest 描述了宣告.spec.devices.requests[].firstAvailable 陣列中提供的裝置請求。每個通常是對單個資源(如裝置)的請求,但也可以請求多個相同的裝置。
DeviceSubRequest 類似於 ExactDeviceRequest,但不公開 AdminAccess 欄位,因為該欄位僅在請求特定裝置時才受支援。*
devices.requests.firstAvailable.deviceClassName (string),必需
DeviceClassName 引用一個特定的 DeviceClass,該 DeviceClass 可以定義此子請求將繼承的附加配置和選擇器。
類是必需的。哪些類可用取決於叢集。
管理員可以使用此項來限制哪些裝置可以透過僅安裝帶有允許裝置選擇器的類來請求。如果使用者可以自由請求任何內容而沒有限制,則管理員可以為使用者建立一個空的 DeviceClass 以供引用。
devices.requests.firstAvailable.name (string),必需
Name 可用於在約束列表或宣告的配置列表中引用此子請求。引用必須使用 <主請求>/<子請求> 格式。
必須是 DNS 標籤。
devices.requests.firstAvailable.allocationMode (string)
AllocationMode 及其相關欄位定義瞭如何分配裝置以滿足此子請求。支援的值為:
ExactCount:此請求針對特定數量的裝置。這是預設值。確切數量在 count 欄位中提供。
All:此子請求針對池中所有匹配的裝置。如果某些裝置已被分配,則分配將失敗,除非請求了 adminAccess。
如果未指定 AllocationMode,則預設模式為 ExactCount。如果模式為 ExactCount 且未指定 count,則預設數量為 1。任何其他子請求必須指定此欄位。
將來可能會新增更多模式。客戶端必須拒絕處理具有未知模式的請求。
devices.requests.firstAvailable.capacity (CapacityRequirements)
Capacity 定義了針對每個容量的資源要求。
如果此欄位未設定且裝置支援多重分配,則將根據 requestPolicy 將預設值應用於每個容量。對於沒有 requestPolicy 的容量,預設值為完整容量值。
適用於每個裝置分配。如果 Count > 1,如果滿足要求的裝置不足,則請求失敗。如果 AllocationMode 設定為 All,如果存在其他匹配請求且具有此容量的裝置,其值 >= 請求量,但無法分配給此請求,則請求失敗。
CapacityRequirements 定義了特定裝置請求的容量要求。
devices.requests.firstAvailable.capacity.requests (map[string]Quantity)
Requests 表示對不同資源的單個裝置資源請求,所有這些資源都必須由裝置提供。
此值用作裝置可用容量的附加過濾條件。這在語義上等同於帶有 `device.capacity[\<domain>].\<name>.compareTo(quantity(\<request quantity>)) >= 0` 的 CEL 選擇器。例如,device.capacity['test-driver.cdi.k8s.io'].counters.compareTo(quantity('2')) >= 0。
當定義了 requestPolicy 時,請求的數量會根據策略向上調整到最接近的有效值。如果請求的數量無法調整到有效值(因為它超出了 requestPolicy 允許的範圍),則該裝置被視為不符合分配條件。
對於任何未明確請求的容量:- 如果未設定 requestPolicy,則預設消耗容量等於裝置的全部容量(即,整個裝置被宣告)。
- 如果設定了 requestPolicy,則預設消耗容量根據該策略確定。
如果裝置允許多重分配,則所有請求的總量不得超過容量值。消耗的容量(如果定義了 requestPolicy,可能會根據策略進行調整)記錄在資源宣告的 status.devices[*].consumedCapacity 欄位中。
devices.requests.firstAvailable.count (int64)
Count 僅在計數模式為 "ExactCount" 時使用。必須大於零。如果 AllocationMode 為 ExactCount 且未指定此欄位,則預設值為 1。
devices.requests.firstAvailable.selectors ([]DeviceSelector)
原子性:在合併期間將被替換
選擇器定義了特定裝置必須滿足的條件,以便該裝置被考慮用於此子請求。所有選擇器都必須滿足才能考慮裝置。
devices.requests.firstAvailable.selectors.cel (CELDeviceSelector)
CEL 包含用於選擇裝置的 CEL 表示式。
CELDeviceSelector 包含用於選擇裝置的 CEL 表示式。
devices.requests.firstAvailable.selectors.cel.expression (string),必需
Expression 是一個評估單個裝置的 CEL 表示式。當所考慮的裝置滿足所需條件時,它必須評估為 true,否則評估為 false。任何其他結果都是錯誤,並導致裝置分配中止。
表示式的輸入是一個名為 "device" 的物件,它具有以下屬性:
- driver (字串): 定義此裝置的驅動程式名稱。
- attributes (map[string]object): 裝置的屬性,按字首分組(例如 device.attributes["dra.example.com"] 評估為一個包含所有以 "dra.example.com" 為字首的屬性的物件)。
- capacity (map[string]object): 裝置的容量,按字首分組。
- allowMultipleAllocations (bool):裝置的 allowMultipleAllocations 屬性(v1.34+ 啟用 DRAConsumableCapacity 功能時)。
示例:考慮一個驅動程式為 "dra.example.com" 的裝置,它暴露了名為 "model" 和 "ext.example.com/family" 的兩個屬性,並暴露了一個名為 "modules" 的容量。此表示式的輸入將具有以下欄位:
device.driver device.attributes["dra.example.com"].model device.attributes["ext.example.com"].family device.capacity["dra.example.com"].modules
device.driver 欄位可用於檢查特定驅動程式,既可以作為高階前提條件(即您只考慮此驅動程式的裝置),也可以作為多子句表示式的一部分,旨在考慮來自不同驅動程式的裝置。
每個屬性的值型別由裝置定義確定,編寫這些表示式的使用者必須查閱其特定驅動程式的文件。每個容量的值型別為 Quantity。
如果在 device.attributes 或 device.capacity 中使用未知字首進行查詢,將返回一個空對映。任何對未知欄位的引用都將導致評估錯誤並中止分配。
健壯的表示式應在引用屬性之前檢查它們是否存在。
為了便於使用,cel.bind() 函式已啟用,可用於簡化訪問具有相同域的多個屬性的表示式。例如:
cel.bind(dra, device.attributes["dra.example.com"], dra.someBool && dra.anotherBool)
表示式的長度必須小於或等於 10 Ki。評估成本也根據估計的邏輯步驟數受到限制。
devices.requests.firstAvailable.tolerations ([]DeviceToleration)
原子性:在合併期間將被替換
如果指定,則為請求的容忍度。
需要 NoSchedule 的容忍度才能分配具有該效果的汙點裝置。NoExecute 亦然。
此外,如果任何已分配裝置在分配後被 NoExecute 汙點汙染且該效果未被容忍,則所有使用 ResourceClaim 的 Pod 都將被刪除以驅逐它們。排程器將不允許新 Pod 在具有這些汙點裝置時保留該宣告。一旦所有 Pod 被驅逐,該宣告將被解除分配。
容忍度的最大數量為 16。
這是一個 Alpha 欄位,需要啟用 DRADeviceTaints 功能門控。
此 DeviceToleration 所附加的 ResourceClaim 容忍任何使用匹配運算子
匹配三元組 <key,value,effect> 的汙點。 devices.requests.firstAvailable.tolerations.effect (string)
Effect 指示要匹配的汙點效果。空表示匹配所有汙點效果。如果指定,允許的值為 NoSchedule 和 NoExecute。
devices.requests.firstAvailable.tolerations.key (string)
Key 是容忍度適用的汙點鍵。空表示匹配所有汙點鍵。如果鍵為空,則 operator 必須是 Exists;這種組合表示匹配所有值和所有鍵。必須是標籤名稱。
devices.requests.firstAvailable.tolerations.operator (string)
Operator 表示鍵與值的關係。有效運算子是 Exists 和 Equal。預設為 Equal。Exists 等同於值的萬用字元,因此 ResourceClaim 可以容忍特定類別的所有汙點。
devices.requests.firstAvailable.tolerations.tolerationSeconds (int64)
TolerationSeconds 表示容忍度(必須是 NoExecute 效果,否則此欄位將被忽略)容忍汙點的時間段。預設情況下,它未設定,這意味著永遠容忍汙點(不驅逐)。零和負值將被系統視為 0(立即驅逐)。如果大於零,則計算 Pod 需要被驅逐的時間為 <汙點新增時間> + <容忍秒數>。
devices.requests.firstAvailable.tolerations.value (string)
Value 是容忍度匹配的汙點值。如果 operator 是 Exists,則 value 必須為空,否則只是一個普通字串。必須是標籤值。
ResourceClaimStatus
ResourceClaimStatus 跟蹤資源是否已分配以及分配的結果。
allocation (AllocationResult)
一旦宣告成功分配,就會設定 Allocation。
allocation.allocationTimestamp (Time)
AllocationTimestamp 儲存資源分配的時間。此欄位不保證設定,在這種情況下,該時間是未知的。
這是一個 Alpha 欄位,需要啟用 DRADeviceBindingConditions 和 DRAResourceClaimDeviceStatus 功能門控。
Time 是 time.Time 的一個包裝器,支援正確地編組到 YAML 和 JSON。提供了 time 包提供的許多工廠方法的包裝器。
allocation.devices (DeviceAllocationResult)
Devices 是分配裝置的結果。
DeviceAllocationResult 是分配裝置的結果。
allocation.devices.config ([]DeviceAllocationConfiguration)
原子性:在合併期間將被替換
此欄位是所有宣告和類配置引數的組合。驅動程式可以根據標誌區分它們。
這包括結果中沒有分配裝置的驅動程式的配置引數,因為驅動程式支援哪些配置引數由它們決定。它們可以默默地忽略未知配置引數。
DeviceAllocationConfiguration 嵌入在 AllocationResult 中。
allocation.devices.config.source (string),必需
Source 記錄配置是來自類(因此是普通使用者無法設定的)還是來自宣告。
allocation.devices.config.opaque (OpaqueDeviceConfiguration)
Opaque 提供驅動程式特定的配置引數。
OpaqueDeviceConfiguration 包含驅動程式供應商定義的格式的驅動程式配置引數。
allocation.devices.config.opaque.driver (string),必需
Driver 用於確定需要將這些配置引數傳遞給哪個 kubelet 外掛。
驅動程式開發者提供的准入策略可以使用此欄位來決定是否需要驗證它們。
必須是 DNS 子域名,並且應該以驅動程式供應商擁有的 DNS 域名結尾。
allocation.devices.config.opaque.parameters (RawExtension),必需
Parameters 可以包含任意資料。驅動程式開發者負責處理驗證和版本控制。這通常包括自識別和版本(對於 Kubernetes 型別為 “kind” + “apiVersion”),以及不同版本之間的轉換。
原始資料長度必須小於或等於 10 Ki。
要使用它,請在您的外部版本化結構中建立一個型別為 RawExtension 的欄位,並在您的內部結構中建立一個 Object 欄位。您還需要註冊各種外掛型別。
// 內部包
type MyAPIObject struct { runtime.TypeMeta
json:",inline"
MyPlugin runtime.Objectjson:"myPlugin"
}type PluginA struct { AOption string
json:"aOption"
}// 外部包
type MyAPIObject struct { runtime.TypeMeta
json:",inline"
MyPlugin runtime.RawExtensionjson:"myPlugin"
}type PluginA struct { AOption string
json:"aOption"
}// 在線上傳輸時,JSON 看起來像這樣
{ "kind":"MyAPIObject", "apiVersion":"v1", "myPlugin": { "kind":"PluginA", "aOption":"foo", }, }
那麼會發生什麼?首先,Decode 使用 json 或 yaml 將序列化資料反序列化到外部 MyAPIObject 中。這導致原始 JSON 被儲存,但未解包。下一步是複製(使用 pkg/conversion)到內部結構中。執行時包的 DefaultScheme 安裝了轉換函式,這些函式將解包儲存在 RawExtension 中的 JSON,將其轉換為正確的物件型別,並將其儲存在 Object 中。(TODO:如果物件是未知型別,將建立並存儲一個 runtime.Unknown 物件。)*
allocation.devices.config.requests ([]string)
原子性:在合併期間將被替換
Requests 列出了配置適用的請求名稱。如果為空,則適用於所有請求。
對子請求的引用必須包含主請求的名稱,並且可以使用 <主請求>/[<子請求>] 的格式包含子請求。如果只給出主請求,則配置適用於所有子請求。
allocation.devices.results ([]DeviceRequestAllocationResult)
原子性:在合併期間將被替換
Results 列出了所有已分配的裝置。
DeviceRequestAllocationResult 包含一個請求的分配結果。
allocation.devices.results.device (string),必需
Device 透過其在驅動程式資源池中的名稱引用一個裝置例項。它必須是 DNS 標籤。
allocation.devices.results.driver (string),必需
Driver 指定 DRA 驅動程式的名稱,當節點上需要宣告時,將呼叫其 kubelet 外掛來處理分配。
必須是 DNS 子域名,並且應該以驅動程式供應商擁有的 DNS 域名結尾。
allocation.devices.results.pool (string),必需
此名稱與驅動程式名稱和裝置名稱欄位一起標識分配了哪個裝置(`<驅動程式名稱>/<池名稱>/<裝置名稱>`)。
長度不得超過 253 個字元,並且可能包含一個或多個以斜槓分隔的 DNS 子域。
allocation.devices.results.request (string),必需
Request 是宣告中導致此裝置被分配的請求名稱。如果它引用 DeviceRequest 上 firstAvailable 列表中的子請求,則此欄位必須包含主請求和子請求的名稱,格式為 <主請求>/<子請求>。
每個請求可能已分配了多個裝置。
allocation.devices.results.adminAccess (boolean)
AdminAccess 表示此裝置已分配用於管理訪問。有關模式的定義,請參閱相應的請求欄位。
這是一個 Alpha 欄位,需要啟用 DRAAdminAccess 功能門控。如果此欄位未設定或設定為 false,則停用管理訪問;否則啟用。
allocation.devices.results.bindingConditions ([]string)
原子性:在合併期間將被替換
BindingConditions 包含分配時相應 ResourceSlice 中的 BindingConditions 的副本。
這是一個 Alpha 欄位,需要啟用 DRADeviceBindingConditions 和 DRAResourceClaimDeviceStatus 功能門控。
allocation.devices.results.bindingFailureConditions ([]string)
原子性:在合併期間將被替換
BindingFailureConditions 包含分配時相應 ResourceSlice 中的 BindingFailureConditions 的副本。
這是一個 Alpha 欄位,需要啟用 DRADeviceBindingConditions 和 DRAResourceClaimDeviceStatus 功能門控。
allocation.devices.results.consumedCapacity (map[string]Quantity)
ConsumedCapacity 跟蹤每個裝置作為宣告請求一部分所消耗的容量。消耗量可能與請求量不同:如果適用(即,不能小於請求量),它會根據裝置的 requestPolicy 四捨五入到最接近的有效值。
每個裝置的總消耗容量不得超過 DeviceCapacity 的 Value。
此欄位僅填充允許多重分配的裝置。所有容量條目都包括在內,即使消耗量為零。
allocation.devices.results.shareID (string)
ShareID 唯一標識裝置的單個分配份額,當裝置支援多個同時分配時使用。它作為附加的對映鍵來區分同一裝置的同時份額。
allocation.devices.results.tolerations ([]DeviceToleration)
原子性:在合併期間將被替換
裝置分配時請求中指定的所有容忍度的副本。
容忍度的最大數量為 16。
這是一個 Alpha 欄位,需要啟用 DRADeviceTaints 功能門控。
此 DeviceToleration 所附加的 ResourceClaim 容忍任何使用匹配運算子
匹配三元組 <key,value,effect> 的汙點。 allocation.devices.results.tolerations.effect (string)
Effect 指示要匹配的汙點效果。空表示匹配所有汙點效果。如果指定,允許的值為 NoSchedule 和 NoExecute。
allocation.devices.results.tolerations.key (string)
Key 是容忍度適用的汙點鍵。空表示匹配所有汙點鍵。如果鍵為空,則 operator 必須是 Exists;這種組合表示匹配所有值和所有鍵。必須是標籤名稱。
allocation.devices.results.tolerations.operator (string)
Operator 表示鍵與值的關係。有效運算子是 Exists 和 Equal。預設為 Equal。Exists 等同於值的萬用字元,因此 ResourceClaim 可以容忍特定類別的所有汙點。
allocation.devices.results.tolerations.tolerationSeconds (int64)
TolerationSeconds 表示容忍度(必須是 NoExecute 效果,否則此欄位將被忽略)容忍汙點的時間段。預設情況下,它未設定,這意味著永遠容忍汙點(不驅逐)。零和負值將被系統視為 0(立即驅逐)。如果大於零,則計算 Pod 需要被驅逐的時間為 <汙點新增時間> + <容忍秒數>。
allocation.devices.results.tolerations.value (string)
Value 是容忍度匹配的汙點值。如果 operator 是 Exists,則 value 必須為空,否則只是一個普通字串。必須是標籤值。
allocation.nodeSelector (NodeSelector)
NodeSelector 定義了分配的資源在哪裡可用。如果未設定,則它們在任何地方都可用。
節點選擇器表示一個或多個標籤查詢在一組節點上的結果的並集;也就是說,它表示節點選擇器項所表示的選擇器的 OR 運算。
allocation.nodeSelector.nodeSelectorTerms ([]NodeSelectorTerm),必需
原子性:在合併期間將被替換
必需。節點選擇器項的列表。這些項是 OR 關係。
空或空的節點選擇器項不匹配任何物件。它們的要求是 AND 關係。TopologySelectorTerm 型別實現了 NodeSelectorTerm 的子集。
allocation.nodeSelector.nodeSelectorTerms.matchExpressions ([]NodeSelectorRequirement)
原子性:在合併期間將被替換
透過節點標籤列出的節點選擇器要求列表。
allocation.nodeSelector.nodeSelectorTerms.matchFields ([]NodeSelectorRequirement)
原子性:在合併期間將被替換
透過節點欄位列出的節點選擇器要求列表。
devices ([]AllocatedDeviceStatus)
Map:在合併過程中,將保留鍵 `driver, device, pool, shareID` 的唯一值
Devices 包含此宣告分配的每個裝置的狀態,由驅動程式報告。這可能包括驅動程式特定資訊。條目由各自的驅動程式擁有。
*AllocatedDeviceStatus 包含已分配裝置的狀態,如果驅動程式選擇報告的話。這可能包括驅動程式特定資訊。
Driver、Pool、Device 和 ShareID 的組合必須與 Status.Allocation.Devices 中的相應鍵匹配。*
devices.device (string),必需
Device 透過其在驅動程式資源池中的名稱引用一個裝置例項。它必須是 DNS 標籤。
devices.driver (string),必需
Driver 指定 DRA 驅動程式的名稱,當節點上需要宣告時,將呼叫其 kubelet 外掛來處理分配。
必須是 DNS 子域名,並且應該以驅動程式供應商擁有的 DNS 域名結尾。
devices.pool (string),必需
此名稱與驅動程式名稱和裝置名稱欄位一起標識分配了哪個裝置(`<驅動程式名稱>/<池名稱>/<裝置名稱>`)。
長度不得超過 253 個字元,並且可能包含一個或多個以斜槓分隔的 DNS 子域。
devices.conditions ([]Condition)
對映:合併時將保留鍵型別上的唯一值
Conditions 包含裝置狀態的最新觀察結果。如果裝置已根據類和宣告配置引用進行了配置,則 `Ready` 條件應為 True。
不能包含超過 8 個條目。
Condition 包含此 API 資源當前狀態的一個方面的詳細資訊。
devices.conditions.lastTransitionTime (Time),必需
lastTransitionTime 是條件上次從一種狀態轉換到另一種狀態的時間。這應該是底層條件發生變化的時間。如果不知道,則使用 API 欄位發生變化的時間是可接受的。
Time 是 time.Time 的一個包裝器,支援正確地編組到 YAML 和 JSON。提供了 time 包提供的許多工廠方法的包裝器。
devices.conditions.message (string),必需
message 是一個人類可讀的訊息,指示有關轉換的詳細資訊。這可能是一個空字串。
devices.conditions.reason (string),必需
reason 包含一個程式化識別符號,指示條件上次轉換的原因。特定條件型別的生產者可以為此欄位定義預期值和含義,以及這些值是否被視為有保證的 API。該值應該是一個 CamelCase 字串。此欄位不能為空。
devices.conditions.status (string),必需
條件狀態,True、False、Unknown 之一。
devices.conditions.type (string),必需
條件型別,CamelCase 或 foo.example.com/CamelCase。
devices.conditions.observedGeneration (int64)
observedGeneration 表示條件所基於的 .metadata.generation。例如,如果 .metadata.generation 當前為 12,但 .status.conditions[x].observedGeneration 為 9,則條件與例項的當前狀態不一致。
devices.data (RawExtension)
Data 包含任意驅動程式特定資料。
原始資料長度必須小於或等於 10 Ki。
要使用它,請在您的外部版本化結構中建立一個型別為 RawExtension 的欄位,並在您的內部結構中建立一個 Object 欄位。您還需要註冊各種外掛型別。
// 內部包
type MyAPIObject struct { runtime.TypeMeta `json:",inline"` MyPlugin runtime.Object `json:"myPlugin"` } type PluginA struct { AOption string `json:"aOption"` }
// 外部包
type MyAPIObject struct { runtime.TypeMeta `json:",inline"` MyPlugin runtime.RawExtension `json:"myPlugin"` } type PluginA struct { AOption string `json:"aOption"` }
// 在線上傳輸時,JSON 看起來像這樣
{ "kind":"MyAPIObject", "apiVersion":"v1", "myPlugin": { "kind":"PluginA", "aOption":"foo", }, }
那麼會發生什麼?首先,Decode 使用 json 或 yaml 將序列化資料反序列化到外部 MyAPIObject 中。這導致原始 JSON 被儲存,但未解包。下一步是複製(使用 pkg/conversion)到內部結構中。執行時包的 DefaultScheme 安裝了轉換函式,這些函式將解包儲存在 RawExtension 中的 JSON,將其轉換為正確的物件型別,並將其儲存在 Object 中。(TODO:如果物件是未知型別,將建立並存儲一個 runtime.Unknown 物件。)*
devices.networkData (NetworkDeviceData)
NetworkData 包含裝置特定的網路相關資訊。
NetworkDeviceData 提供了分配裝置的網路相關詳細資訊。此資訊可以由驅動程式或其他元件填充,以在網路環境中配置或標識裝置。
devices.networkData.hardwareAddress (string)
HardwareAddress 表示裝置網路介面的硬體地址(例如 MAC 地址)。
長度不得超過 128 個字元。
devices.networkData.interfaceName (string)
InterfaceName 指定與分配裝置關聯的網路介面名稱。這可能是 Pod 中正在配置的物理或虛擬網路介面的名稱。
長度不得超過 256 個字元。
devices.networkData.ips ([]string)
原子性:在合併期間將被替換
IPs 列出了分配給裝置網路介面的網路地址。這可以包括 IPv4 和 IPv6 地址。IPs 採用 CIDR 表示法,包括地址和關聯的子網掩碼。例如:"192.0.2.5/24" 用於 IPv4,"2001:db8::5/64" 用於 IPv6。
devices.shareID (string)
ShareID 唯一標識裝置的單個分配份額。
reservedFor ([]ResourceClaimConsumerReference)
補丁策略:在鍵 `uid` 上合併
Map:在合併過程中,將保留鍵 uid 的唯一值
ReservedFor 指示當前允許哪些實體使用宣告。引用未保留給該 Pod 的 ResourceClaim 的 Pod 將不會啟動。正在使用或可能正在使用(因為已被保留)的宣告不得被解除分配。
在具有多個排程器例項的叢集中,兩個 Pod 可能會被不同的排程器同時排程。當它們引用已達到最大消費者數量的相同 ResourceClaim 時,只能排程一個 Pod。
兩個排程器都嘗試將其 Pod 新增到 claim.status.reservedFor 欄位中,但只有最先到達 API 伺服器的更新才會儲存。另一個將失敗並返回錯誤,發出錯誤的排程器知道它必須將 Pod 放回佇列,等待 ResourceClaim 再次可用。
最多可以有 256 個這樣的保留。將來可能會增加,但不會減少。
ResourceClaimConsumerReference 包含足夠的資訊,可以幫助您找到 ResourceClaim 的消費者。使用者必須是與 ResourceClaim 位於同一名稱空間中的資源。
reservedFor.name (string),必需
Name 是被引用資源的名稱。
reservedFor.resource (string),必需
Resource 是被引用資源的型別,例如 "pods"。
reservedFor.uid (string),必需
UID 唯一標識資源的某個具體例項。
reservedFor.apiGroup (string)
APIGroup 是被引用資源的組。對於核心 API,它為空。這與建立資源時使用的 APIVersion 中的組匹配。
ResourceClaimList
ResourceClaimList 是宣告的集合。
apiVersion: resource.k8s.io/v1
kind: ResourceClaimList
metadata (ListMeta)
標準列表元資料
items ([]ResourceClaim),必需
Items 是資源宣告的列表。
操作
get
讀取指定的 ResourceClaim
HTTP 請求
GET /apis/resource.k8s.io/v1/namespaces/{namespace}/resourceclaims/{name}
引數
響應
200 (ResourceClaim): OK
401: 未授權
get
讀取指定 ResourceClaim 的狀態
HTTP 請求
GET /apis/resource.k8s.io/v1/namespaces/{namespace}/resourceclaims/{name}/status
引數
響應
200 (ResourceClaim): OK
401: 未授權
list
列出或監視 ResourceClaim 型別的物件
HTTP 請求
GET /apis/resource.k8s.io/v1/namespaces/{namespace}/resourceclaims
引數
namespace (在路徑中): string,必填
allowWatchBookmarks (在查詢中): boolean
continue (在查詢中): string
fieldSelector (在查詢中): string
labelSelector (在查詢中): string
limit (在查詢中): integer
pretty (在查詢中): string
resourceVersion (在查詢中): string
resourceVersionMatch (在查詢中): string
sendInitialEvents (在查詢中): boolean
timeoutSeconds (在查詢中): integer
watch (在查詢中): boolean
響應
200 (ResourceClaimList): OK
401: 未授權
list
列出或監視 ResourceClaim 型別的物件
HTTP 請求
GET /apis/resource.k8s.io/v1/resourceclaims
引數
allowWatchBookmarks (在查詢中): boolean
continue (在查詢中): string
fieldSelector (在查詢中): string
labelSelector (在查詢中): string
limit (在查詢中): integer
pretty (在查詢中): string
resourceVersion (在查詢中): string
resourceVersionMatch (在查詢中): string
sendInitialEvents (在查詢中): boolean
timeoutSeconds (在查詢中): integer
watch (在查詢中): boolean
響應
200 (ResourceClaimList): OK
401: 未授權
create
建立 ResourceClaim
HTTP 請求
POST /apis/resource.k8s.io/v1/namespaces/{namespace}/resourceclaims
引數
namespace (在路徑中): string,必填
body: ResourceClaim,必需
dryRun (在查詢中): string
fieldManager (在查詢中): string
fieldValidation (在查詢中): string
pretty (在查詢中): string
響應
200 (ResourceClaim): OK
201 (ResourceClaim): 已建立
202 (ResourceClaim): 已接受
401: 未授權
update
替換指定的 ResourceClaim
HTTP 請求
PUT /apis/resource.k8s.io/v1/namespaces/{namespace}/resourceclaims/{name}
引數
name (在路徑中): string,必填
ResourceClaim 的名稱
namespace (在路徑中): string,必填
body: ResourceClaim,必需
dryRun (在查詢中): string
fieldManager (在查詢中): string
fieldValidation (在查詢中): string
pretty (在查詢中): string
響應
200 (ResourceClaim): OK
201 (ResourceClaim): 已建立
401: 未授權
update
替換指定 ResourceClaim 的狀態
HTTP 請求
PUT /apis/resource.k8s.io/v1/namespaces/{namespace}/resourceclaims/{name}/status
引數
name (在路徑中): string,必填
ResourceClaim 的名稱
namespace (在路徑中): string,必填
body: ResourceClaim,必需
dryRun (在查詢中): string
fieldManager (在查詢中): string
fieldValidation (在查詢中): string
pretty (在查詢中): string
響應
200 (ResourceClaim): OK
201 (ResourceClaim): 已建立
401: 未授權
patch
部分更新指定的 ResourceClaim
HTTP 請求
PATCH /apis/resource.k8s.io/v1/namespaces/{namespace}/resourceclaims/{name}
引數
name (在路徑中): string,必填
ResourceClaim 的名稱
namespace (在路徑中): string,必填
body: Patch,必需
dryRun (在查詢中): string
fieldManager (在查詢中): string
fieldValidation (在查詢中): string
force (在查詢中): boolean
pretty (在查詢中): string
響應
200 (ResourceClaim): OK
201 (ResourceClaim): 已建立
401: 未授權
patch
部分更新指定 ResourceClaim 的狀態
HTTP 請求
PATCH /apis/resource.k8s.io/v1/namespaces/{namespace}/resourceclaims/{name}/status
引數
name (在路徑中): string,必填
ResourceClaim 的名稱
namespace (在路徑中): string,必填
body: Patch,必需
dryRun (在查詢中): string
fieldManager (在查詢中): string
fieldValidation (在查詢中): string
force (在查詢中): boolean
pretty (在查詢中): string
響應
200 (ResourceClaim): OK
201 (ResourceClaim): 已建立
401: 未授權
delete
刪除 ResourceClaim
HTTP 請求
DELETE /apis/resource.k8s.io/v1/namespaces/{namespace}/resourceclaims/{name}
引數
name (在路徑中): string,必填
ResourceClaim 的名稱
namespace (在路徑中): string,必填
body: DeleteOptions
dryRun (在查詢中): string
gracePeriodSeconds (在查詢中): integer
ignoreStoreReadErrorWithClusterBreakingPotential (在查詢中): boolean
pretty (在查詢中): string
propagationPolicy (在查詢中): string
響應
200 (ResourceClaim): OK
202 (ResourceClaim): 已接受
401: 未授權
deletecollection
刪除 ResourceClaim 集合
HTTP 請求
DELETE /apis/resource.k8s.io/v1/namespaces/{namespace}/resourceclaims
引數
namespace (在路徑中): string,必填
body: DeleteOptions
continue (在查詢中): string
dryRun (在查詢中): string
fieldSelector (在查詢中): string
gracePeriodSeconds (在查詢中): integer
ignoreStoreReadErrorWithClusterBreakingPotential (在查詢中): boolean
labelSelector (在查詢中): string
limit (在查詢中): integer
pretty (在查詢中): string
propagationPolicy (在查詢中): string
resourceVersion (在查詢中): string
resourceVersionMatch (在查詢中): string
sendInitialEvents (在查詢中): boolean
timeoutSeconds (在查詢中): integer
響應
200 (Status): OK
401: 未授權
本頁面是自動生成的。
如果你打算報告此頁面存在的問題,請在問題描述中提及此頁面是自動生成的。修復可能需要在 Kubernetes 專案的其他地方進行。