apiVersion: operators.coreos.com/v1
kind: OperatorGroup
metadata:
name: my-group
namespace: my-namespace
spec:
targetNamespaces:
- my-namespace
本指南概述了在 AWS 上的 Red Hat OpenShift Service 中使用 Operator Lifecycle Manager (OLM) 的 Operator 组。
由OperatorGroup
资源定义的Operator 组为 OLM 安装的 Operator 提供多租户配置。Operator 组选择要为其成员 Operator 生成所需 RBAC 访问权限的目标命名空间。
目标命名空间集由存储在集群服务版本 (CSV) 的olm.targetNamespaces
注释中的逗号分隔的字符串提供。此注释应用于成员 Operator 的 CSV 实例,并投影到它们的部署中。
如果满足以下条件,则 Operator 被视为 Operator 组的成员
Operator 的 CSV 存在于与 Operator 组相同的命名空间中。
Operator 的 CSV 中的安装模式支持 Operator 组定位的命名空间集。
CSV 中的安装模式包含InstallModeType
字段和布尔值Supported
字段。CSV 的规范可以包含一组四个不同InstallModeTypes
的安装模式。
InstallModeType | 描述 |
---|---|
|
Operator 可以是选择其自身命名空间的 Operator 组的成员。 |
|
Operator 可以是选择一个命名空间的 Operator 组的成员。 |
|
Operator 可以是选择多个命名空间的 Operator 组的成员。 |
|
Operator 可以是选择所有命名空间(目标命名空间集为空字符串 |
如果 CSV 的规范省略了 |
您可以使用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
,则忽略spec.selector
。或者,您可以省略spec.selector
和spec.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 组的名称。 |
|
包含 Operator 组的命名空间。 |
|
包含一个逗号分隔的字符串,其中列出了 Operator 组的目标命名空间选择。 |
除 |
组/版本/种类 (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
创建 Operator 组时,会生成三个集群角色。每个角色都包含一个单个聚合规则,其中集群角色选择器设置为匹配标签,如下所示:
集群角色 | 要匹配的标签 |
---|---|
|
|
|
|
|
|
只要 CSV 使用AllNamespaces
安装模式监视所有命名空间,并且没有因原因InterOperatorGroupOwnerConflict
而处于失败状态,则当 CSV 成为 Operator 组的活动成员时,就会生成以下 RBAC 资源:
来自 CRD 的每个 API 资源的集群角色
来自 API 服务的每个 API 资源的集群角色
其他角色和角色绑定
集群角色 | 设置 |
---|---|
|
在
聚合标签
|
|
在
聚合标签
|
|
在
聚合标签
|
|
在
聚合标签
|
集群角色 | 设置 |
---|---|
|
在
聚合标签
|
|
在
聚合标签
|
|
在
聚合标签
|
如果 CSV 定义的恰好一个目标命名空间包含*
,则为 CSV 的permissions
字段中定义的每个权限生成一个集群角色和相应的集群角色绑定。所有生成的资源都将被赋予olm.owner: <csv_name>
和olm.owner.namespace: <csv_namespace>
标签。
如果 CSV *没有*定义恰好一个包含*
的目标命名空间,则将操作符命名空间中所有具有olm.owner: <csv_name>
和olm.owner.namespace: <csv_namespace>
标签的角色和角色绑定复制到目标命名空间。
OLM 在操作符组的每个目标命名空间中创建操作符组所有活动成员 CSV 的副本。已复制 CSV 的目的是告诉目标命名空间的用户已配置特定的操作符来监视在其中创建的资源。
已复制的 CSV 的状态原因是Copied
,并更新为与其源 CSV 的状态匹配。olm.targetNamespaces
注释在它们在集群上创建之前从已复制的 CSV 中删除。省略目标命名空间选择可以避免租户之间目标命名空间的重复。
当其源 CSV 不再存在或其源 CSV 所属的操作符组不再以已复制 CSV 的命名空间为目标时,将删除已复制的 CSV。
默认情况下,
|
如果操作符组的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"
如果两个操作符组的目标命名空间集的交集不是空集,并且由olm.providedAPIs
注释定义的提供的 API 集的交集不是空集,则称这两个操作符组具有*相交的提供的 API*。
一个潜在的问题是,具有相交提供的 API 的操作符组可能会争夺相交命名空间集中的相同资源。
在检查交集规则时,操作符组命名空间始终包含在其选择的目标命名空间中。 |
每次活动成员 CSV 同步时,OLM都会查询集群以查找CSV的操作符组与所有其他操作符组之间相交提供的API集。然后,OLM检查该集合是否为空集。
如果为true
且CSV提供的API是操作符组的子集
继续过渡。
如果为true
且CSV提供的API*不是*操作符组的子集
如果操作符组是静态的
清理属于CSV的所有部署。
将CSV过渡到失败状态,状态原因CannotModifyStaticOperatorGroupProvidedAPIs
。
如果操作符组*不是*静态的
用自身和CSV提供的API的并集替换操作符组的olm.providedAPIs
注释。
如果为false
且CSV提供的API*不是*操作符组的子集
清理属于CSV的所有部署。
将CSV过渡到失败状态,状态原因InterOperatorGroupOwnerConflict
。
如果为false
且CSV提供的API是操作符组的子集
如果操作符组是静态的
清理属于CSV的所有部署。
将CSV过渡到失败状态,状态原因CannotModifyStaticOperatorGroupProvidedAPIs
。
如果操作符组*不是*静态的
用自身和CSV提供的API的差集替换操作符组的olm.providedAPIs
注释。
由操作符组导致的失败状态是非终端状态。 |
每次操作符组同步时都会执行以下操作
从集群计算活动成员 CSV 提供的 API 集。请注意,已复制的 CSV 将被忽略。
将集群集与olm.providedAPIs
进行比较,如果olm.providedAPIs
包含任何额外的API,则修剪这些API。
重新排队所有在所有命名空间中提供相同 API 的 CSV。这将通知相交组中发生冲突的 CSV,它们的冲突可能已通过调整大小或删除冲突的 CSV 而得到解决。
Red Hat OpenShift Service on AWS 对在同一集群上同时安装不同版本的 Operator 提供有限的支持。Operator Lifecycle Manager (OLM) 在不同的命名空间中多次安装 Operator。一个限制是 Operator 的 API 版本必须相同。
由于使用CustomResourceDefinition
对象 (CRD)(Kubernetes 中的全局资源),操作符是控制平面扩展。不同主要版本的 Operator 往往具有不兼容的 CRD。这使得它们不兼容,无法在集群的不同命名空间中同时安装。
所有租户或命名空间共享集群的相同控制平面。因此,多租户集群中的租户也共享全局 CRD,这限制了在同一集群上可以并行使用同一 Operator 的不同实例的情况。
支持的场景包括:
提供完全相同的 CRD 定义的不同版本的 Operator(对于版本化的 CRD,是完全相同的版本集)
不提供 CRD,而是其 CRD 在 OperatorHub 上单独捆绑包中可用的不同版本的 Operator
所有其他场景都不受支持,因为如果同一集群上有来自不同 Operator 版本的多个竞争或重叠的 CRD 需要协调,则无法保证集群数据的完整性。
安装计划的命名空间必须只包含一个操作符组。在尝试在命名空间中生成集群服务版本 (CSV) 时,安装计划在以下情况下会认为操作符组无效:
安装计划的命名空间中不存在操作符组。
安装计划的命名空间中存在多个操作符组。
在操作符组中指定了不正确或不存在的服务帐户名称。
如果安装计划遇到无效的操作符组,则不会生成 CSV,并且InstallPlan
资源将继续安装并显示相关消息。例如,如果在同一命名空间中存在多个操作符组,则会提供以下消息:
attenuated service account query failed - more than one operator group(s) are managing this namespace count=2
其中count=
指定命名空间中操作符组的数量。
如果 CSV 的安装模式不支持其命名空间中 Operator 组的目标命名空间选择,则 CSV 将转换到失败状态,原因代码为 UnsupportedOperatorGroup
。处于此失败状态的 CSV 将在 Operator 组的目标命名空间选择更改为受支持的配置,或 CSV 的安装模式被修改为支持目标命名空间选择后,转换到待处理状态。