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 集:
InstallModeType | 描述 |
---|---|
| Operator 可以是选择其自有命名空间的 OperatorGroup 的成员。 |
| Operator 可以是选择某一个命名空间的 OperatorGroup 的成员。 |
| Operator 可以是选择多个命名空间的 OperatorGroup 的成员。 |
|
Operator 可以是选择所有命名空间的 OperatorGroup 的成员(目标命名空间集为空字符串 |
如果 CSV 的 spec 省略了 InstallModeType
条目,则该类型将被认为不受支持,除非可通过暗示支持的现有条目推算出其受支持。
2.3.3. 目标命名空间选择
使用带有 spec.selector
字段的标签选择器为 OperatorGroup 指定命名空间集:
apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: my-group namespace: my-namespace spec: selector: matchLabels: cool.io/prod: "true"
您还可使用 spec.targetNamespaces
字段显式命名目标命名空间:
apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: my-group namespace: my-namespace spec: targetNamespaces: - my-namespace - my-other-namespace - my-other-other-namespace
如果 spec.targetNamespaces
和 spec.selector
均已定义,则会忽略 spec.selector
。
另外,您还可省略 spec.selector
和 spec.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 附有以下注解:
注解 | 描述 |
---|---|
| 包含 OperatorGroup 的名称。 |
| 包含 OperatorGroup 的命名空间。 |
| 包含以逗号分隔的字符串,该字符串列出了 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 | 要匹配的标签 |
---|---|
|
|
|
|
|
|
当 CSV 成为 OperatorGroup 的活跃成员时,只要该 CSV 正在使用 AllNamespaces
InstallMode 来监视所有命名空间,且没有因 InterOperatorGroupOwnerConflict
原因处于故障状态,便会生成以下 RBAC 资源。
ClusterRole | 设置 |
---|---|
|
聚合标签:
|
|
聚合标签:
|
|
聚合标签:
|
|
聚合标签:
|
ClusterRole | 设置 |
---|---|
|
聚合标签:
|
|
聚合标签:
|
|
聚合标签:
|
额外的 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 的并集。
-
将 OperatorGroup 的
如果结果为
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 造成的故障状态并非终端状态。
每次 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 将转变为等待处理状态。