ResourceClaim

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 用于在外部版本中保存扩展。

          要使用此功能,请创建一个在外部版本化结构中具有 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)到内部结构中。运行时包的 DefaultScheme 安装了转换函数,这些函数将解包存储在 RawExtension 中的 JSON,将其转换为正确的对象类型,并将其存储在 Object 中。(待办:在对象类型未知的情况下,将创建并存储一个 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,它可以定义要由此请求继承的其他配置和选择器。

          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。任何其他请求必须指定此字段。

          将来可能会添加更多模式。客户端必须拒绝处理具有未知模式的请求。

          可能的枚举值

          • "All"
          • "ExactCount"
        • devices.requests.exactly.capacity (CapacityRequirements)

          Capacity 定义了针对每种容量的资源要求。

          如果此字段未设置且设备支持多次分配,则将根据 requestPolicy 将默认值应用于每种容量。对于没有 requestPolicy 的容量,默认值为完整容量值。

          适用于每个设备分配。如果 Count > 1,且没有足够满足要求的设备,则请求失败。如果 AllocationMode 设置为 All,且存在符合请求条件且具有此容量(值 >= 请求量)但无法分配给此请求的设备,则请求失败。

          CapacityRequirements 定义了特定设备请求的容量要求。

          • devices.requests.exactly.capacity.requests (map[string]Quantity)

            Requests 表示针对不同资源的单个设备资源请求,所有这些资源都必须由设备提供。

            此值用作针对设备可用容量的附加过滤条件。这在语义上相当于 CEL 选择器 device.capacity[\<domain>].\<name>.compareTo(quantity(\<request quantity>)) >= 0。例如,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 定义了特定设备必须满足的条件,以便考虑该设备用于此请求。必须满足所有选择器才能考虑设备。

          DeviceSelector 必须设置恰好一个字段。

          • 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): 设备的容量,按前缀分组。
              • allowMultipleAllocations (bool):设备的 allowMultipleAllocations 属性(v1.34+ 且启用了 DRAConsumableCapacity 特性门控)。

              示例:考虑一个具有 driver="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。

            可能的枚举值

            • "NoExecute" 驱逐任何不容忍该设备污点的已经在运行的 Pod。
            • "NoSchedule" 不允许使用污点设备的新 Pod 进行调度,除非它们容忍该污点,但允许在不经过调度程序的情况下提交给 Kubelet 的所有 Pod 启动,并允许所有已经在运行的 Pod 继续运行。
            • "None" 无效果,污点仅具有描述性。
          • devices.requests.exactly.tolerations.key (string)

            Key 是容忍度适用的污点键。为空意味着匹配所有污点键。如果键为空,运算符必须为 Exists;此组合意味着匹配所有值和所有键。必须是标签名称。

          • devices.requests.exactly.tolerations.operator (string)

            Operator 表示键与值的关系。有效的运算符为 Exists 和 Equal。默认为 Equal。Exists 相当于值的通配符,以便 ResourceClaim 可以容忍特定类别的所有污点。

            可能的枚举值

            • "Equal"
            • "Exists"
          • devices.requests.exactly.tolerations.tolerationSeconds (int64)

            TolerationSeconds 表示容忍度(必须具有 NoExecute 效果,否则忽略此字段)容忍污点的时间段。默认情况下未设置,这意味着永久容忍污点(不驱逐)。零值和负值将被系统视为 0(立即驱逐)。如果大于零,则 Pod 需要被驱逐的时间计算为 <添加污点的时间> + <容忍秒数>。

          • devices.requests.exactly.tolerations.value (string)

            Value 是容忍度匹配的污点值。如果运算符为 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),必填

          Name 可用于在申领的约束列表或配置列表中引用此子请求。引用必须使用格式 <主请求>/<子请求>。

          必须是一个 DNS 标签。

        • devices.requests.firstAvailable.allocationMode (string)

          AllocationMode 及其相关字段定义了如何分配设备以满足此子请求。支持的值为

          • ExactCount:此请求针对特定数量的设备。这是默认值。确切的数量在 count 字段中提供。

          • All:此子请求针对池中所有匹配的设备。如果某些设备已被分配,则分配将失败,除非请求了 adminAccess。

          如果未指定 AllocationMode,则默认模式为 ExactCount。如果模式为 ExactCount 且未指定 count,则默认数量为 1。任何其他子请求必须指定此字段。

          将来可能会添加更多模式。客户端必须拒绝处理具有未知模式的请求。

          可能的枚举值

          • "All"
          • "ExactCount"
        • devices.requests.firstAvailable.capacity (CapacityRequirements)

          Capacity 定义了针对每种容量的资源要求。

          如果此字段未设置且设备支持多次分配,则将根据 requestPolicy 将默认值应用于每种容量。对于没有 requestPolicy 的容量,默认值为完整容量值。

          适用于每个设备分配。如果 Count > 1,且没有足够满足要求的设备,则请求失败。如果 AllocationMode 设置为 All,且存在符合请求条件且具有此容量(值 >= 请求量)但无法分配给此请求的设备,则请求失败。

          CapacityRequirements 定义了特定设备请求的容量要求。

          • devices.requests.firstAvailable.capacity.requests (map[string]Quantity)

            Requests 表示针对不同资源的单个设备资源请求,所有这些资源都必须由设备提供。

            此值用作针对设备可用容量的附加过滤条件。这在语义上相当于 CEL 选择器 device.capacity[\<domain>].\<name>.compareTo(quantity(\<request quantity>)) >= 0。例如,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)

          原子:将在合并期间被替换

          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 (string): 定义此设备的驱动程序的名称。
              • attributes (map[string]object): 设备的属性,按前缀分组(例如,device.attributes["dra.example.com"] 评估为具有所有以前缀为“dra.example.com”的属性的对象。
              • capacity (map[string]object): 设备的容量,按前缀分组。
              • allowMultipleAllocations (bool):设备的 allowMultipleAllocations 属性(v1.34+ 且启用了 DRAConsumableCapacity 特性门控)。

              示例:考虑一个具有 driver="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。

            可能的枚举值

            • "NoExecute" 驱逐任何不容忍该设备污点的已经在运行的 Pod。
            • "NoSchedule" 不允许使用污点设备的新 Pod 进行调度,除非它们容忍该污点,但允许在不经过调度程序的情况下提交给 Kubelet 的所有 Pod 启动,并允许所有已经在运行的 Pod 继续运行。
            • "None" 无效果,污点仅具有描述性。
          • devices.requests.firstAvailable.tolerations.key (string)

            Key 是容忍度适用的污点键。为空意味着匹配所有污点键。如果键为空,运算符必须为 Exists;此组合意味着匹配所有值和所有键。必须是标签名称。

          • devices.requests.firstAvailable.tolerations.operator (string)

            Operator 表示键与值的关系。有效的运算符为 Exists 和 Equal。默认为 Equal。Exists 相当于值的通配符,以便 ResourceClaim 可以容忍特定类别的所有污点。

            可能的枚举值

            • "Equal"
            • "Exists"
          • devices.requests.firstAvailable.tolerations.tolerationSeconds (int64)

            TolerationSeconds 表示容忍度(必须具有 NoExecute 效果,否则忽略此字段)容忍污点的时间段。默认情况下未设置,这意味着永久容忍污点(不驱逐)。零值和负值将被系统视为 0(立即驱逐)。如果大于零,则 Pod 需要被驱逐的时间计算为 <添加污点的时间> + <容忍秒数>。

          • devices.requests.firstAvailable.tolerations.value (string)

            Value 是容忍度匹配的污点值。如果运算符为 Exists,则值必须为空,否则仅为常规字符串。必须是标签值。

ResourceClaimStatus

ResourceClaimStatus 跟踪资源是否已分配以及分配的结果是什么。


  • allocation (AllocationResult)

    一旦申领分配成功,就会设置 Allocation。

    AllocationResult 包含已分配资源的属性。

    • allocation.allocationTimestamp (Time)

      AllocationTimestamp 存储分配资源的时间。不能保证一定设置此字段,在这种情况下,该时间是未知的。

      这是一个 Alpha 字段,需要启用 DRADeviceBindingConditions 和 DRAResourceClaimDeviceStatus 特性门控。

      Time 是 time.Time 的包装器,支持正确地编组到 YAML 和 JSON。为时间包提供的许多工厂方法提供包装器。

    • allocation.devices (DeviceAllocationResult)

      Devices 是分配设备的结果。

      DeviceAllocationResult 是分配设备的结果。

      • allocation.devices.config ([]DeviceAllocationConfiguration)

        原子:将在合并期间被替换

        此字段是所有申领和类配置参数的组合。驱动程序可以根据标志来区分它们。

        这包括结果中没有已分配设备的驱动程序的配置参数,因为由驱动程序决定它们支持哪些配置参数。它们可以静默忽略未知的配置参数。

        DeviceAllocationConfiguration 嵌入在 AllocationResult 中。

        • allocation.devices.config.source (string),必填

          Source 记录配置是来自类(因此不是普通用户能够设置的内容)还是来自申领。

          可能的枚举值

          • "FromClaim"
          • "FromClass"
        • 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 用于在外部版本中保存扩展。

            要使用此功能,请创建一个在外部版本化结构中具有 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)到内部结构中。运行时包的 DefaultScheme 安装了转换函数,这些函数将解包存储在 RawExtension 中的 JSON,将其转换为正确的对象类型,并将其存储在 Object 中。(待办:在对象类型未知的情况下,将创建并存储一个 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 的值。

          此字段仅针对允许进行多次分配的设备填充。即使消耗量为零,也会包含所有容量条目。

        • 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。

            可能的枚举值

            • "NoExecute" 驱逐任何不容忍该设备污点的已经在运行的 Pod。
            • "NoSchedule" 不允许使用污点设备的新 Pod 进行调度,除非它们容忍该污点,但允许在不经过调度程序的情况下提交给 Kubelet 的所有 Pod 启动,并允许所有已经在运行的 Pod 继续运行。
            • "None" 无效果,污点仅具有描述性。
          • allocation.devices.results.tolerations.key (string)

            Key 是容忍度适用的污点键。为空意味着匹配所有污点键。如果键为空,运算符必须为 Exists;此组合意味着匹配所有值和所有键。必须是标签名称。

          • allocation.devices.results.tolerations.operator (string)

            Operator 表示键与值的关系。有效的运算符为 Exists 和 Equal。默认为 Equal。Exists 相当于值的通配符,以便 ResourceClaim 可以容忍特定类别的所有污点。

            可能的枚举值

            • "Equal"
            • "Exists"
          • allocation.devices.results.tolerations.tolerationSeconds (int64)

            TolerationSeconds 表示容忍度(必须具有 NoExecute 效果,否则忽略此字段)容忍污点的时间段。默认情况下未设置,这意味着永久容忍污点(不驱逐)。零值和负值将被系统视为 0(立即驱逐)。如果大于零,则 Pod 需要被驱逐的时间计算为 <添加污点的时间> + <容忍秒数>。

          • allocation.devices.results.tolerations.value (string)

            Value 是容忍度匹配的污点值。如果运算符为 Exists,则值必须为空,否则仅为常规字符串。必须是标签值。

    • 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)

    映射:在合并期间,将保留键 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。为时间包提供的许多工厂方法提供包装器。

      • devices.conditions.message (string),必填

        message 是一个人类可读的消息,指示过渡的详细信息。这可能是一个空字符串。

      • devices.conditions.reason (string),必填

        reason 包含一个程序化标识符,指示条件上次转换的原因。特定条件类型的生产者可以为此字段定义预期值和含义,以及这些值是否被视为有保障的 API。该值应为一个驼峰命名法(CamelCase)字符串。此字段不能为空。

      • devices.conditions.status (string),必填

        条件的 status,可以是 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 用于在外部版本中保存扩展。

      要使用此功能,请创建一个在外部版本化结构中具有 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)到内部结构中。运行时包的 DefaultScheme 安装了转换函数,这些函数将解包存储在 RawExtension 中的 JSON,将其转换为正确的对象类型,并将其存储在 Object 中。(待办:在对象类型未知的情况下,将创建并存储一个 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 表示法,其中包括地址和相关的子网掩码。例如:IPv4 为 "192.0.2.5/24",IPv6 为 "2001:db8::5/64"。

    • devices.shareID (string)

      ShareID 唯一标识设备的单个分配共享。

  • reservedFor ([]ResourceClaimConsumerReference)

    修补策略:按键 uid 合并

    映射:在合并期间,将保留键 uid 上的唯一值

    ReservedFor 指示当前允许哪些实体使用该申领。引用了未为其保留的 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}

Parameters

  • name (在路径中): string, 必需

    ResourceClaim 的名称

  • namespace (在路径中): string, 必需

    命名空间

  • pretty (在查询中): string

    pretty

响应

200 (ResourceClaim): OK

401: 未授权

get 读取指定 ResourceClaim 的状态

HTTP 请求

GET /apis/resource.k8s.io/v1/namespaces/{namespace}/resourceclaims/{name}/status

Parameters

  • name (在路径中): string, 必需

    ResourceClaim 的名称

  • namespace (在路径中): string, 必需

    命名空间

  • pretty (在查询中): string

    pretty

响应

200 (ResourceClaim): OK

401: 未授权

list 列出或监视 ResourceClaim 类型的对象

HTTP 请求

GET /apis/resource.k8s.io/v1/namespaces/{namespace}/resourceclaims

Parameters

响应

200 (ResourceClaimList): OK

401: 未授权

list 列出或监视 ResourceClaim 类型的对象

HTTP 请求

GET /apis/resource.k8s.io/v1/resourceclaims

Parameters

响应

200 (ResourceClaimList): OK

401: 未授权

create 创建一个 ResourceClaim

HTTP 请求

POST /apis/resource.k8s.io/v1/namespaces/{namespace}/resourceclaims

Parameters

响应

200 (ResourceClaim): OK

201 (ResourceClaim): Created

202 (ResourceClaim): Accepted

401: 未授权

update 替换指定的 ResourceClaim

HTTP 请求

PUT /apis/resource.k8s.io/v1/namespaces/{namespace}/resourceclaims/{name}

Parameters

响应

200 (ResourceClaim): OK

201 (ResourceClaim): Created

401: 未授权

update 替换指定 ResourceClaim 的状态

HTTP 请求

PUT /apis/resource.k8s.io/v1/namespaces/{namespace}/resourceclaims/{name}/status

Parameters

响应

200 (ResourceClaim): OK

201 (ResourceClaim): Created

401: 未授权

patch 部分更新指定的 ResourceClaim

HTTP 请求

PATCH /apis/resource.k8s.io/v1/namespaces/{namespace}/resourceclaims/{name}

Parameters

  • name (在路径中): string, 必需

    ResourceClaim 的名称

  • namespace (在路径中): string, 必需

    命名空间

  • body: Patch, 必需

  • dryRun (在查询中): string

    dryRun

  • fieldManager (在查询中): string

    fieldManager

  • fieldValidation (在查询中): string

    fieldValidation

  • force (in query): boolean

    force

  • pretty (在查询中): string

    pretty

响应

200 (ResourceClaim): OK

201 (ResourceClaim): Created

401: 未授权

patch 部分更新指定 ResourceClaim 的状态

HTTP 请求

PATCH /apis/resource.k8s.io/v1/namespaces/{namespace}/resourceclaims/{name}/status

Parameters

  • name (在路径中): string, 必需

    ResourceClaim 的名称

  • namespace (在路径中): string, 必需

    命名空间

  • body: Patch, 必需

  • dryRun (在查询中): string

    dryRun

  • fieldManager (在查询中): string

    fieldManager

  • fieldValidation (在查询中): string

    fieldValidation

  • force (in query): boolean

    force

  • pretty (在查询中): string

    pretty

响应

200 (ResourceClaim): OK

201 (ResourceClaim): Created

401: 未授权

delete 删除一个 ResourceClaim

HTTP 请求

DELETE /apis/resource.k8s.io/v1/namespaces/{namespace}/resourceclaims/{name}

Parameters

响应

200 (ResourceClaim): OK

202 (ResourceClaim): Accepted

401: 未授权

deletecollection 删除 ResourceClaim 集合

HTTP 请求

DELETE /apis/resource.k8s.io/v1/namespaces/{namespace}/resourceclaims

Parameters

响应

200 (Status): 确定

401: 未授权

本页面是自动生成的。

如果您打算报告此页面的问题,请在您的问题描述中提及该页面是自动生成的。修复可能需要在 Kubernetes 项目的其他地方进行。

最后修改于 2025年12月21日 5:37 PM PST:Update resource docs for v1.35 (85b57273c5)