1 - DeleteOptions

删除 API 对象时可以提供 DeleteOptions。

import "k8s.io/apimachinery/pkg/apis/meta/v1"

删除 API 对象时可以提供 DeleteOptions。


  • dryRun ([]string)

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

    该值如果存在,则表示不应保留修改。无效或无法识别的 dryRun 指令将导致错误响应并且不会进一步处理请求。有效值为:

    • All:处理所有试运行阶段(Dry Run Stages)
  • gracePeriodSeconds (int64)

    表示对象被删除之前的持续时间(以秒为单位)。值必须是非负整数。零值表示立即删除。如果此值为 nil,则将使用指定类型的默认宽限期。如果未指定,则为每个对象的默认值。

  • ignoreStoreReadErrorWithClusterBreakingPotential (boolean)

    如果设置为 true,那么在正常删除流程因对象损坏错误而失败时,将触发资源的不安全删除。当由于以下原因无法成功从底层存储检索资源时,该资源被视为损坏:

    1. 其数据无法转换,例如解密失败;或
    2. 它无法解码为一个对象。

    注意:不安全删除忽略终结器约束,跳过前提条件检查,并从存储中移除对象。

    警告:如果与正在被不安全删除的资源相关联的工作负载依赖于正常的删除流程,这可能会破坏集群。仅在你真的知道自己在做什么的情况下使用。默认值是 false,用户必须选择启用它。

  • orphanDependents (boolean)

    已弃用:该字段将在 1.7 中弃用,请使用 propagationPolicy 字段。该字段表示依赖对象是否应该是孤儿。如果为 true/false,对象的 finalizers 列表中会被添加上或者移除掉 “orphan” 终结器(Finalizer)。可以设置此字段或者设置 propagationPolicy 字段,但不能同时设置以上两个字段。

  • preconditions (Preconditions)

    先决条件必须在执行删除之前完成。如果无法满足这些条件,将返回 409(冲突)状态。

    执行操作(更新、删除等)之前必须满足先决条件。

    • preconditions.resourceVersion (string)

      指定目标资源版本(resourceVersion)。

    • preconditions.uid (string)

      指定目标 UID。

  • propagationPolicy (string)

    表示是否以及如何执行垃圾收集。可以设置此字段或 orphanDependents 字段,但不能同时设置二者。默认策略由 metadata.finalizers 中现有终结器(Finalizer)集合和特定资源的默认策略决定。可选值为:

    • Orphan 令依赖对象成为孤儿对象;
    • Background 允许垃圾收集器在后台删除依赖项;
    • Foreground 一个级联策略,前台删除所有依赖项。

2 - LabelSelector

标签选择算符是对一组资源的标签查询。

import "k8s.io/apimachinery/pkg/apis/meta/v1"

标签选择算符是对一组资源的标签查询。matchLabelsmatchExpressions 的结果按逻辑与的关系组合。一个 empty 标签选择算符匹配所有对象。一个 null 标签选择算符不匹配任何对象。


  • matchExpressions ([]LabelSelectorRequirement)

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

    matchExpressions 是标签选择算符要求的列表,这些要求的结果按逻辑与的关系来计算。

    标签选择算符要求是包含值、键和关联键和值的运算符的选择算符。

    • matchExpressions.key (string),必需

      key 是选择算符应用的标签键。

    • matchExpressions.operator (string),必需

      operator 表示键与一组值的关系。有效的运算符包括 InNotInExistsDoesNotExist

    • matchExpressions.values ([]string)

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

      values 是一个字符串值数组。如果运算符为 InNotIn,则 values 数组必须为非空。如果运算符是 ExistsDoesNotExist,则 values 数组必须为空。该数组在策略性合并补丁(Strategic Merge Patch)期间被替换。

  • matchLabels (map[string]string)

    matchLabels 是 {key,value} 键值对的映射。

    matchLabels 映射中的单个 {key,value} 键值对相当于 matchExpressions 的一个元素,其键字段为 key,运算符为 Invalues 数组仅包含 value

    所表达的需求最终要按逻辑与的关系组合。

3 - ListMeta

ListMeta 描述了合成资源必须具有的元数据,包括列表和各种状态对象。

import "k8s.io/apimachinery/pkg/apis/meta/v1"

ListMeta 描述了合成资源必须具有的元数据,包括列表和各种状态对象。一个资源仅能有 {ObjectMeta, ListMeta} 中的一个。


  • continue (string)

    如果用户对返回的条目数量设置了限制,则 continue 可能被设置,表示服务器有更多可用的数据。该值是不透明的,可用于向提供此列表服务的端点发出另一个请求,以检索下一组可用的对象。如果服务器配置已更改或时间已过去几分钟,则可能无法继续提供一致的列表。除非你在错误消息中收到此令牌(token),否则使用此 continue 值时返回的 resourceVersion 字段应该和第一个响应中的值是相同的。

  • remainingItemCount (int64)

    remainingItemCount 是列表中未包含在此列表响应中的后续项目的数量。如果列表请求包含标签或字段选择器,则剩余项目的数量是未知的,并且在序列化期间该字段将保持未设置和省略。如果列表是完整的(因为它没有分块或者这是最后一个块),那么就没有剩余的项目,并且在序列化过程中该字段将保持未设置和省略。早于 v1.15 的服务器不设置此字段。remainingItemCount 的预期用途是估计集合的大小。客户端不应依赖于设置准确的 remainingItemCount

  • selfLink (string)

    selfLink 表示此对象的 URL,由系统填充,只读。

    已弃用:selfLink 是一个遗留的只读字段,不再由系统填充。

4 - LocalObjectReference

LocalObjectReference 包含足够的信息,可以让你在同一命名空间内找到引用的对象。

import "k8s.io/api/core/v1"

LocalObjectReference 包含足够的信息,可以让你在同一命名空间(namespace)内找到引用的对象。


  • name (string)

    被引用者的名称。该字段实际上是必需的,但由于向后兼容性允许为空。这种类型的实例如果此处具有空值,几乎肯定是错误的。更多信息:https://kubernetes.io/zh-cn/docs/concepts/overview/working-with-objects/names/#names。

5 - NodeSelectorRequirement

节点选择算符需求是一个选择算符,其中包含值集、主键以及一个将键和值集关联起来的操作符。

import "k8s.io/api/core/v1"

节点选择算符需求是一个选择算符,其中包含值集、主键以及一个将键和值集关联起来的操作符。


  • key (string),必需

    选择算符所适用的标签主键。

  • operator (string),必需

    代表主键与值集之间的关系。合法的 operator 值包括 InNotInExistsDoesNotExistGtLt

    可能的枚举值:

    • "DoesNotExist"
    • "Exists"
    • "Gt"
    • "In"
    • "Lt"
    • "NotIn"
  • values ([]string)

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

    一个由字符串值组成的数组。如果 operator 是 InNotIn,则 values 数组不能为空。如果 operator 为 ExistsDoesNotExist,则 values 数组只能为空。如果 operator 为 GtLt,则 values 数组只能包含一个元素,并且该元素会被解释为整数。在执行策略性合并补丁操作时,此数组会被整体替换。

6 - ObjectFieldSelector

ObjectFieldSelector 选择对象的 APIVersioned 字段。

import "k8s.io/api/core/v1"

ObjectFieldSelector 选择对象的 APIVersioned 字段。


  • fieldPath (string),必需

    在指定 API 版本中要选择的字段的路径。

  • apiVersion (string)

    fieldPath 写入时所使用的模式版本,默认为 "v1"。

7 - ObjectMeta

ObjectMeta 是所有持久化资源必须具有的元数据,其中包括用户必须创建的所有对象。

import "k8s.io/apimachinery/pkg/apis/meta/v1"

ObjectMeta 是所有持久化资源必须具有的元数据,其中包括用户必须创建的所有对象。


  • name (string)

    name 在命名空间内必须是唯一的。创建资源时需要,尽管某些资源可能允许客户端请求自动地生成适当的名称。名称主要用于创建幂等性和配置定义。无法更新。更多信息:https://kubernetes.io/zh-cn/docs/concepts/overview/working-with-objects/names#names

  • generateName (string)

    generateName 是一个可选前缀,由服务器使用,仅在未提供 name 字段时生成唯一名称。如果使用此字段,则返回给客户端的名称将与传递的名称不同。该值还将与唯一的后缀组合。提供的值与 name 字段具有相同的验证规则,并且可能会根据所需的后缀长度被截断,以使该值在服务器上唯一。

    如果指定了此字段并且生成的名称存在,则服务器将不会返回 409。相反,它将返回 201 Created 或 500,原因是 ServerTimeout 指示在分配的时间内找不到唯一名称,客户端应重试(可选,在 Retry-After 标头中指定的时间之后)。

    仅在未指定 name 时应用。更多信息:https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#idempotency

  • namespace (string)

    namespace 定义了一个值空间,其中每个名称必须唯一。空命名空间相当于 “default” 命名空间,但 “default” 是规范的表示。并非所有对象都需要限定在命名空间中——这些对象的此字段的值将为空。

    必须是 DNS_LABEL。无法更新。更多信息:https://kubernetes.io/zh-cn/docs/concepts/overview/working-with-objects/namespaces

  • labels (map[string]string)

    可用于组织和分类(确定范围和选择)对象的字符串键和值的映射。可以匹配 ReplicationController 和 Service 的选择算符。更多信息:https://kubernetes.io/zh-cn/docs/concepts/overview/working-with-objects/labels

  • annotations (map[string]string)

    annotations 是一个非结构化的键值映射,存储在资源中,可以由外部工具设置以存储和检索任意元数据。它们不可查询,在修改对象时应保留。更多信息:https://kubernetes.io/zh-cn/docs/concepts/overview/working-with-objects/annotations

系统字段

  • finalizers ([]string)

    集合:唯一值将在合并期间被保留

    在从注册表中删除对象之前该字段必须为空。每个条目都是负责的组件的标识符,各组件将从列表中删除自己对应的条目。如果对象的 deletionTimestamp 非空,则只能删除此列表中的条目。终结器可以按任何顺序处理和删除。没有按照顺序执行,因为它引入了终结器卡住的重大风险。finalizers 是一个共享字段,任何有权限的参与者都可以对其进行重新排序。如果按顺序处理终结器列表,那么这可能导致列表中第一个负责终结器的组件正在等待列表中靠后负责终结器的组件产生的信号(字段值、外部系统或其他),从而导致死锁。在没有强制排序的情况下,终结者可以在它们之间自由排序,并且不容易受到列表中排序更改的影响。

  • managedFields ([]ManagedFieldsEntry)

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

    managedFields 将 workflow-id 和版本映射到由该工作流管理的字段集。这主要用于内部管理,用户通常不需要设置或理解该字段。工作流可以是用户名、控制器名或特定应用路径的名称,如 “ci-cd”。字段集始终存在于修改对象时工作流使用的版本。

    ManagedFieldsEntry 是一个 workflow-id,一个 FieldSet,也是该字段集适用的资源的组版本。

    • managedFields.apiVersion (string)

      apiVersion 定义此字段集适用的资源的版本。格式是 “group/version”,就像顶级 apiVersion 字段一样。必须跟踪字段集的版本,因为它不能自动转换。

    • managedFields.fieldsType (string)

      FieldsType 是不同字段格式和版本的鉴别器。目前只有一个可能的值:“FieldsV1”

    • managedFields.fieldsV1 (FieldsV1)

      FieldsV1 包含类型 “FieldsV1” 中描述的第一个 JSON 版本格式。

      FieldsV1 以 JSON 格式将一组字段存储在像 Trie 这样的数据结构中。

      每个键或是 . 表示字段本身,并且始终映射到一个空集,或是一个表示子字段或元素的字符串。该字符串将遵循以下四种格式之一:

      1. f:<name>,其中 <name> 是结构中字段的名称,或映射中的键
      2. v:<value>,其中 <value> 是列表项的精确 json 格式值
      3. i:<index>,其中 <index> 是列表中项目的位置
      4. k:<keys>,其中 <keys> 是列表项的关键字段到其唯一值的映射。

      如果一个键映射到一个空的 Fields 值,则该键表示的字段是集合的一部分。

      确切的格式在 sigs.k8s.io/structured-merge-diff 中定义。

    • managedFields.manager (string)

      manager 是管理这些字段的工作流的标识符。

    • managedFields.operation (string)

      operation 是导致创建此 managedFields 表项的操作类型。此字段的仅有合法值是 “Apply” 和 “Update”。

    • managedFields.subresource (string)

      subresource 是用于更新该对象的子资源的名称,如果对象是通过主资源更新的,则为空字符串。该字段的值用于区分管理者,即使他们共享相同的名称。例如,状态更新将不同于使用相同管理者名称的常规更新。请注意,apiVersion 字段与 subresource 字段无关,它始终对应于主资源的版本。

    • managedFields.time (Time)

      time 是添加 managedFields 条目时的时间戳。如果一个字段被添加、管理器更新任一所属字段值或移除一个字段,该时间戳也会更新。从此条目中移除一个字段时该时间戳不会更新,因为另一个管理器将它接管了。

      time 是 time.Time 的包装类,支持正确地序列化为 YAML 和 JSON。为 time 包提供的许多工厂方法提供了包装类。

  • ownerReferences ([]OwnerReference)

    补丁策略:根据 uid 键执行合并操作

    映射:在合并期间将根据键 uid 保留唯一值

    此对象所依赖的对象列表。如果列表中的所有对象都已被删除,则该对象将被垃圾回收。如果此对象由控制器管理,则此列表中的条目将指向此控制器,controller 字段设置为 true。管理控制器不能超过一个。

    OwnerReference 包含足够可以让你识别属主对象的信息。属主对象必须与依赖对象位于同一命名空间中,或者是集群作用域的,因此没有命名空间字段。

只读字段

  • creationTimestamp (Time)

    creationTimestamp 是一个时间戳,表示创建此对象时的服务器时间。不能保证在单独的操作中按发生前的顺序设置。客户端不得设置此值。它以 RFC3339 形式表示,并采用 UTC。

    由系统填充。只读。列表为空。更多信息:https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata

    time 是 time.Time 的包装类,支持正确地序列化为 YAML 和 JSON。为 time 包提供的许多工厂方法提供了包装类。

  • deletionGracePeriodSeconds (int64)

    此对象从系统中删除之前允许正常终止的秒数。仅当设置了 deletionTimestamp 时才设置。只能缩短。只读。

  • deletionTimestamp (Time)

    deletionTimestamp 是删除此资源的 RFC 3339 日期和时间。该字段在用户请求体面删除时由服务器设置,客户端不能直接设置。一旦 finalizers 列表为空,该资源预计将在此字段中的时间之后被删除(不再从资源列表中可见,并且无法通过名称访问)。只要 finalizers 列表包含项目,就阻止删除。一旦设置了 deletionTimestamp,该值可能不会被取消设置或在未来进一步设置,尽管它可能会缩短或在此时间之前可能会删除资源。例如,用户可能要求在 30 秒内删除一个 Pod。Kubelet 将通过向 Pod 中的容器发送体面的终止信号来做出反应。30 秒后,Kubelet 将向容器发送硬终止信号(SIGKILL),并在清理后从 API 中删除 Pod。在网络存在分区的情况下,此对象可能在此时间戳之后仍然存在,直到管理员或自动化进程可以确定资源已完全终止。如果未设置,则未请求体面删除该对象。

    请求体面删除时由系统填充。只读。更多信息:https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata

    Time 是 time.Time 的包装类,支持正确地序列化为 YAML 和 JSON。为 time 包提供的许多工厂方法提供了包装类。

  • generation (int64)

    表示期望状态的特定生成的序列号。由系统填充。只读。

  • resourceVersion (string)

    一个不透明的值,表示此对象的内部版本,客户端可以使用该值来确定对象是否已被更改。可用于乐观并发、变更检测以及对资源或资源集的监听操作。客户端必须将这些值视为不透明的,且未更改地传回服务器。它们可能仅对特定资源或一组资源有效。

    由系统填充。只读。客户端必须将值视为不透明。更多信息:https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency

  • selfLink (string)

    selfLink 是表示此对象的 URL。由系统填充。只读。

    已弃用。Kubernetes 将在 1.20 版本中停止传播该字段,并计划在 1.21 版本中删除该字段。

  • uid (string)

    UID 是该对象在时间和空间上的唯一值。它通常由服务器在成功创建资源时生成,并且不允许使用 PUT 操作更改。

    由系统填充。只读。更多信息:https://kubernetes.io/zh-cn/docs/concepts/overview/working-with-objects/names#uids

8 - ObjectReference

ObjectReference 包含足够的信息,可以让你检查或修改引用的对象。

import "k8s.io/api/core/v1"

ObjectReference 包含足够的信息,允许你检查或修改引用的对象。


  • apiVersion (string)

    被引用者的 API 版本。

  • fieldPath (string)

    如果引用的是对象的某个对象是整个对象,则该字符串而不是应包含的 JSON/Go 字段有效访问语句,例如 desiredState.manifest.containers[ 2 ]。例如,如果对象引用针对的是 Pod 中的一个容器,此字段取值类似于:spec.containers{name}name 指触发的容器的名称),或者如果没有指定容器名称,spec.containers[ 2 ](此 Pod 中索引为 2 的容器)。选择这种只是为了有一些定义好的语法来引用对象的部分。

9 - Patch

提供 Patch 是为了给 Kubernetes PATCH 请求正文提供一个具体的名称和类型。

import "k8s.io/apimachinery/pkg/apis/meta/v1"

提供 Patch 是为了给 Kubernetes PATCH 请求正文提供一个具体的名称和类型。


10 - Quantity

数量(Quantity)是数字的定点表示。

import "k8s.io/apimachinery/pkg/api/resource"

数量(Quantity)是数字的定点表示。除了 String() 和 AsInt64() 的访问接口之外,它以 JSON 和 YAML 形式提供方便的打包和解包方法。

序列化格式如下:

<quantity>        ::= <signedNumber><suffix>

(注意 <suffix> 可能为空,例如 <decimalSI> 的 "" 情形。)

<digit>           ::= 0 | 1 | ... | 9
<digits>          ::= <digit> | <digit><digits>
<number>          ::= <digits> | <digits>.<digits> | <digits>. | .<digits>
<sign>            ::= "+" | "-"
<signedNumber>    ::= <number> | <sign><number>
<suffix>          ::= <binarySI> | <decimalExponent> | <decimalSI>
<binarySI>        ::= Ki | Mi | Gi | Ti | Pi | Ei

(国际单位制度;查阅: http://physics.nist.gov/cuu/Units/binary.html)

<decimalSI>       ::= m | "" | k | M | G | T | P | E

(注意,1024 = 1ki 但 1000 = 1k;我没有选择大写。)

<decimalExponent> ::= "e" <signedNumber> | "E" <signedNumber>

无论使用三种指数形式中哪一种,没有数量可以表示大于 263-1 的数,也不可能超过 3 个小数位。更大或更精确的数字将被截断或向上取整(例如:0.1m 将向上取整为 1m)。如果将来我们需要更大或更小的数量,可能会扩展。

当从字符串解析数量时,它将记住它具有的后缀类型,并且在序列化时将再次使用相同类型。

在序列化之前,数量将以“规范形式”放置。这意味着指数或者后缀将被向上或向下调整(尾数相应增加或减少),并确保:

  • 没有精度丢失
  • 不会输出小数数字
  • 指数(或后缀)尽可能大。

除非数量是负数,否则将省略正负号。

例如:

  • 1.5 将会被序列化成 “1500m”
  • 1.5Gi 将会被序列化成 “1536Mi”

请注意,数量永远不会在内部以浮点数表示。这是本设计的重中之重。

只要它们格式正确,非规范值仍将解析,但将以其规范形式重新输出(所以应该总是使用规范形式,否则不要执行 diff 比较)。

这种格式旨在使得很难在不撰写某种特殊处理代码的情况下使用这些数字,进而希望实现者也使用定点实现。


11 - ResourceFieldSelector

ResourceFieldSelector 表示容器资源(CPU,内存)及其输出格式。

import "k8s.io/api/core/v1"

ResourceFieldSelector 表示容器资源(CPU,内存)及其输出格式。


  • resource (string),必需

    必需:选择的资源。

  • containerName (string)

    容器名称:对卷必需,对环境变量可选。

  • divisor (Quantity)

    指定所公开的资源的输出格式,默认值为 “1”。

12 - Status

状态(Status)是不返回其他对象的调用的返回值。

import "k8s.io/apimachinery/pkg/apis/meta/v1"

状态(Status)是不返回其他对象的调用的返回值。


  • apiVersion (string)

    apiVersion 定义对象表示的版本化模式。服务器应将已识别的模式转换为最新的内部值,并可能拒绝无法识别的值。更多信息: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources

  • code (int32)

    此状态的建议 HTTP 返回代码,如果未设置,则为 0。

  • details (StatusDetails)

    与原因(Reason)相关的扩展数据。每个原因都可以定义自己的扩展细节。此字段是可选的,并且不保证返回的数据符合任何模式,除非由原因类型定义。

    StatusDetails 是一组附加属性,可以由服务器设置以提供有关响应的附加信息。状态对象的原因字段定义将设置哪些属性。客户端必须忽略与每个属性的定义类型不匹配的字段,并且应该假定任何属性可能为空、无效或未定义。

    • details.causes ([]StatusCause)

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

      causes 数组包含与 StatusReason 故障相关的更多详细信息。并非所有 StatusReasons 都可以提供详细的原因。

      StatusCause 提供有关 api.Status 失败的更多信息,包括遇到多个错误的情况。

      • details.causes.field (string)

        导致此错误的资源字段,由其 JSON 序列化命名。可能包括嵌套属性的点和后缀表示法。数组是从零开始索引的。由于字段有多个错误,字段可能会在一系列原因中出现多次。可选。

        示例:

        • “name”:当前资源上的字段 “name”
        • “items[0].name”:“items” 中第一个数组条目上的字段 “name”
      • details.causes.message (string)

        对错误原因的可读描述。该字段可以按原样呈现给读者。

      • details.causes.reason (string)

        错误原因的机器可读描述。如果此值为空,则没有可用信息。

    • details.group (string)

      与状态 StatusReason 关联的资源的组属性。

    • details.kind (string)

      与状态 StatusReason 关联的资源的类别属性。在某些操作上可能与请求的资源类别不同。更多信息: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds

    • details.name (string)

      与状态 StatusReason 关联的资源的名称属性(当有一个可以描述的名称时)。

    • details.retryAfterSeconds (int32)

      如果指定,则应重试操作前的时间(以秒为单位)。一些错误可能表明客户端必须采取替代操作——对于这些错误,此字段可能指示在采取替代操作之前等待多长时间。

    • details.uid (string)

      资源的 UID(当有单个可以描述的资源时)。更多信息:https://kubernetes.io/zh-cn/docs/concepts/overview/working-with-objects/names#uids

  • kind (string)

    kind 是一个字符串值,表示此对象表示的 REST 资源。服务器可以从客户端提交请求的端点推断出这一点。无法更新。驼峰式规则。更多信息:https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds

  • message (string)

    此操作状态的人类可读描述。

  • metadata (ListMeta)

    标准的列表元数据。更多信息:https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds

  • reason (string)

    机器可读的说明,说明此操作为何处于“失败”状态。如果此值为空,则没有可用信息。reason 澄清了 HTTP 状态代码,但不会覆盖它。

  • status (string)

    操作状态。“Success”或“Failure” 之一。更多信息:https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status

13 - TypedLocalObjectReference

TypedLocalObjectReference 包含足够的信息,可以让你在同一个名称空间中定位指定类型的引用对象。

import "k8s.io/api/core/v1"

TypedLocalObjectReference 包含足够的信息,可以让你在同一个名称空间中定位特定类型的引用对象。


  • kind (string),必需

    kind 是被引用的资源的类型。

  • name (string),必需

    name 是被引用的资源的名称。

  • apiGroup (string)

    apiGroup 是被引用资源的组。如果不指定 apiGroup,则指定的 kind 必须在核心 API 组中。对于任何其它第三方类型,都需要 apiGroup。