DeviceClass v1beta1
apiVersion: resource.k8s.io/v1beta1
import "k8s.io/api/resource/v1beta1"
DeviceClass
DeviceClass 是供应商或管理员提供的资源,其中包含设备配置和选择器。可以在声明的设备请求中引用它以应用这些预设。集群作用域。
这是一个 alpha 类型,需要启用 DynamicResourceAllocation 特性门控。
apiVersion: resource.k8s.io/v1beta1
kind: DeviceClass
metadata (ObjectMeta)
标准对象元数据
spec (DeviceClassSpec),必填
Spec 定义了可以分配的内容以及如何配置它。
这是可变的。消费者必须为类随时更改做好准备,无论是由于它们被更新还是被替换。声明分配是基于分配时类中设置的任何内容一次性完成的。
更改 spec 会自动增加 metadata.generation 编号。
DeviceClassSpec
DeviceClassSpec 在 [DeviceClass] 中使用,以定义可以分配的内容以及如何配置它。
config ([]DeviceClassConfiguration)
原子:将在合并期间被替换
Config 定义了适用于通过此类声明的每个设备的配置参数。某些类可能会由多个驱动程序满足,因此供应商配置的每个实例都恰好适用于一个驱动程序。
它们被传递给驱动程序,但在分配声明时不被考虑。
DeviceClassConfiguration 在 DeviceClass 中使用。
config.opaque (OpaqueDeviceConfiguration)
Opaque 提供特定于驱动程序的配置参数。
OpaqueDeviceConfiguration 包含驱动程序以驱动程序供应商定义的格式的配置参数。
config.opaque.driver (string),必填
Driver 用于确定需要将这些配置参数传递给哪个 kubelet 插件。
驱动程序开发人员提供的准入策略可以使用它来决定是否需要验证它们。
必须是 DNS 子域,并且应以驱动程序供应商拥有的 DNS 域结尾。
config.opaque.parameters (RawExtension),必填
Parameters 可以包含任意数据。驱动程序开发人员负责处理验证和版本控制。通常,这包括自我识别和版本(Kubernetes 类型的 "kind" + "apiVersion"),以及不同版本之间的转换。
要使用此功能,请在外部版本化的结构中创建一个类型为 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", }, }
那么会发生什么?首先,解码使用 json 或 yaml 将序列化数据解组到您的外部 MyAPIObject 中。这会导致存储原始 JSON,但不会解压缩。下一步是复制(使用 pkg/conversion)到内部结构中。runtime 包的 DefaultScheme 安装了转换函数,这些函数将解压缩存储在 RawExtension 中的 JSON,将其转换为正确的对象类型,并将其存储在 Object 中。(TODO:如果对象的类型未知,则将创建并存储 runtime.Unknown 对象。)*
selectors ([]DeviceSelector)
原子:将在合并期间被替换
每个选择器都必须由通过此类声明的设备满足。
selectors.cel (CELDeviceSelector)
CEL 包含用于选择设备的 CEL 表达式。
CELDeviceSelector 包含用于选择设备的 CEL 表达式。
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):设备的容量,按前缀分组。
示例:考虑一个 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)
suitableNodes (NodeSelector)
当尝试查找适合 Pod 的节点时,只有与选择器匹配的节点才会被调度程序考虑,前提是该 Pod 使用尚未分配的声明 并且 该声明是通过控制平面控制器分配的。当声明不使用控制平面控制器进行分配时,它将被忽略。
设置此字段是可选的。如果未设置,则所有节点都是候选节点。
这是一个 alpha 字段,需要启用 DRAControlPlaneController 特性门控。
节点选择器表示一组节点上一个或多个标签查询的结果的并集;也就是说,它表示由节点选择器术语表示的选择器的 OR。
suitableNodes.nodeSelectorTerms ([]NodeSelectorTerm),必填
原子:将在合并期间被替换
必填。节点选择器术语列表。这些术语是 OR 的。
null 或空的节点选择器术语不匹配任何对象。它们的的要求是 AND 的。TopologySelectorTerm 类型实现了 NodeSelectorTerm 的子集。
suitableNodes.nodeSelectorTerms.matchExpressions ([]NodeSelectorRequirement)
原子:将在合并期间被替换
按节点的标签列出的节点选择器要求列表。
suitableNodes.nodeSelectorTerms.matchFields ([]NodeSelectorRequirement)
原子:将在合并期间被替换
按节点的字段列出的节点选择器要求列表。
DeviceClassList
DeviceClassList 是类的集合。
apiVersion: resource.k8s.io/v1beta1
kind: DeviceClassList
metadata (ListMeta)
标准的列表元数据
items ([]DeviceClass), 必需
Items 是资源类别的列表。
操作
get
读取指定的 DeviceClass
HTTP 请求
GET /apis/resource.k8s.io/v1beta1/deviceclasses/{name}
参数
name (在路径中): 字符串, 必需
DeviceClass 的名称
pretty (在查询中): 字符串
响应
200 (DeviceClass): OK
401: 未授权
list
列出或监视 DeviceClass 类型的对象
HTTP 请求
GET /apis/resource.k8s.io/v1beta1/deviceclasses
参数
allowWatchBookmarks (在查询中): 布尔值
continue (在查询中): 字符串
fieldSelector (在查询中): 字符串
labelSelector (在查询中): 字符串
limit (在查询中): 整数
pretty (在查询中): 字符串
resourceVersion (在查询中): 字符串
resourceVersionMatch (在查询中): 字符串
sendInitialEvents (在查询中): 布尔值
timeoutSeconds (在查询中): 整数
watch (在查询中): 布尔值
响应
200 (DeviceClassList): OK
401: 未授权
create
创建一个 DeviceClass
HTTP 请求
POST /apis/resource.k8s.io/v1beta1/deviceclasses
参数
body: DeviceClass, 必需
dryRun (在查询中): 字符串
fieldManager (在查询中): 字符串
fieldValidation (在查询中): 字符串
pretty (在查询中): 字符串
响应
200 (DeviceClass): OK
201 (DeviceClass): 已创建
202 (DeviceClass): 已接受
401: 未授权
update
替换指定的 DeviceClass
HTTP 请求
PUT /apis/resource.k8s.io/v1beta1/deviceclasses/{name}
参数
name (在路径中): 字符串, 必需
DeviceClass 的名称
body: DeviceClass, 必需
dryRun (在查询中): 字符串
fieldManager (在查询中): 字符串
fieldValidation (在查询中): 字符串
pretty (在查询中): 字符串
响应
200 (DeviceClass): OK
201 (DeviceClass): 已创建
401: 未授权
patch
部分更新指定的 DeviceClass
HTTP 请求
PATCH /apis/resource.k8s.io/v1beta1/deviceclasses/{name}
参数
name (在路径中): 字符串, 必需
DeviceClass 的名称
body: Patch, 必需
dryRun (在查询中): 字符串
fieldManager (在查询中): 字符串
fieldValidation (在查询中): 字符串
force (在查询中): 布尔值
pretty (在查询中): 字符串
响应
200 (DeviceClass): OK
201 (DeviceClass): 已创建
401: 未授权
delete
删除一个 DeviceClass
HTTP 请求
DELETE /apis/resource.k8s.io/v1beta1/deviceclasses/{name}
参数
name (在路径中): 字符串, 必需
DeviceClass 的名称
body: DeleteOptions
dryRun (在查询中): 字符串
gracePeriodSeconds (在查询中): 整数
pretty (在查询中): 字符串
propagationPolicy (在查询中): 字符串
响应
200 (DeviceClass): OK
202 (DeviceClass): 已接受
401: 未授权
deletecollection
删除 DeviceClass 的集合
HTTP 请求
DELETE /apis/resource.k8s.io/v1beta1/deviceclasses
参数
body: DeleteOptions
continue (在查询中): 字符串
dryRun (在查询中): 字符串
fieldSelector (在查询中): 字符串
gracePeriodSeconds (在查询中): 整数
labelSelector (在查询中): 字符串
limit (在查询中): 整数
pretty (在查询中): 字符串
propagationPolicy (在查询中): 字符串
resourceVersion (在查询中): 字符串
resourceVersionMatch (在查询中): 字符串
sendInitialEvents (在查询中): 布尔值
timeoutSeconds (在查询中): 整数
响应
200 (Status): OK
401: 未授权
此页面是自动生成的。
如果您计划报告此页面的问题,请在您的问题描述中提到该页面是自动生成的。修复可能需要在 Kubernetes 项目的其他地方进行。