×

关于 Operator 组

OperatorGroup资源定义的Operator 组为 OLM 安装的 Operator 提供多租户配置。Operator 组选择要为其成员 Operator 生成所需 RBAC 访问权限的目标命名空间。

目标命名空间集由存储在集群服务版本 (CSV) 的olm.targetNamespaces注释中的逗号分隔的字符串提供。此注释应用于成员 Operator 的 CSV 实例,并投影到它们的部署中。

Operator 组成员资格

如果满足以下条件,则认为 Operator 是 Operator 组的成员

  • Operator 的 CSV 存在于与 Operator 组相同的命名空间中。

  • Operator 的 CSV 中的安装模式支持 Operator 组目标的命名空间集。

CSV 中的安装模式包含InstallModeType字段和布尔值Supported字段。CSV 的规范可以包含四种不同InstallModeTypes的安装模式集。

表 1. 安装模式和支持的 Operator 组
InstallModeType 描述

OwnNamespace

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

SingleNamespace

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

MultiNamespace

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

AllNamespaces

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

如果 CSV 的规范省略了InstallModeType的条目,则除非现有条目隐式支持它,否则该类型被认为是不受支持的。

目标命名空间选择

您可以使用spec.targetNamespaces参数显式命名 Operator 组的目标命名空间。

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使用标签选择器,因为在将来的版本中可能会删除对 Operator 组中多个目标命名空间的支持。

如果同时定义了spec.targetNamespacesspec.selector,则忽略spec.selector。或者,您可以同时省略spec.selectorspec.targetNamespaces来指定全局Operator 组,该组选择所有命名空间。

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

已解析的选择命名空间集显示在 Opeator 组的status.namespaces参数中。全局 Operator 组的status.namespace包含空字符串 (""),这向使用 Operator 发出信号,指示它应该监视所有命名空间。

Operator 组 CSV 注释

Operator 组的成员 CSV 具有以下注释:

注释 描述

olm.operatorGroup=<group_name>

包含 Operator 组的名称。

olm.operatorNamespace=<group_namespace>

包含 Operator 组的命名空间。

olm.targetNamespaces=<target_namespaces>

包含一个逗号分隔的字符串,列出 Operator 组的目标命名空间选择。

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

提供的 API 注释

组/版本/种类 (GVK) 是 Kubernetes API 的唯一标识符。有关 Operator 组提供的 GVK 信息显示在olm.providedAPIs注释中。注释的值是一个由逗号分隔的<kind>.<version>.<group>组成的字符串。包含 Operator 组所有活动成员 CSV 提供的 CRD 和 API 服务的 GVK。

查看以下具有单个活动成员 CSV 的OperatorGroup对象的示例,该 CSV 提供PackageManifest资源。

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

基于角色的访问控制

创建操作符组时,会生成三个集群角色。每个角色包含一个单一的聚合规则,其集群角色选择器设置为匹配如下所示的标签。

集群角色 匹配标签

olm.og.<operatorgroup_name>-admin-<hash_value>

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

olm.og.<operatorgroup_name>-edit-<hash_value>

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

olm.og.<operatorgroup_name>-view-<hash_value>

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

当 CSV 成为操作符组的活动成员时,会生成以下 RBAC 资源,只要 CSV 使用AllNamespaces安装模式监视所有命名空间,并且状态未因InterOperatorGroupOwnerConflict原因而失败。

  • 来自 CRD 的每个 API 资源的集群角色

  • 来自 API 服务的每个 API 资源的集群角色

  • 附加的角色和角色绑定

表 2. 来自 CRD 的每个 API 资源生成的集群角色
集群角色 设置

<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>的操作

  • 创建

  • 更新

  • 修补

  • 删除

聚合标签

  • rbac.authorization.k8s.io/aggregate-to-edit: true

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

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

<kind>的操作

  • 获取

  • 列出

  • 监视

聚合标签

  • 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>的操作

  • 获取

聚合标签

  • rbac.authorization.k8s.io/aggregate-to-view: true

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

表 3. 来自 API 服务的每个 API 资源生成的集群角色
集群角色 设置

<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>的操作

  • 创建

  • 更新

  • 修补

  • 删除

聚合标签

  • rbac.authorization.k8s.io/aggregate-to-edit: true

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

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

<kind>的操作

  • 获取

  • 列出

  • 监视

聚合标签

  • rbac.authorization.k8s.io/aggregate-to-view: true

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

附加的角色和角色绑定
  • 如果 CSV 定义的唯一目标命名空间包含*,则会为 CSV 的permissions字段中定义的每个权限生成一个集群角色和相应的集群角色绑定。所有生成的资源都将被赋予olm.owner: <csv_name>olm.owner.namespace: <csv_namespace>标签。

  • 如果 CSV *没有*定义包含*的唯一目标命名空间,则操作符命名空间中所有带有olm.owner: <csv_name>olm.owner.namespace: <csv_namespace>标签的角色和角色绑定都将复制到目标命名空间。

已复制的 CSV

OLM 在操作符组的每个目标命名空间中创建操作符组所有活动成员 CSV 的副本。已复制的 CSV 的目的是告诉目标命名空间的用户已配置特定的操作符来监视在此处创建的资源。

已复制的 CSV 的状态原因是Copied,并且会更新以匹配其源 CSV 的状态。olm.targetNamespaces注释会在其在集群上创建之前从已复制的 CSV 中去除。省略目标命名空间选择可避免租户之间目标命名空间的重复。

当其源 CSV 不再存在或其源 CSV 所属的操作符组不再以已复制的 CSV 的命名空间为目标时,已复制的 CSV 将被删除。

默认情况下,disableCopiedCSVs字段被禁用。启用disableCopiedCSVs字段后,OLM 将删除集群上现有的已复制 CSV。禁用disableCopiedCSVs字段后,OLM 将再次添加已复制的 CSV。

  • 禁用disableCopiedCSVs字段

    $ cat << EOF | oc apply -f -
    apiVersion: operators.coreos.com/v1
    kind: OLMConfig
    metadata:
      name: cluster
    spec:
      features:
        disableCopiedCSVs: false
    EOF
  • 启用disableCopiedCSVs字段

    $ cat << EOF | oc apply -f -
    apiVersion: operators.coreos.com/v1
    kind: OLMConfig
    metadata:
      name: cluster
    spec:
      features:
        disableCopiedCSVs: true
    EOF

静态操作符组

如果操作符组的spec.staticProvidedAPIs字段设置为true,则该操作符组为*静态*的。因此,OLM 不会修改操作符组的olm.providedAPIs注释,这意味着它可以提前设置。当用户想要使用操作符组来防止一组命名空间中的资源争用,但没有提供这些资源的 API 的活动成员 CSV 时,这很有用。

以下是一个操作符组的示例,该操作符组使用something.cool.io/cluster-monitoring: "true"注释保护所有命名空间中的Prometheus资源。

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"

操作符组交集

如果两个操作符组的目标命名空间集的交集不是空集,并且其提供的 API 集(由olm.providedAPIs注释定义)的交集不是空集,则称这两个操作符组具有*重叠的提供的 API*。

一个潜在的问题是,具有重叠提供的 API 的操作符组可能会争夺重叠命名空间集中的相同资源。

检查交集规则时,操作符组命名空间始终包含在其选定的目标命名空间中。

交集规则

每次活动成员 CSV 同步时,OLM 都会查询集群以获取 CSV 的操作符组与所有其他操作符组之间重叠提供的 API 集。然后,OLM 检查该集合是否为空集。

  • 如果为true并且 CSV 提供的 API 是操作符组的子集

    • 继续转换。

  • 如果为true并且 CSV 提供的 API *不是*操作符组的子集

    • 如果操作符组是静态的

      • 清理属于 CSV 的所有部署。

      • 将 CSV 转变为失败状态,状态原因是CannotModifyStaticOperatorGroupProvidedAPIs

    • 如果操作符组*不是*静态的

      • 将操作符组的olm.providedAPIs注释替换为自身及其 CSV 提供的 API 的并集。

  • 如果为false并且 CSV 提供的 API *不是*操作符组的子集

    • 清理属于 CSV 的所有部署。

    • 将 CSV 转变为失败状态,状态原因是InterOperatorGroupOwnerConflict

  • 如果为false并且 CSV 提供的 API 是操作符组的子集

    • 如果操作符组是静态的

      • 清理属于 CSV 的所有部署。

      • 将 CSV 转变为失败状态,状态原因是CannotModifyStaticOperatorGroupProvidedAPIs

    • 如果操作符组*不是*静态的

      • 将操作符组的olm.providedAPIs注释替换为自身与 CSV 提供的 API 的差集。

由操作符组引起的状态失败是非终端的。

每次操作符组同步时,都会执行以下操作

  • 从集群计算活动成员 CSV 提供的 API 集。请注意,已复制的 CSV 将被忽略。

  • 将集群集与olm.providedAPIs进行比较,如果olm.providedAPIs包含任何额外的 API,则会修剪这些 API。

  • 重新排队所有在所有命名空间中提供相同 API 的 CSV。这会通知重叠组中的冲突 CSV,它们的冲突可能已通过调整大小或删除冲突 CSV 而解决。

多租户操作符管理的限制

OpenShift Container Platform 对在同一集群上同时安装不同版本的 Operator 提供有限的支持。Operator Lifecycle Manager (OLM) 在不同的命名空间中多次安装 Operator。一个约束是 Operator 的 API 版本必须相同。

由于使用CustomResourceDefinition对象 (CRD)(Kubernetes 中的全局资源),Operator 是控制平面扩展。不同主要版本的 Operator 通常具有不兼容的 CRD。这使得它们无法在集群的不同命名空间中同时安装。

所有租户或命名空间共享集群的同一控制平面。因此,多租户集群中的租户也共享全局 CRD,这限制了可以在同一集群上并行使用同一 Operator 的不同实例的场景。

支持的场景包括:

  • 提供完全相同的 CRD 定义的不同版本的 Operator(对于版本化的 CRD,是完全相同的版本集)

  • 不同版本的 Operator 如果没有自带 CRD,而是其 CRD 在 OperatorHub 上的单独包中提供,则属于这种情况。

所有其他场景都不受支持,因为如果在同一集群上有多个来自不同 Operator 版本的相互竞争或重叠的 CRD 需要协调,则无法保证集群数据的完整性。

Operator 组故障排除

成员资格

  • 安装计划的命名空间必须只包含一个 Operator 组。当尝试在命名空间中生成集群服务版本 (CSV) 时,安装计划会认为以下场景中的 Operator 组无效:

    • 安装计划的命名空间中不存在 Operator 组。

    • 安装计划的命名空间中存在多个 Operator 组。

    • 在 Operator 组中指定了错误的或不存在的服务帐户名称。

    如果安装计划遇到无效的 Operator 组,则不会生成 CSV,并且InstallPlan 资源会继续安装并显示相关消息。例如,如果在同一命名空间中存在多个 Operator 组,则会提供以下消息:

    attenuated service account query failed - more than one operator group(s) are managing this namespace count=2

    其中count=指定命名空间中 Operator 组的数量。

  • 如果 CSV 的安装模式不支持其命名空间中 Operator 组的目标命名空间选择,则 CSV 将转换到失败状态,原因是UnsupportedOperatorGroup。出于此原因而处于失败状态的 CSV,在 Operator 组的目标命名空间选择更改为受支持的配置,或者 CSV 的安装模式被修改为支持目标命名空间选择后,将转换到挂起状态。