2.3. OperatorGroup

该指南概述了 OpenShift Container Platform 中 Operator Lifecycle Manager (OLM) 的 OperatorGroup 使用情况。

2.3.1. 关于 OperatorGroup

OperatorGroup 是一个 OLM 资源,为 OLM 安装的 Operator 提供多租户配置。OperatorGroup 选择目标命名空间,在其中为其成员 Operator 生成所需的 RBAC 访问权限。

这一组目标命名空间通过存储在 ClusterServiceVersion (CSV) 的 olm.targetNamespaces 注解中的以逗号分隔的字符串来提供。该注解应用于成员 Operator 的 CSV 实例,并注入它们的部署中。

2.3.2. OperatorGroup 成员资格

满足以下任一条件,Operator 即可被视为 OperatorGroup 的 member

  • Operator 的 CSV 与 OperatorGroup 存在于同一命名空间中。
  • Operator 的 CSV InstallMode 支持 OperatorGroup 所针对的命名空间集。

InstallMode 由 InstallModeType 字段和 Supported 布尔字段组成。CSV 的 spec 可包含由四个不同 InstallModeType 组成的 InstallMode 集:

表 2.4. InstallMode 和受支持的 OperatorGroup

InstallModeType描述

OwnNamespace

Operator 可以是选择其自有命名空间的 OperatorGroup 的成员。

SingleNamespace

Operator 可以是选择某一个命名空间的 OperatorGroup 的成员。

MultiNamespace

Operator 可以是选择多个命名空间的 OperatorGroup 的成员。

AllNamespaces

Operator 可以是选择所有命名空间的 OperatorGroup 的成员(目标命名空间集为空字符串 "")。

注意

如果 CSV 的 spec 省略了 InstallModeType 条目,则该类型将被认为不受支持,除非可通过暗示支持的现有条目推算出其受支持。

2.3.3. 目标命名空间选择

您可以使用 spec.targetNamespaces 参数为 OperatorGroup 显式命名目标命名空间:

apiVersion: operators.coreos.com/v1
kind: OperatorGroup
metadata:
  name: my-group
  namespace: my-namespace
spec:
  targetNamespaces:
  - my-namespace

您还可以使用带有 spec.selector 参数的标签选择器指定命名空间:

apiVersion: operators.coreos.com/v1
kind: OperatorGroup
metadata:
  name: my-group
  namespace: my-namespace
  spec:
    selector:
      cool.io/prod: "true"
重要

不建议通过 spec.targetNamespaces 列出多个命名空间,或通过 spec.selector 使用标签选择器,因为在以后的版本中可能会取消对 OperatorGroup 中的多个目标命名空间的支持。

如果 spec.targetNamespacesspec.selector 均已定义,则会忽略 spec.selector。另外,您还可省略 spec.selectorspec.targetNamespaces,以指定选择所有命名空间的全局 OperatorGroup:

apiVersion: operators.coreos.com/v1
kind: OperatorGroup
metadata:
  name: my-group
  namespace: my-namespace

选定命名空间的解析集会显示在 OperatorGroup 的 status.namespaces 参数中。全局 OperatorGroup 的 status.namespace 包含空字符串 (""),而该字符串会向正在使用的 Operator 发出信号,要求其监视所有命名空间。

2.3.4. Operatorgroup CSV 注解

OperatorGroup 的成员 CSV 附有以下注解:

注解描述

olm.operatorGroup=<group_name>

包含 OperatorGroup 的名称。

olm.operatorGroupNamespace=<group_namespace>

包含 OperatorGroup 的命名空间。

olm.targetNamespaces=<target_namespaces>

包含以逗号分隔的字符串,该字符串列出了 OperatorGroup 的目标命名空间选择。

注意

olm.targetNamespaces 以外的所有注解均包含在复制的 CSV 中。在复制的 CSV 上省略 olm.targetNamespaces 注解可防止租户之间目标命名空间出现重复。

2.3.5. 所提供的 API 注解

olm.providedAPIs 注解中会显示有关 OperatorGroup 提供了哪些 GroupVersionKinds (GVK) 的信息。该注解值为一个字符串,由用逗号分隔的 <kind>.<version>.<group> 组成。其中包括由 OperatorGroup 的所有活跃成员 CSV 提供的 CRD 和 APIService 的 GVK。

查看以下 OperatorGroup 示例,该 OperatorGroup 带有提供 PackageManifest 资源的单个活跃成员 CSV:

apiVersion: operators.coreos.com/v1
kind: OperatorGroup
metadata:
  annotations:
    olm.providedAPIs: PackageManifest.v1alpha1.packages.apps.redhat.com
  name: olm-operators
  namespace: local
  ...
spec:
  selector: {}
  serviceAccount:
    metadata:
      creationTimestamp: null
  targetNamespaces:
  - local
status:
  lastUpdated: 2019-02-19T16:18:28Z
  namespaces:
  - local

2.3.6. 基于角色的访问控制

创建 OperatorGroup 时,会生成三个 ClusterRole。每个 ClusterRole 均包含一个 AggregationRule,后者设置了 ClusterRoleSelector 以匹配标签,如下所示:

ClusterRole要匹配的标签

<operatorgroup_name>-admin

olm.opgroup.permissions/aggregate-to-admin: <operatorgroup_name>

<operatorgroup_name>-edit

olm.opgroup.permissions/aggregate-to-edit: <operatorgroup_name>

<operatorgroup_name>-view

olm.opgroup.permissions/aggregate-to-view: <operatorgroup_name>

当 CSV 成为 OperatorGroup 的活跃成员时,只要该 CSV 正在使用 AllNamespaces InstallMode 来监视所有命名空间,且没有因 InterOperatorGroupOwnerConflict 原因处于故障状态,便会生成以下 RBAC 资源。

  • 来自 CRD 的每个 API 资源的 ClusterRole
  • 来自 APIService 中每个 API 资源的 ClusterRole
  • 额外的 Role 和 RoleBinding

表 2.5. 来自 CRD,针对每个 API 资源生成的 ClusterRole

ClusterRole设置

<kind>.<group>-<version>-admin

<kind> 上的操作动词:

  • *

聚合标签:

  • rbac.authorization.k8s.io/aggregate-to-admin: true
  • olm.opgroup.permissions/aggregate-to-admin: <operatorgroup_name>

<kind>.<group>-<version>-edit

<kind> 上的操作动词:

  • create
  • update
  • patch
  • delete

聚合标签:

  • rbac.authorization.k8s.io/aggregate-to-edit: true
  • olm.opgroup.permissions/aggregate-to-edit: <operatorgroup_name>

<kind>.<group>-<version>-view

<kind> 上的操作动词:

  • get
  • list
  • watch

聚合标签:

  • rbac.authorization.k8s.io/aggregate-to-view: true
  • olm.opgroup.permissions/aggregate-to-view: <operatorgroup_name>

<kind>.<group>-<version>-view-crdview

apiextensions.k8s.io customresourcedefinitions <crd-name> 上的操作动词:

  • get

聚合标签:

  • rbac.authorization.k8s.io/aggregate-to-view: true
  • olm.opgroup.permissions/aggregate-to-view: <operatorgroup_name>

表 2.6. 来自 APIService,针对每个 API 资源生成的 ClusterRole

ClusterRole设置

<kind>.<group>-<version>-admin

<kind> 上的操作动词:

  • *

聚合标签:

  • rbac.authorization.k8s.io/aggregate-to-admin: true
  • olm.opgroup.permissions/aggregate-to-admin: <operatorgroup_name>

<kind>.<group>-<version>-edit

<kind> 上的操作动词:

  • create
  • update
  • patch
  • delete

聚合标签:

  • rbac.authorization.k8s.io/aggregate-to-edit: true
  • olm.opgroup.permissions/aggregate-to-edit: <operatorgroup_name>

<kind>.<group>-<version>-view

<kind> 上的操作动词:

  • get
  • list
  • watch

聚合标签:

  • rbac.authorization.k8s.io/aggregate-to-view: true
  • olm.opgroup.permissions/aggregate-to-view: <operatorgroup_name>

额外的 Role 和 RoleBinding

  • 如果 CSV 精确定义了一个包含 * 的目标命名空间,则会针对 CSV 权限字段中定义的每个权限生成一个 ClusterRole 和相应的 ClusterRoleBinding。所有生成的资源均会标上 olm.owner: <csv_name>olm.owner.namespace: <csv_namespace> 标签。
  • 如果 CSV 没有精确定义一个包含 * 的目标命名空间,则 Operator 命名空间中所有带有 olm.owner: <csv_name>olm.owner.namespace: <csv_namespace> 标签的 Role 和 RoleBinding 均会被复制到目标命名空间中。

2.3.7. 复制的 CSV

OLM 会在每个 OperatorGroup 的目标命名空间中复制 OperatorGroup 的所有活跃成员 CSV。复制 CSV 的目的在于告诉目标命名空间的用户,特定 Operator 已配置为监视在此创建的资源。复制的 CSV 会复制状态原因,并会更新以匹配其源 CSV 的状态。在集群上创建复制的 CSV 之前,会从这些 CSV 中分离 olm.targetNamespaces 注解。省略目标命名空间选择可避免租户之间存在目标命名空间重复的现象。当所复制的 CSV 的源 CSV 不存在或其源 CSV 所属的 OperatorGroup 不再指向复制的 CSV 命名空间时,将会删除复制的 CSV。

2.3.8. 静态 OperatorGroup

如果 OperatorGroup 的 spec.staticProvidedAPIs 字段设置为 true,则该 OperatorGroup 为静态。这样 OLM 就不会修改 OperatorGroup 的 olm.providedAPIs 注解,因此可以提前设置该注解。如果一组命名空间没有活跃的成员 CSV 来为资源提供 API,而用户想使用 OperatorGroup 来防止命名空间集中发生资源争用,则这一操作十分有用。

下面提供一个使用 something.cool.io/cluster-monitoring: "true" 注解来保护所有命名空间中 Prometheus 资源的 OperatorGroup 的示例:

apiVersion: operators.coreos.com/v1
kind: OperatorGroup
metadata:
  name: cluster-monitoring
  namespace: cluster-monitoring
  annotations:
    olm.providedAPIs: Alertmanager.v1.monitoring.coreos.com,Prometheus.v1.monitoring.coreos.com,PrometheusRule.v1.monitoring.coreos.com,ServiceMonitor.v1.monitoring.coreos.com
spec:
  staticProvidedAPIs: true
  selector:
    matchLabels:
      something.cool.io/cluster-monitoring: "true"

2.3.9. Operatorgroup 交集

如果两个 OperatorGroup 的目标命名空间集的交集不是空集,且根据 olm.providedAPIs 注解的定义,所提供的 API 集的交集也不是空集,则称这两个 OperatorGroup 的提供的 API 有交集

一个潜在问题是,提供的 API 有交集的 OperatorGroup 可能在命名空间交集中竞争相同资源。

注意

在检查交集规则时,OperatorGroup 的命名空间始终包含在其所选目标命名空间中。

交集规则

每次活跃成员 CSV 同步时,OLM 均会查询集群,以获取 CSV 的 OperatorGroup 和其他所有 OperatorGroup 之间在所提供的 API 方面的交集。然后 OLM 会检查该交集是否为空集:

  • 如果结果为 true,且 CSV 提供的 API 是 OperatorGroup 提供的 API 的子集:

    • 继续转变。
  • 如果结果为 true,且 CSV 提供的 API 不是 OperatorGroup 提供的 API 的子集:

    • 如果 OperatorGroup 是静态的:

      • 则清理属于 CSV 的所有部署。
      • 将 CSV 转变为故障状态,状态原因为:CannotModifyStaticOperatorGroupProvidedAPIs
    • 如果 OperatorGroup 不是静态的:

      • 将 OperatorGroup 的 olm.providedAPIs 注解替换为其本身与 CSV 提供的 API 的并集。
  • 如果结果为 false,且 CSV 提供的 API 不是 OperatorGroup 提供的 API 的子集:

    • 则清理属于 CSV 的所有部署。
    • 将 CSV 转变为故障状态,状态原因为:InterOperatorGroupOwnerConflict
  • 如果结果为 false,且 CSV 提供的 API 是 OperatorGroup 提供的 API 的子集:

    • 如果 OperatorGroup 是静态的:

      • 则清理属于 CSV 的所有部署。
      • 将 CSV 转变为故障状态,状态原因为:CannotModifyStaticOperatorGroupProvidedAPIs
    • 如果 OperatorGroup 不是静态的:

      • 将 OperatorGroup 的 olm.providedAPIs 注解替换为其本身与 CSV 提供的 API 的差集。
注意

由 OperatorGroup 造成的故障状态并非终端状态。

每次 OperatorGroup 同步时均会执行以下操作:

  • 来自活跃成员 CSV 的提供的 API 集是通过集群计算出来的。注意,复制的 CSV 会被忽略。
  • 将集群集与 olm.providedAPIs 进行比较,如果 olm.providedAPIs 包含任何额外 API,则将删除这些 API。
  • 在所有命名空间中提供相同 API 的所有 CSV 均会重新排序。这样可向交集组中的冲突 CSV 发送通知,表明可能已通过调整大小或删除冲突的 CSV 解决了冲突。

2.3.10. OperatorGroup 故障排除

成员资格
  • 如果一个命名空间中存在多个 OperatorGroup,则在该命名空间中创建的所有 CSV 均会变成故障状态,故障原因为:TooManyOperatorGroups。一旦命名空间中 OperatorGroup 的数量变成 1,因该原因处于故障状态的 CSV 将转变为等待处理状态。
  • 如果 CSV 的 InstallMode 不支持其命名空间中 OperatorGroup 的目标命名空间选择,CSV 将变为故障状态,故障原因为 UnsupportedOperatorGroup。一旦 OperatorGroup 的目标命名空间选择变为受支持的配置,或 CSV 的 InstallMode 经修改后支持 OperatorGroup 的目标命名空间选择,因该原因处于故障状态的 CSV 将转变为等待处理状态。