ResourceClaim v1beta2
apiVersion: resource.k8s.io/v1beta2
import "k8s.io/api/resource/v1beta2"
ResourceClaim
ResourceClaim 描述对集群中供工作负载使用的资源的访问请求。 例如,如果某个工作负载需要具有特定属性的加速器设备,这就是表达该请求的方式。 状态部分跟踪此申领是否已被满足,以及具体分配了哪些资源。
这是一个 Alpha 级别的资源类型,需要启用 DynamicResourceAllocation 特性门控。
-
apiVersion: resource.k8s.io/v1beta2
-
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", }, }
那么会发生什么?解码首先使用 JSON 或 YAML 将序列化数据解组到你的外部 MyAPIObject 中。 这会导致原始 JSON 被存储下来,但不会被解包。下一步是复制(使用 pkg/conversion)到内部结构中。 runtime 包的 DefaultScheme 安装了转换函数,它将解析存储在 RawExtension 中的 JSON, 将其转换为正确的对象类型,并将其存储在 Object 中。 (TODO:如果对象是未知类型,将创建并存储一个
runtime.Unknown
对象。)
-
-
devices.config.requests ([]string)
原子性:将在合并期间被替换
requests 列举了配置适用的请求的名称。如果为空,则适用于所有请求。
对子请求的引用必须包含主请求的名称,并可以使用格式
<主请求>[/<子请求>]
来包含子请求。 如果只提供主请求,则此配置适用于所有子请求。
-
-
devices.constraints ([]DeviceConstraint)
原子性:将在合并期间被替换
这些约束必须由为申领分配的设备集合所满足。
除了 requests 之外,DeviceConstraint 还必须有且仅有一个字段被设置。
-
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,它可以定义要由此请求所继承的额外配置和选择算符。
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.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 (string):定义此设备的驱动的名称。
- attributes (map[string]object):设备的属性,按前缀分组 (例如,device.attributes["dra.example.com"] 评估为一个对象,包含所有以 "dra.example.com" 为前缀的属性。)
- capacity (map[string]object):设备的容量,按前缀分组。
示例:考虑一个驱动为 "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 字段可用于检查特定驱动,既可以作为高层次的前提条件(即你只想考虑来自此驱动的设备), 也可以作为考虑来自不同驱动的设备的多子句表达式的一部分。
attribute 中每个元素的值类型由设备定义,编写这些表达式的用户必须查阅其特定驱动的文档。 capacity 中元素的值类型为 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>
三元组匹配的任何污点,匹配方式由操作符<operator>
指定。-
devices.requests.exactly.tolerations.effect (string)
effect 表示要匹配的污点效果。空意味着匹配所有污点效果。 指定此字段时,允许值是
NoSchedule
和NoExecute
。 -
devices.requests.exactly.tolerations.key (string)
key 是容忍适用的污点键。空意味着匹配所有污点键。 如果 key 为空,则 operator 必须是
Exists
。 这个组合意味着匹配所有取值和所有键。必须是标签名称。
-
devices.requests.exactly.tolerations.operator (string)
operator 表示键值之间的关系。有效值为
Exists
和Equal
,默认为Equal
。Exists
相当于对取值使用通配符,因此 ResourceClaim 可以容忍特定类别的所有污点。
-
devices.requests.exactly.tolerations.tolerationSeconds (int64)
tolerationSeconds 表示容忍污点(必须是
NoExecute
效果,否则此字段将被忽略)的时长。 默认不设置,这意味着永久容忍污点(不驱逐)。值为 0 或负数时,将被系统视为 0,即立刻驱逐。 如果值大于 0,则计算需要驱逐 Pod 的时间公式为:<添加污点的时间> + <容忍秒数>
。
-
devices.requests.exactly.tolerations.value (string)
value 是容忍度所匹配到的污点值。若 operator 为
Exists
,此值必须为空; 否则为普通字符串。必须是标签值。
-
-
-
devices.requests.firstAvailable ([]DeviceSubRequest)
原子性:将在合并时被替换
firstAvailable 包含多个子请求,调度器将从中选择一个子请求。 调度器会按照子请求在列表中的顺序依次尝试满足它们。 因此,如果列表中有两条子请求,调度器只有在确认第一个请求不可用时才会尝试第二个。
DRA 尚未实现打分逻辑,因此调度器将选择满足申领中所有请求的第一组设备。 如果在多个节点上都能满足这些要求,则最终选择哪个节点由其他调度特性决定。 这意味着最终分配到申领的设备集合可能不是集群中可用的最优选择。打分逻辑将在未来实现。
DeviceSubRequest 描述在
claim.spec.devices.requests[].firstAvailable
数组中提供的某个设备请求。 每个请求通常表示对某个设备等单个资源的请求,但也可以请求多个相同的设备。 DeviceSubRequest 类似于 ExactDeviceRequest,但不暴露 adminAccess 字段(此字段仅适用于请求特定设备时)。-
devices.requests.firstAvailable.deviceClassName(string,必需)
deviceClassName 引用特定的 DeviceClass,它可以定义要由此请求所继承的额外配置和选择算符。
类是必需的。具体哪些类可用取决于集群。
管理员通过仅为允许的设备使用选择算符安装类,就可以使用此字段限制哪些设备可以被请求。 如果用户可以自由请求任何设备而没有限制,则管理员可以创建一个空的 DeviceClass 供用户引用。
-
devices.requests.firstAvailable.name (string), required
name 可用于在申领的约束列表或配置列表中引用此子请求。引用格式必须为
<主请求>/<子请求>
。必须是 DNS 标签。
-
devices.requests.firstAvailable.allocationMode (string)
allocationMode 及其相关字段定义如何分配设备以满足此请求。支持的值为:
-
ExactCount:此请求是针对特定数量的设备。 这是默认值。确切数量在 count 字段中提供。
-
All:此请求是针对池中所有匹配的设备。 如果某些设备已经被分配,则分配将失败,除非请求了 adminAccess。
如果 allocationMode 未被指定,则默认模式为 ExactCount。 如果模式为 ExactCount 而 count 未被指定,则默认值为 1。 其他任何请求必须指定此字段。
将来可能会添加更多模式。客户端必须拒绝处理未知模式的请求。
-
-
devices.requests.firstAvailable.count (int64)
count 仅在计数模式为 "ExactCount" 时使用。必须大于零。 如果 allocationMode 为 ExactCount 而此字段未被指定,则默认值为 1。
-
devices.requests.firstAvailable.selectors ([]DeviceSelector)
原子性:将在合并期间被替换
selectors 定义特定设备必须满足的条件,满足条件的设备被视为此请求的候选者。 所有选择算符必须同时被满足才会考虑某个设备。
-
devices.requests.firstAvailable.selectors.cel (CELDeviceSelector)
cel 包含一个用于选择设备的 CEL 表达式。
CELDeviceSelector 包含一个用于选择设备的 CEL 表达式。
-
devices.requests.firstAvailable.selectors.cel.expression (string), required
expression 是一个 CEL 表达式,用于评估单个设备。 当被考虑的设备满足所需条件时,表达式的求值结果必须为 true;当不满足时,结果应为 false。 任何其他结果都是错误,会导致设备分配中止。
表达式的输入是一个名为 "device" 的对象,具有以下属性:
- driver (string):定义此设备的驱动的名称。
- attributes (map[string]object):设备的属性,按前缀分组 (例如,device.attributes["dra.example.com"] 评估为一个对象,包含所有以 "dra.example.com" 为前缀的属性。)
- capacity (map[string]object):设备的容量,按前缀分组。
示例:考虑一个驱动为 "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 字段可用于检查特定驱动,既可以作为高层次的前提条件(即你只想考虑来自此驱动的设备), 也可以作为考虑来自不同驱动的设备的多子句表达式的一部分。
attribute 中每个元素的值类型由设备定义,编写这些表达式的用户必须查阅其特定驱动的文档。 capacity 中元素的值类型为 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>
三元组匹配的任何污点,匹配方式由操作符<operator>
指定。-
devices.requests.firstAvailable.tolerations.effect (string)
effect 表示要匹配的污点效果。空意味着匹配所有污点效果。 指定此字段时,允许值是
NoSchedule
和NoExecute
。 -
devices.requests.firstAvailable.tolerations.key (string)
key 是容忍适用的污点键。空意味着匹配所有污点键。 如果 key 为空,则 operator 必须是
Exists
。 这个组合意味着匹配所有取值和所有键。必须是标签名称。
-
devices.requests.firstAvailable.tolerations.operator (string)
operator 表示键值之间的关系。有效值为
Exists
和Equal
,默认为Equal
。Exists
相当于对取值使用通配符,因此 ResourceClaim 可以容忍特定类别的所有污点。
-
devices.requests.firstAvailable.tolerations.tolerationSeconds (int64)
tolerationSeconds 表示容忍污点(必须是
NoExecute
效果,否则此字段将被忽略)的时长。 默认不设置,这意味着永久容忍污点(不驱逐)。值为 0 或负数时,将被系统视为 0,即立刻驱逐。 如果值大于 0,则计算需要驱逐 Pod 的时间公式为:<添加污点的时间> + <容忍秒数>
。
-
devices.requests.firstAvailable.tolerations.value (string)
value 是容忍度所匹配到的污点值。若操作符为
Exists
,此 value 必须为空; 否则为普通字符串。必须是标签值。
-
-
-
-
ResourceClaimStatus
ResourceClaimStatus 跟踪资源是否已被分配以及产生的结果是什么。
-
allocation (AllocationResult)
一旦申领已被成功分配,就会设置 allocation。
-
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.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", }, }
那么会发生什么?解码首先使用 JSON 或 YAML 将序列化数据解组到你的外部 MyAPIObject 中。 这会导致原始 JSON 被存储下来,但不会被解包。下一步是复制(使用 pkg/conversion)到内部结构中。 runtime 包的 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.tolerations ([]DeviceToleration)
原子性:将在合并期间被替换
在设备被分配时,在请求中指定的所有容忍度的副本。
容忍度的最大数量为 16 个。
这是一个 Alpha 字段,需要启用 DRADeviceTaints 特性门控。
此 DeviceToleration 所挂接到的 ResourceClaim 可容忍与
<key,value,effect>
三元组匹配的任何污点,匹配方式由操作符<operator>
指定。-
allocation.devices.results.tolerations.effect (string)
effect 表示要匹配的污点效果。空意味着匹配所有污点效果。 指定此字段时,允许值是
NoSchedule
和NoExecute
。 -
allocation.devices.results.tolerations.key (string)
key 是容忍适用的污点键。空意味着匹配所有污点键。 如果 key 为空,则 operator 必须是
Exists
。 这个组合意味着匹配所有取值和所有键。必须是标签名称。
-
allocation.devices.results.tolerations.operator (string)
operator 表示键值之间的关系。有效值为
Exists
和Equal
,默认为Equal
。Exists
相当于对取值使用通配符,因此 ResourceClaim 可以容忍特定类别的所有污点。
-
allocation.devices.results.tolerations.tolerationSeconds (int64)
tolerationSeconds 表示容忍污点(必须是
NoExecute
效果,否则此字段将被忽略)的时长。 默认不设置,这意味着永久容忍污点(不驱逐)。值为 0 或负数时,将被系统视为 0,即立刻驱逐。 如果值大于 0,则计算需要驱逐 Pod 的时间公式为:<添加污点的时间> + <容忍秒数>
。
-
allocation.devices.results.tolerations.value (string)
value 是容忍度所匹配到的污点值。若 operator 为
Exists
,此值必须为空; 否则为普通字符串。必须是标签值。
-
-
-
-
allocation.nodeSelector (NodeSelector)
nodeSelector 定义在哪儿可以使用分配的资源。如果不设置,则分配的资源在任何地方都可用。
节点选择算符表示在一组节点上一个或多个标签查询结果的并集; 也就是说,它表示由节点选择算符条件表示的选择算符的逻辑或计算结果。
-
allocation.nodeSelector.nodeSelectorTerms ([]NodeSelectorTerm),必需
原子性:将在合并期间被替换
必需。节点选择算符条件的列表。这些条件以逻辑与进行计算。
一个 null 或空的节点选择算符条件不会与任何对象匹配。这些要求会按逻辑与的关系来计算。 TopologySelectorTerm 类别实现了 NodeSelectorTerm 的子集。
-
allocation.nodeSelector.nodeSelectorTerms.matchExpressions ([]NodeSelectorRequirement)
原子性:将在合并期间被替换
基于节点标签所设置的节点选择算符要求的列表。
-
allocation.nodeSelector.nodeSelectorTerms.matchFields ([]NodeSelectorRequirement)
原子性:将在合并期间被替换
基于节点字段所设置的节点选择算符要求的列表。
-
-
-
-
devices([]AllocatedDeviceStatus)
映射:
driver
、device
和pool
这些键的唯一取值将在合并期间被保留devices 包含为了此申领分配的每个设备的状态,由驱动上报。 这可以包含特定于驱动的信息。这些条目的所有权归对应的驱动所有。
AllocatedDeviceStatus 包含已分配设备的状态(如果驱动选择上报)。这可能包含特定于驱动的信息。
-
allocation.devices.results.device (string),必需
device 通过名称引用驱动资源池中的一个设备实例。字段值必须是一个 DNS 标签。
-
allocation.devices.results.driver (string),必需
driver 指定 DRA 驱动的名称,此驱动的 kubelet 插件应在节点上需要申领时被调用以处理分配。
必须是 DNS 子域,并且应以驱动供应商拥有的 DNS 域结尾。
-
devices.pool (string),必需
此名称与驱动名称和设备名称字段一起标识哪些设备已被分配(
<驱动名称>/<资源池名称>/<设备名称>
)。不得超过 253 个字符,并且可以包含一个或多个用斜杠分隔的 DNS 子域。
-
devices.conditions ([]Condition)
映射:合并时将保留 type 键的唯一值
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 包含一个程序标识符,指示 condition 最后一次转换的原因。 特定状况类型的生产者可以定义该字段的预期值和含义,以及这些值是否被视为有保证的 API。 此值应该是 CamelCase 字符串且不能为空。
-
devices.conditions.status (string),必需
状况的状态,True、False、Unknown 之一。
-
devices.conditions.type (string),必需
CamelCase 或 foo.example.com/CamelCase 中的条件类型。
-
devices.conditions.observedGeneration (int64)
observedGeneration 表示设置 condition 基于的 .metadata.generation 的过期次数。 例如,如果 .metadata.generation 当前为 12,但 .status.conditions[x].observedGeneration 为 9, 则 condition 相对于实例的当前状态已过期。
-
-
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", }, }
那么会发生什么?解码首先使用 JSON 或 YAML 将序列化数据解组到你的外部 MyAPIObject 中。 这会导致原始 JSON 被存储下来,但不会被解包。下一步是复制(使用 pkg/conversion)到内部结构中。 runtime 包的 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 地址。 IP 使用 CIDR 表示法,包含地址和关联的子网掩码,例如 "192.0.2.5/24" 是 IPv4 地址,"2001:db8::5/64" 是 IPv6 地址。
-
-
-
reservedFor ([]ResourceClaimConsumerReference)
补丁策略:根据键
uid
执行合并操作映射:在合并期间将根据键 uid 保留唯一值
reservedFor 标明目前哪些实体允许使用申领。 如果 Pod 引用了未为其预留的 ResourceClaim,则该 Pod 将不会启动。 正在使用或可能正在使用的申领(因为它已被预留)不准被去配。
在有多个调度器实例的集群中,两个 Pod 可能会被不同的调度器同时调度。 当它们引用同一个已达到最大使用者数量的 ResourceClaim 时,只能有一个 Pod 被调度。
两个调度器都尝试将它们的 Pod 添加到 claim.status.reservedFor 字段, 但只有第一个到达 API 服务器的更新会被存储,另一个会因错误而失败。 发出此请求的调度器知道它必须将 Pod 重新放回队列,等待 ResourceClaim 再次可用。
最多可以有 32 个这样的预留。这一限制可能会在未来放宽,但不会减少。
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/v1beta2
-
kind: ResourceClaimList
-
metadata (ListMeta)
标准的列表元数据。
-
items ([]ResourceClaim),必需
items 是资源申领的列表。
操作
get
读取指定的 ResourceClaim
HTTP 请求
GET /apis/resource.k8s.io/v1beta2/namespaces/{namespace}/resourceclaims/{name}
参数
-
name(路径参数):string,必需
ResourceClaim 的名称。
-
namespace(路径参数):string,必需
-
pretty(查询参数):string
响应
200 (ResourceClaim): OK
401: Unauthorized
get
读取指定 ResourceClaim 的状态
HTTP 请求
GET /apis/resource.k8s.io/v1beta2/namespaces/{namespace}/resourceclaims/{name}/status
参数
-
name(路径参数):string,必需
ResourceClaim 的名称。
-
namespace(路径参数):string,必需
-
pretty(查询参数):string
响应
200 (ResourceClaim): OK
401: Unauthorized
list
列举或监视 ResourceClaim 类别的对象
HTTP 请求
GET /apis/resource.k8s.io/v1beta2/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: Unauthorized
list
列举或监视 ResourceClaim 类别的对象
HTTP 请求
GET /apis/resource.k8s.io/v1beta2/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: Unauthorized
create
创建 ResourceClaim
HTTP 请求
POST /apis/resource.k8s.io/v1beta2/namespaces/{namespace}/resourceclaims
参数
-
namespace(路径参数):string,必需
-
body: ResourceClaim,必需
-
dryRun(查询参数):string
-
fieldManager(查询参数):string
-
fieldValidation(查询参数):string
-
pretty(查询参数):string
响应
200 (ResourceClaim): OK
201 (ResourceClaim): Created
202 (ResourceClaim): Accepted
401: Unauthorized
update
替换指定的 ResourceClaim
HTTP 请求
PUT /apis/resource.k8s.io/v1beta2/namespaces/{namespace}/resourceclaims/{name}
参数
-
name(路径参数):string,必需
ResourceClaim 的名称。
-
namespace(路径参数):string,必需
-
body: ResourceClaim,必需
-
dryRun(查询参数):string
-
fieldManager(查询参数):string
-
fieldValidation(查询参数):string
-
pretty(查询参数):string
响应
200 (ResourceClaim): OK
201 (ResourceClaim): Created
401: Unauthorized
update
替换指定 ResourceClaim 的状态
HTTP 请求
PUT /apis/resource.k8s.io/v1beta2/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): Created
401: Unauthorized
patch
部分更新指定的 ResourceClaim
HTTP 请求
PATCH /apis/resource.k8s.io/v1beta2/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): Created
401: Unauthorized
patch
部分更新指定 ResourceClaim 的状态
HTTP 请求
PATCH /apis/resource.k8s.io/v1beta2/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): Created
401: Unauthorized
delete
删除 ResourceClaim
HTTP 请求
DELETE /apis/resource.k8s.io/v1beta2/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): Accepted
401: Unauthorized
deletecollection
删除 ResourceClaim 的集合
HTTP 请求
DELETE /apis/resource.k8s.io/v1beta2/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: Unauthorized