ClusterServiceVersion
(CSV)
应用程序元数据:名称、版本、图标、所需资源、安装等。
InstallPlan
Catalog
为自动安装或升级 CSV 而需创建的资源的计算列表。
CatalogSource
catsrc
Catalog
定义应用程序的 CSV、CRD 和软件包存储库。
Subscription
Catalog
用于通过跟踪软件包中的频道来保持 CSV 最新。
OperatorGroup
将部署在同一命名空间中的所有 Operator 配置为
OperatorGroup
对象,以便在一系列命名空间或集群范围内监视其自定义资源 ( CR)。
每个 Operator 还负责创建以下资源:
表 2.3. 由 OLM 和 Catalog Operator 创建的资源
资源
|
所有者
|
ServiceAccounts
(Cluster)Roles
(Cluster)RoleBindings
CustomResourceDefinitions
(CRD)
Catalog
ClusterServiceVersions
|
集群中存在 CSV 中指定需要的资源后,OLM Operator 将负责部署由 CSV 资源定义的应用程序。
OLM Operator 不负责创建所需资源;用户可选择使用 CLI 手动创建这些资源,也可选择使用 Catalog Operator 来创建这些资源。这种关注点分离的机制可以使得用户逐渐增加他们选择用于其应用程序的 OLM 框架量。
OLM Operator 使用以下工作流:
观察命名空间中的集群服务版本(CSV),并检查是否满足要求。
如果满足要求,请运行 CSV 的安装策略。
CSV 必须是 Operator 组的活跃成员,才可运行该安装策略。
2.4.2.3. Catalog Operator
Catalog Operator 负责解析和安装集群服务版本(CSV)以及它们指定的所需资源。另外还负责监视频道中的目录源中是否有软件包更新,并将其升级(可选择自动)至最新可用版本。
要跟踪频道中的软件包,您可以创建一个
Subscription
对象来配置所需的软件包、频道和
CatalogSource
对象,以便拉取更新。在找到更新后,便会代表用户将一个适当的
InstallPlan
对象写入命名空间。
Catalog Operator 使用以下工作流:
连接到集群中的每个目录源。
监视是否有用户创建的未解析安装计划,如果有:
查找与请求名称相匹配的 CSV,并将此 CSC 添加为已解析的资源。
对于每个受管或所需 CRD,将其添加为已解析的资源。
对于每个所需 CRD,找到管理相应 CRD 的 CSV。
监视是否有已解析的安装计划并为其创建已发现的所有资源(用户批准或自动)。
观察目录源和订阅并根据它们创建安装计划。
2.4.2.4. Catalog Registry
Catalog Registry 存储 CSV 和 CRD 以便在集群中创建,并存储有关软件包和频道的元数据。
package manifest
是 Catalog Registry 中的一个条目,用于将软件包标识与 CSV 集相关联。在软件包中,频道指向特定 CSV。因为 CSV 明确引用了所替换的 CSV,软件包清单向 Catalog Operator 提供了将 CSV 更新至频道中最新版本所需的信息,逐步安装和替换每个中间版本。
2.4.3. Operator Lifecycle Manager 工作流
本指南概述了 OpenShift Container Platform 中 Operator Lifecycle Manager (OLM) 的工作流。
2.4.3.1. OLM 中的 Operator 安装和升级工作流
在 Operator Lifecycle Manager (OLM) 生态系统中,以下资源用于解决 Operator 的安装和升级问题:
ClusterServiceVersion
(CSV)
CatalogSource
Subscription
CSV 中定义的 Operator 元数据可保存在一个称为目录源的集合中。目录源使用
Operator Registry API
,OLM 又使用目录源来查询是否有可用的 Operator 及已安装 Operator 是否有升级版本。
在目录源中,Operator 被整合为更新
软件包
和更新流,我们称为
频道
,这应是 OpenShift Container Platform 或其他软件(如 Web 浏览器)在持续发行周期中的常见更新模式。
用户在
订阅
中的特定目录源中指示特定软件包和频道,如
etcd
包及其
alpha
频道。如果订阅了命名空间中尚未安装的软件包,则会安装该软件包的最新 Operator。
OLM 会刻意避免版本比较,因此给定
catalog
→
channel
→
package
路径提供的“latest”或“newest”Operator 不一定是最高版本号。更应将其视为频道的
head
引用,类似 Git 存储库。
每个 CSV 均有一个
replaces
参数,指明所替换的是哪个 Operator。这样便构建了一个可通过 OLM 查询的 CSV 图,且不同频道之间可共享更新。可将频道视为更新图表的入口点:
对于相同从版本,
z-stream
或补丁版本必须取代所有先前 z-stream 版本。OLM 不考虑主版本、次版本或补丁版本,只需要在目录中构建正确的图表。
换句话说,OLM 必须能够像在
Old CatalogSource
中一样获取一个图表,像在
New CatalogSource
中一样生成一个图表:
该图表明:
Old CatalogSource
中的任何 Operator 在
New CatalogSource
中均有单一替换项。
New CatalogSource
中的任何 Operator 在
New CatalogSource
中均有单一替换项。
Old CatalogSource
中的所有 z-stream 版本均会更新至
New CatalogSource
中最新 z-stream 版本。
不可用版本可被视为“虚拟”图表节点;它们的内容无需存在,注册表只需像图表看上去这样响应即可。
2.4.4. Operator Lifecycle Manager 依赖项解析
本指南概述了 OpenShift Container Platform 中 Operator Lifecycle Manager (OLM) 内的依赖项解析和自定义资源定义 (CRD) 升级生命周期。
Operator Lifecycle Manager(OLM)管理运行 Operator 的依赖项解析和升级生命周期。在很多方面,OLM 的问题与其他系统或语言软件包管理器类似,如
yum
和
rpm
。
但其中有一个限制是相似系统一般不存在而 OLM 存在的,那就是:因为 Operator 始终在运行,所以 OLM 会努力确保您所接触的 Operator 组始终相互兼容。
因此,OLM 不得创建以下情况:
安装一组需要无法提供的 API 的 Operator
更新某个 Operator 之时导致依赖该 Operator 的另一 Operator 中断
这可以通过两种类型的数据:
Properties
在依赖项解析器中输入构成了公共接口的 Operator 元数据。示例包括 Operator 提供的 API 的 group/version/kind(GVK),以及 Operator 的语义版本(semver)。
约束或依赖项
应该对可能或还没有在目标集群中安装的其他 Operator 满足 Operator 的要求。它们充当所有可用 Operator 的查询或过滤,并在依赖项解析和安装过程中限制选择。例如,需要特定的 API 在集群中可用,或希望安装带有特定版本的特定 Operator。
OLM 将这些属性和约束转换为布尔值公式系统,并将其传递给 SAT solver,SAT solver 是一个处理布尔值的程序,用于确定应该安装哪些 Operator。
目录中的所有 Operator 均具有以下属性:
-
olm.package
-
包括软件包和 Operator 版本的名称
-
olm.gvk
-
集群服务版本(CSV)中每个提供的 API 的单个属性
Operator 作者也可以在 Operator 捆绑包的
metadata/
目录中包括
properties.yaml
文件来直接声明其他属性。
Operator 作者可在 Operator 捆绑包的
metadata/
目录中的
properties.yaml
文件中声明任意属性。这些属性转换为映射数据结构,该结构用作运行时 Operator Lifecycle Manager(OLM)解析器的输入。
这些属性对解析器不理解属性而不理解这些属性,但可以针对这些属性评估通用限制,以确定约束是否可以满足给定的属性列表。
Operator 的依赖项列在捆绑包的
metadata/
目录中的
dependencies.yaml
文件中。此文件是可选的,目前仅用于指明 Operator-version 依赖项。
依赖项列表中,每个项目包含一个
type
字段,用于指定这一依赖项的类型。支持以下 Operator 依赖项:
-
olm.package
-
这个类型表示特定 Operator 版本的依赖项。依赖项信息必须包含软件包名称以及软件包的版本,格式为 semver。例如,您可以指定具体版本,如
0.5.2
,也可指定一系列版本,如
>0.5.1
。
-
olm.gvk
-
使用这个类型,作者可以使用 group/version/kind(GVK)信息指定依赖项,类似于 CSV 中现有 CRD 和基于 API 的使用量。该路径使 Operator 作者可以合并所有依赖项、API 或显式版本,使它们处于同一位置。
-
olm.constraint
-
这个类型在任意 Operator 属性上声明通用限制。
在以下示例中,为 Prometheus Operator 和 etcd CRD 指定依赖项:
olm.constraint
属性声明特定类型的依赖项约束,区分非约束和约束属性。其
value
字段是一个包含
failureMessage
字段的对象,其中包含约束消息的字符串表。如果约束在运行时不满意,则这一消息被作为信息性提供给用户使用。
以下键表示可用的约束类型:
其值及对其的解释与
olm.gvk
类型相同的类型
package
其值及对其的解释与
olm.package
类型相同的类型
Operator Lifecycle Manager(OLM)解析程序通过任意捆绑包属性和集群信息在运行时评估的通用表达式语言(CEL)表达式
all
,
any
,
not
分别为 Conjunction, disjunction, 和 negation 约束,包括一个或多个 concrete 约束,如
gvk
或一个嵌套的 compound 约束
2.4.4.4.1. 常见表达式语言(CEL)约束
cel
约束类型支持将
通用表达式语言(CEL)
用作表达式语言。
cel
struct 有一个
rule
字段,其中包含在运行时针对 Operator 属性评估的 CEL 表达式字符串,以确定 Operator 是否满足约束。
2.4.4.4.2. Compound 约束 (all, any, not)
复合约束类型按照其逻辑定义进行评估。
以下是两个软件包的 conjunctive 约束(
all
)的示例,以及一个 GVK。这代表,安装捆绑包都必须满足它们:
一个嵌套复合约束(包括最少一个子复合约束以及零个或更多简单约束)会从底向上的顺序被评估,并根据每个前面描述的约束类型的过程进行。
以下是一个 disjunction 的 conjunctions 示例,其中一个、另一个、或两者都能满足约束:
有很多选项同样可以满足 Operator 的依赖性。Operator Lifecycle Manager(OLM)中的依赖项解析器决定哪个选项最适合所请求 Operator 的要求。作为 Operator 作者或用户,了解这些选择非常重要,以便明确依赖项解析。
在 OpenShift Container Platform 集群中,OLM 会读取目录源以了解哪些 Operator 可用于安装。
目录中的 Operator 软件包是用户可在 OpenShift Container Platform 集群中订阅的更新频道集合。可使用频道为次发行版本(
1.2
,
1.3
)或者发行的频率(
stable
,
fast
)提供特定的更新流。
同一软件包中的 Operator 可能会满足依赖项,但可能会在不同的频道。例如,Operator 版本
1.2
可能存在于
stable
和
fast
频道中。
每个软件包都有一个默认频道,该频道总是首选非默认频道。如果默认频道中没有选项可以满足依赖关系,则会在剩余的频道中按频道名称的字母顺序考虑这些选项。
一般情况下,总会有多个选项来满足单一频道中的依赖关系。例如,一个软件包和频道中的 Operator 提供了相同的 API 集。
当用户创建订阅时,它们会指示要从哪个频道接收更新。这会立即把搜索范围限制在那个频道。但是在频道中,可以会有许多 Operator 可以满足依赖项。
在频道中,应该首选考虑使用更新图中位置较高的较新的 Operator。如果某个频道的头满足依赖关系,它将会被首先尝试。
除了软件包依赖关系的限制外,OLM 还添加了其他限制来代表所需用户状态和强制实施解析变量。
一个订阅(Subscription)约束会过滤可满足订阅的 Operator 集合。订阅是对依赖项解析程序用户提供的限制。它们会声明安装一个新的 Operator(如果还没有在集群中安装),或对现有 Operator 进行更新。
在命名空间中,不同的两个 Operator 不能来自于同一软件包。
如果自定义资源定义(CRD)属于单一集群服务版本(CSV),OLM 会立即对其升级。如果某个 CRD 被多个 CSV 拥有,则当该 CRD 满足以下所有向后兼容条件时才会升级:
所有已存在于当前 CRD 中的服务版本都包括在新 CRD 中。
在根据新 CRD 的验证模式(schema)进行验证后,与 CRD 的服务版本关联的所有现有实例或自定义资源均有效。
添加新版 CRD
弃用或删除 CRD 版本
在指定依赖项时应该考虑的最佳实践。
-
依赖于 API 或 Operator 的特定版本范围
-
操作员可以随时添加或删除 API ; 始终针对 Operator 所需的任何 API 指定
olm.gvk
依赖项。例外情况是,指定
olm.package
约束来替代。
-
设置最小版本
-
Kubernetes 文档中与 API 的改变相关的部分描述了 Kubernetes 风格的 Operator 允许进行哪些更改。只要 API 向后兼容,Operator 就允许 Operator 对 API 进行更新,而不需要更改 API 的版本。
对于 Operator 依赖项,这意味着了解依赖的 API 版本可能不足以确保依赖的 Operator 正常工作。
TestOperator v1.0.0 提供
MyObject
资源的 v1alpha1 API 版本。
TestOperator v1.0.1 为
MyObject
添加了一个新的
spec.newfield
字段,但仍是 v1alpha1。
您的 Operator 可能需要将
spec.newfield
写入
MyObject
资源。仅使用
olm.gvk
约束还不足以让 OLM 决定您需要 TestOperator v1.0.1 而不是 TestOperator v1.0.0。
如果事先知道提供 API 的特定 Operator,则指定额外的
olm.package
约束来设置最小值。
-
省略一个最大版本,或允许一个广泛的范围
-
因为 Operator 提供了集群范围的资源,如 API 服务和 CRD,所以如果一个 Operator 为依赖项指定了一个小的窗口,则可能会对依赖项的其他用户的更新产生不必要的约束。
在可能的情况下,尽量不要设置最大版本。或者,设置一个非常宽松的语义范围,以防止与其他 Operator 冲突。例如:
>1.0.0 <2.0.0
。
与传统的软件包管理器不同,Operator 作者显性地对更新通过 OLM 中的频道进行编码。如果现有订阅有可用更新,则假定 Operator 作者表示它可以从上一版本更新。为依赖项设置最大版本会绕过作者的更新流,即不必要的将它截断到特定的上限。
集群管理员无法覆盖 Operator 作者设置的依赖项。
但是,如果已知有需要避免的不兼容问题,就应该设置最大版本。通过使用版本范围语法,可以省略特定的版本,如
> 1.0.0 !1.2.1
。
Kubernetes 文档:
更改 API
当指定依赖项时,需要考虑一些注意事项。
-
没有捆绑包约束(AND)
-
目前还没有方法指定约束间的 AND 关系。换句话说,无法指定一个 Operator,它依赖于另外一个 Operator,它提供一个给定的 API 且版本是
>1.1.0
。
这意味着,在指定依赖项时,如:
dependencies:
- type: olm.package
value:
packageName: etcd
version: ">3.1.0"
- type: olm.gvk
value:
group: etcd.database.coreos.com
kind: EtcdCluster
version: v1beta2
OLM 可以通过两个 Operator 来满足这个要求:一个提供 EtcdCluster,另一个有版本
>3.1.0
。是否发生了这种情况,或者选择某个 Operator 是否满足这两个限制,这取决于是否准备了潜在的选项。依赖项偏好和排序选项被明确定义并可以指定原因,但为了谨慎起见,Operator 应该遵循一种机制或其他机制。
-
跨命名空间兼容性
-
OLM 在命名空间范围内执行依赖项解析。如果更新某个命名空间中的 Operator 会对另一个命名空间中的 Operator 造成问题,则可能会造成更新死锁。
在以下示例中,
provider(供应商)
是指"拥有" CRD 或 API 服务的 Operator。
示例:弃用从属 API
A 和 B 是 API(CRD):
A 的供应商依赖 B。
B 的供应商有一个订阅。
B 更新供应商提供 C,但弃用 B。
B 不再有供应商。
A 不再工作。
这是 OLM 通过升级策略阻止的一个案例。
示例:版本死锁
A 和 B 均为 API:
A 的供应商需要 B。
B 的供应商需要 A。
A 更新的供应商到(提供 A2,需要 B2)并弃用 A。
B 更新的供应商到(提供 B2,需要 A2)并弃用 B。
如果 OLM 试图在更新 A 的同时不更新 B,或更新 B 的同时不更新 A,则无法升级到新版 Operator,即使可找到新的兼容集也无法更新。
这是 OLM 通过升级策略阻止的另一案例。
本指南概述了 OpenShift Container Platform 中 Operator Lifecycle Manager(OLM)的 Operator 组使用情况。
由
OperatorGroup
资源定义的
Operator 组
,为 OLM 安装的 Operator 提供多租户配置。Operator 组选择目标命名空间,在其中为其成员 Operator 生成所需的 RBAC 访问权限。
这一组目标命名空间通过存储在 CSV 的
olm.targetNamespaces
注解中的以逗号分隔的字符串来提供。该注解应用于成员 Operator 的 CSV 实例,并注入它们的部署中。
满足以下任一条件,Operator 即可被视为 Operator 组的
member
:
Operator 的 CSV 与 Operator 组位于同一命名空间中。
Operator CSV 中的安装模式支持 Operator 组的目标命名空间集。
CSV 中的安装模式由
InstallModeType
字段和
Supported
的布尔值字段组成。CSV 的 spec 可以包含一组由四个不同
InstallModeTypes
组成的安装模式:
表 2.4. 安装模式和支持的 Operator 组
InstallModeType
|
描述
|
OwnNamespace
Operator 可以是选择其自有命名空间的 Operator 组的成员。
SingleNamespace
Operator 可以是选择一个命名空间的 Operator 组的成员。
MultiNamespace
Operator 可以是选择多个命名空间的 Operator 组的成员。
AllNamespaces
Operator 可以是选择所有命名空间的 Operator 组的成员(目标命名空间集为空字符串
""
)。
如果 CSV 的 spec 省略
InstallModeType
条目,则该类型将被视为不受支持,除非可通过隐式支持的现有条目推断出支持。
您可以使用
spec.targetNamespaces
参数为 Operator 组显式命名目标命名空间:
apiVersion: operators.coreos.com/v1
kind: OperatorGroup
metadata:
name: my-group
namespace: my-namespace
spec:
targetNamespaces:
- my-namespace
Operator Lifecycle Manager (OLM) 为每个 Operator 组创建以下集群角色:
<operatorgroup_name>-admin
<operatorgroup_name>-edit
<operatorgroup_name>-view
当手动创建 Operator 组时,您必须指定一个没有与现有集群角色或其他 Operator 组冲突的唯一名称。
您还可以使用带有
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.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
参数中会显示所选命名空间的解析集合。全局 OperatorGroup 的
status.namespace
包含空字符串 (
""
),而该字符串会向正在使用的 Operator 发出信号,要求其监视所有命名空间。
2.4.5.4. 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
注解可防止租户之间目标命名空间出现重复。
group/version/kind (GVK)
是 Kubernetes API 的唯一标识符。
olm.providedAPIs
注解中会显示有关 Operator 组提供哪些 GVK 的信息。该注解值为一个字符串,由用逗号分隔的
<kind>.<version>.<group>
组成。其中包括由 Operator 组的所有活跃成员 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
创建 Operator 组时,会生成三个集群角色。每个 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>
Operator Lifecycle Manager (OLM) 为每个 Operator 组创建以下集群角色:
<operatorgroup_name>-admin
<operatorgroup_name>-edit
<operatorgroup_name>-view
当手动创建 Operator 组时,您必须指定一个没有与现有集群角色或其他 Operator 组冲突的唯一名称。
当 CSV 成为 Operator 组的活跃成员时,只要该 CSV 正在使用
AllNamespaces
安装模式来监视所有命名空间,且没有因
InterOperatorGroupOwnerConflict
原因处于故障状态,便会生成以下 RBAC 资源:
来自 CRD 的每个 API 资源的集群角色
来自 API 服务的每个 API 资源的集群角色
其他角色和角色绑定
表 2.5. 来自 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>
上的操作动词:
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>
上的操作动词:
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>
上的操作动词:
聚合标签:
rbac.authorization.k8s.io/aggregate-to-view: true
olm.opgroup.permissions/aggregate-to-view: <operatorgroup_name>
|
表 2.6. 来自 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>
上的操作动词:
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>
上的操作动词:
watch
聚合标签:
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
没有
定义一个包含
*
的目标命名空间,则 Operator 命名空间中的所有角色和角色绑定都使用
olm.owner: <csv_name>
和
olm.owner.namespace: <csv_namespace>
标签复制到目标命名空间中。
OLM 会在 Operator 组的每个目标命名空间中创建 Operator 组的所有活跃成员 CSV 的副本。复制 CSV 的目的在于告诉目标命名空间的用户,特定 Operator 已配置为监视在此创建的资源。
复制的 CSV 会
复制
状态原因,并会更新以匹配其源 CSV 的状态。在集群上创建复制的 CSV 之前,会从这些 CSV 中分离
olm.targetNamespaces
注解。省略目标命名空间选择可避免租户之间存在目标命名空间重复的现象。
当所复制的 CSV 的源 CSV 不存在或其源 CSV 所属的 Operator 组不再指向复制 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
启用 disableCopiedCSVs 字段:
$ cat << EOF | oc apply -f -
apiVersion: operators.coreos.com/v1
kind: OLMConfig
metadata:
name: cluster
spec:
features:
disableCopiedCSVs: true
EOF
如果 Operator 组的
spec.staticProvidedAPIs
字段被设置为
true
,则 Operator 组为
静态
。因此,OLM 不会修改 Operator 组的
olm.providedAPIs
注解,这意味着可以提前设置它。如果一组命名空间没有活跃的成员 CSV 来为资源提供 API,而用户想使用 Operator 组来防止命名空间集中发生资源争用,则这一操作十分有用。
以下是一个 Operator 组示例,它使用
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"
Operator Lifecycle Manager (OLM) 为每个 Operator 组创建以下集群角色:
<operatorgroup_name>-admin
<operatorgroup_name>-edit
<operatorgroup_name>-view
当手动创建 Operator 组时,您必须指定一个没有与现有集群角色或其他 Operator 组冲突的唯一名称。
如果两个 Operator 组的目标命名空间集的交集不是空集,且根据
olm.providedAPIs
注解的定义,所提供的 API 集的交集也不是空集,则称这两个 OperatorGroup 的
提供的 API 有交集
。
一个潜在问题是,提供的 API 有交集的 Operator 组可能在命名空间交集中竞争相同资源。
在检查交集规则时,Operator 组的命名空间始终包含在其所选目标命名空间中。
每次活跃成员 CSV 同步时,OLM 均会查询集群,以获取 CSV 组和其他所有 CSV 组之间提供的 API 交集。然后 OLM 会检查该交集是否为空集:
如果结果为
true
,且 CSV 提供的 API 是 Operator 组提供的 API 的子集:
继续转变。
如果结果为
true
,且 CSV 提供的 API
不是
Operator 组提供的 API 的子集:
如果 Operator 组是静态的:
则清理属于 CSV 的所有部署。
将 CSV 转变为故障状态,状态原因为:
CannotModifyStaticOperatorGroupProvidedAPIs
。
如果 Operator 组
不是
静态的:
将 Operator 组的
olm.providedAPIs
注解替换为其本身与 CSV 提供的 API 的并集。
如果结果为
false
,且 CSV 提供的 API
不是
Operator 组提供的 API 的子集:
则清理属于 CSV 的所有部署。
将 CSV 转变为故障状态,状态原因为:
InterOperatorGroupOwnerConflict
。
如果结果为
false
,且 CSV 提供的 API 是 Operator 组提供的 API 的子集:
如果 Operator 组是静态的:
则清理属于 CSV 的所有部署。
将 CSV 转变为故障状态,状态原因为:
CannotModifyStaticOperatorGroupProvidedAPIs
。
如果 Operator 组
不是
静态的:
将 Operator 组的
olm.providedAPIs
注解替换为其本身与 CSV 提供的 API 的差集。
Operator 组所造成的故障状态不是终端状态。
每次 Operator 组同步时都会执行以下操作:
来自活跃成员 CSV 的提供的 API 集是通过集群计算出来的。注意,复制的 CSV 会被忽略。
将集群集与
olm.providedAPIs
进行比较,如果
olm.providedAPIs
包含任何额外 API,则将删除这些 API。
在所有命名空间中提供相同 API 的所有 CSV 均会重新排序。这样可向交集组中的冲突 CSV 发送通知,表明可能已通过调整大小或删除冲突的 CSV 解决了冲突。
2.4.5.10. 多租户 Operator 管理的限制
OpenShift Container Platform 支持在同一集群中安装不同版本的 Operator。Operator Lifecycle Manager (OLM) 会在不同的命名空间中多次安装 Operator。其中一个限制是 Operator 的 API 版本必须相同。
Operator 是控制平面的扩展,因为它们使用了
CustomResourceDefinition
对象 (CRD),它们是 Kubernetes 中的全局资源。一个 Operator 的不同主版本通常具有不兼容的 CRD。这使得它们不兼容,可以在集群中的不同命名空间中安装。
所有租户或命名空间共享同一集群的 control plane。因此,多租户集群中的租户也共享全局 CRD,这限制同一集群中可以并行使用同一 Operator 实例的不同 Operator 实例。
支持的场景包括:
提供相同 CRD 定义的不同版本的 Operator (如果版本化 CRD,则完全相同的版本)
没有提供 CRD 的不同版本的 Operator,并在 OperatorHub 上的单独捆绑包中提供它们的 CRD
不支持所有其他场景,因为如果不同 Operator 版本中的多个竞争或重叠 CRD 在同一集群中协调,则无法保证集群数据的完整性。
Operator Lifecycle Manager (OLM)→ Multitenancy 和 Operator colocation
多租户集群中的 Operator
允许非集群管理员安装 Operator
2.4.5.11. 对 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 的安装模式被修改来支持目标命名空间选择。
本指南概述了 Operator Lifecycle Manager (OLM) 中的多租户和 Operator 共处。
2.4.6.1. 命名空间中的 Operator 共处
Operator Lifecycle Manager (OLM) 处理在同一命名空间中安装的 OLM 管理的 Operator,这意味着其
Subscription
资源与相关 Operator 位于同一个命名空间中。即使它们实际不相关,OLM 会在更新其中任何一个时考虑其状态,如它们的版本和更新策略。
这个默认行为清单可以通过两种方式:
待处理的更新的
InstallPlan
资源包括同一命名空间中的所有其他 Operator 的
ClusterServiceVersion
(CSV) 资源。
同一命名空间中的所有 Operator 都共享相同的更新策略。例如,如果一个 Operator 设置为手动更新,则所有其他 Operator 更新策略也会设置为 manual。
这些场景可能会导致以下问题:
很难了解有关 Operator 更新安装计划的原因,因为它们中定义了除更新 Operator 以外的更多资源。
在命名空间更新中,无法自动更新一些 Operator,而其他 Operator 也无法手动更新,这对集群管理员来说很常见。
这些问题通常是在使用 OpenShift Container Platform Web 控制台安装 Operator 时,默认行为会将支持
All namespaces
安装模式的 Operator 安装到默认的
openshift-operators
全局命名空间中。
作为集群管理员,您可以使用以下工作流手动绕过此默认行为:
为 Operator 的安装创建一个命名空间。
创建自定义
全局 Operator 组
,这是监视所有命名空间的 Operator 组。通过将此 Operator 组与您刚才创建的命名空间关联,从而使安装命名空间成为全局命名空间,从而使 Operator 在所有命名空间中都可用。
在安装命名空间中安装所需的 Operator。
如果 Operator 具有依赖项,依赖项会在预先创建的命名空间中自动安装。因此,它对依赖项 Operator 有效,使其具有相同的更新策略和共享安装计划。具体步骤,请参阅“在自定义命名空间中安装全局 Operator"。
在自定义命名空间中安装全局 Operator
多租户集群中的 Operator
本指南概述了 Operator Lifecycle Manager(OLM)如何使用 Operator 条件。
作为管理 Operator 生命周期的角色的一部分,Operator Lifecycle Manager(OLM)从定义 Operator 的 Kubernetes 资源状态中推断 Operator 状态。虽然此方法提供了一定程度的保证来确定 Operator 处于给定状态,但在有些情况下,Operator 可能需要直接向 OLM 提供信息,而这些信息不能被推断出来。这些信息可以被 OLM 使用来更好地管理 Operator 的生命周期。
OLM 提供了一个名为
OperatorCondition
的自定义资源定义(CRD),它允许 Operator 与 OLM 相互通信条件信息。当在一个
OperatorCondition
资源的
Spec.Conditions
数组中存在时,则代表存在一组会影响 OLM 管理 Operator 的支持条件。
默认情况下,
OperatorCondition
对象中没有
Spec.Conditions
数组,直到由用户添加或使用自定义 Operator 逻辑的结果为止。
Operator Lifecycle Manager(OLM)支持以下 Operator 条件。
2.4.7.2.1. Upgradeable(可升级)条件
Upgradeable
Operator 条件可防止现有集群服务版本(CSV)被 CSV 的新版本替换。这一条件在以下情况下很有用:
Operator 即将启动关键进程,不应在进程完成前升级。
Operator 正在执行一个自定义资源(CR)迁移,这个迁移必须在 Operator 准备进行升级前完成。
将
Upgradeable
Operator 条件设置为
False
值不会避免 pod 中断。如果需要确保 pod 没有中断,请参阅"使用 pod 中断预算来指定必须在线的 pod 数量,以及 "Additional resources" 部分的 "Graceful termination"。
2.4.8. Operator Lifecycle Manager 指标数据
Operator Lifecycle Manager(OLM)会公开某些 OLM 特定资源,供基于 Prometheus 的 OpenShift Container Platform 集群监控堆栈使用。
表 2.7. OLM 公开的指标
名称
|
描述
|
catalog_source_count
目录源数量。
catalogsource_ready
目录源的状态。值
1
表示目录源处于
READY
状态。
0
表示目录源没有处于
READY
状态。
csv_abnormal
在协调集群服务版本(CSV)时,每当 CSV 版本处于
Succeeded
以外的任何状态时(如没有安装它时)就会存在。包括
name
、
namespace
、
phase
、
reason
和
version
标签。当存在此指标数据时会创建一个 Prometheus 警报。
csv_count
成功注册的 CSV 数量。
csv_succeeded
在协调 CSV 时,代表 CSV 版本处于
Succeeded
状态(值为
1
)或没有处于这个状态(值为
0
)。包含
name
、
namespace
和
version
标签。
csv_upgrade_count
CSV 升级的 Monotonic 计数。
install_plan_count
安装计划的数量。
installplan_warnings_total
由资源生成的警告数量(如已弃用资源)包含在安装计划中。
olm_resolution_duration_seconds
依赖项解析尝试的持续时间。
subscription_count
subscription_sync_total
订阅同步的单调计数。包括
channel
、
installed
CSV 和订阅
name
标签。
|
2.4.9. Operator Lifecycle Manager 中的 Webhook 管理
Webhook 允许 Operator 作者在资源被保存到对象存储并由 Operator 控制器处理之前,拦截、修改、接受或拒绝资源。当 webhook 与 Operator 一同提供时,Operator Lifecycle Manager(OLM)可以管理这些 webhook 的生命周期。
如需有关 Operator 开发人员如何为其 Operator 定义 webhook,以及 OLM 上运行时的注意事项的详细信息,请参阅
定义集群服务版本(CSV)
。
OperatorHub
是集群管理员用来发现和安装 Operator 的 OpenShift Container Platform 中的 Web 控制台界面。只需单击一次,即可从其非集群源拉取 Operator,并将其安装和订阅至集群中,为工程团队使用 Operator Lifecycle Manager (OLM) 在部署环境中自助管理产品做好准备。
集群管理员可从划分为以下类别的目录进行选择:
类别
|
描述
|
红帽 Operator
已由红帽打包并提供的红帽产品。受红帽支持。
经认证的 Operator
来自主要独立软件供应商 (ISV) 的产品。红帽与 ISV 合作打包并提供。受 ISV 支持。
Red Hat Marketplace
可通过
Red Hat Marketplace
购买认证的软件。
社区 Operator
由
redhat-openshift-ecosystem/community-operators-prod/operators
GitHub 存储库中相关代表维护的可选可见软件。无官方支持。
自定义 Operator
您自行添加至集群的 Operator。如果您尚未添加任何自定义 Operator,则您的 OperatorHub 上 Web 控制台中便不会出现
自定义
类别。
OperatorHub 上的操作员被打包在 OLM 上运行。这包括一个称为集群服务版本(CSV)的 YAML 文件,其中包含安装和安全运行 Operator 所需的所有 CRD 、RBAC 规则、Deployment 和容器镜像。它还包含用户可见的信息,如功能描述和支持的 Kubernetes 版本。
Operator SDK 可以用来协助开发人员打包 Operators 以用于 OLM 和 OperatorHub。如果您有一个需要方便客户访问的商业应用程序,请使用红帽合作伙伴连接门户(
connect.redhat.com
)提供的认证工作流来包括这个应用程序。
OperatorHub UI 组件默认由
openshift-marketplace
命名空间中 OpenShift Container Platform 上的 Marketplace Operator 驱动。
2.5.2.1. OperatorHub 自定义资源
Marketplace Operator 管理名为
cluster
的
OperatorHub
自定义资源(CR),用于管理 OperatorHub 提供的默认
CatalogSource
对象。您可以修改此资源以启用或禁用默认目录,这在受限网络环境中配置 OpenShift Container Platform 时非常有用。
红帽提供了一些默认包含在 OpenShift Container Platform 中的 Operator 目录。
从 OpenShift Container Platform 4.11 开始,默认的红帽提供的 Operator 目录以基于文件的目录格式发布。通过以过时的 SQLite 数据库格式发布的 4.10,用于 OpenShift Container Platform 4.6 的默认红帽提供的 Operator 目录。
与 SQLite 数据库格式相关的
opm
子命令、标志和功能已被弃用,并将在以后的版本中删除。功能仍被支持,且必须用于使用已弃用的 SQLite 数据库格式的目录。
许多
opm
子命令和标志都用于 SQLite 数据库格式,如
opm index prune
,它们无法使用基于文件的目录格式。有关使用基于文件的目录的更多信息,请参阅
管理自定义目录
、
Operator Framework 打包格式
,以及
使用 oc-mirror 插件为断开连接的安装 mirror 镜像
。
Operator 目录是 Operator Lifecycle Manager(OLM)可以查询的元数据存储库,以在集群中发现和安装 Operator 及其依赖项。OLM 始终从目录的最新版本安装 Operator。
基于 Operator Bundle Format 的索引镜像是目录的容器化快照。这是一个不可变的工件,包含指向一组 Operator 清单内容的指针数据库。目录可以引用索引镜像来获取集群中 OLM 的内容。
随着目录的更新,Operator 的最新版本会发生变化,旧版本可能会被删除或修改。另外,当 OLM 在受限网络环境中的 OpenShift Container Platform 集群上运行时,它无法直接从互联网访问目录来拉取最新内容。
作为集群管理员,您可以根据红帽提供的目录或从头创建自己的自定义索引镜像,该镜像可用于提供集群中的目录内容。创建和更新您自己的索引镜像提供了一种方法来自定义集群上可用的一组 Operator,同时避免了上面提到的受限网络环境中的问题。
Kubernetes 定期弃用后续版本中删除的某些 API。因此,从使用删除 API 的 Kubernetes 版本的 OpenShift Container Platform 版本开始,Operator 无法使用删除 API 的 API。
如果您的集群使用自定义目录,请参阅
控制 Operator 与 OpenShift Container Platform 版本的兼容性
,以了解更多有关 Operator 作者如何更新其项目的详细信息,以帮助避免工作负载问题并防止不兼容的升级。
OpenShift Container Platform 4.8 及之后的版本中删除了对 Operator 的传统
软件包清单格式
的支持,包括使用传统格式的自定义目录。
在创建自定义目录镜像时,在以前的 OpenShift Container Platform 4 版本中需要使用
oc adm catalog build
命令,这个命令已在多个版本中被弃用,现在已被删除。从 OpenShift Container Platform 4.6 开始,红帽提供的索引镜像可用后,目录构建器必须使用
opm index
命令来管理索引镜像。
管理自定义目录
在受限网络中使用 Operator Lifecycle Manager
2.6.2. 关于红帽提供的 Operator 目录
在
openshift-marketplace
命名空间中默认安装红帽提供的目录源,从而使目录在所有命名空间中都可用。
以下 Operator 目录由红帽发布:
目录
|
索引镜像
|
描述
|
redhat-operators
registry.redhat.io/redhat/redhat-operator-index:v4.13
已由红帽打包并提供的红帽产品。受红帽支持。
certified-operators
registry.redhat.io/redhat/certified-operator-index:v4.13
来自主要独立软件供应商 (ISV) 的产品。红帽与 ISV 合作打包并提供。受 ISV 支持。
redhat-marketplace
registry.redhat.io/redhat/redhat-marketplace-index:v4.13
可通过
Red Hat Marketplace
购买认证的软件。
community-operators
registry.redhat.io/redhat/community-operator-index:v4.13
由
redhat-openshift-ecosystem/community-operators-prod/operators
GitHub 仓库中相关代表维护的软件。无官方支持。
在集群升级过程中,默认红帽提供的目录源的索引镜像标签由 Cluster Version Operator (CVO) 自动更新,以便 Operator Lifecycle Manager (OLM) 拉取目录的更新版本。例如,在从 OpenShift Container Platform 4.8 升级到 4.9 过程中,
redhat-operators
目录的
CatalogSource
对象中的
spec.image
字段被更新:
registry.redhat.io/redhat/redhat-operator-index:v4.8
registry.redhat.io/redhat/redhat-operator-index:v4.9
Operator Lifecycle Manager (OLM) 的默认行为旨在简化 Operator 的安装过程。但是,此行为可能会缺少灵活性,特别是在多租户集群中。为了让 OpenShift Container Platform 集群上的多个租户使用 Operator,OLM 的默认行为要求管理员以
All namespaces
模式安装 Operator,这可能被视为违反最小特权的原则。
请考虑以下场景,以确定哪个 Operator 安装工作流最适合您的环境和要求。
常见术语:多租户(Multitenant)
多租户 Operator 管理的限制
2.7.1. 默认 Operator 安装模式和行为
当以管理员身份使用 Web 控制台安装 Operator 时,通常会根据 Operator 的功能,对安装模式有两个选择:
-
单个命名空间
-
在所选命名空间中安装 Operator,并发出 Operator 请求在该命名空间中提供的所有权限。
-
所有命名空间
-
将 Operator 安装至默认
openshift-operators
命名空间,以便供集群中的所有命名空间监视和使用。进行所有命名空间中 Operator 请求的所有权限。在某些情况下,Operator 作者可以定义元数据,为用户授予该 Operator 建议的命名空间的第二个选项。
此选择还意味着受影响命名空间中的用户可以访问 Operator API,该 API 可以利用他们拥有的自定义资源 (CR),具体取决于命名空间中的角色:
namespace-admin
和
namespace-edit
角色可以对 Operator API 进行读/写,这意味着他们可以使用它们。
namespace-view
角色可以读取该 Operator 的 CR 对象。
对于
Single namespace
模式,因为 Operator 本身安装在所选命名空间中,所以其 pod 和服务帐户也位于那里。对于
All namespaces
模式,Operator 的权限会自动提升到集群角色,这意味着 Operator 在所有命名空间中都有这些权限。
在集群中添加 Operator
安装模式类型
设置建议的命名空间
虽然
Multinamespace
安装模式存在,但只有少数 Operator 支持它。作为标准
All namespaces
和
Single namespace
安装模式之间的中间解决方案,您可以使用以下工作流安装同一 Operator 的多个实例,每个租户一个实例:
为租户 Operator 创建命名空间,与租户的命名空间分开。
为租户 Operator 创建 Operator 组,范围仅限于租户的命名空间。
在租户 Operator 命名空间中安装 Operator。
因此,Operator 驻留在租户 Operator 命名空间中,并监视租户命名空间,但 Operator 的 pod 及其服务帐户都无法被租户可见或可用。
此解决方案以资源使用量成本提供更好的租户分离,以及确保满足约束的额外编配功能。如需详细步骤,请参阅"为多租户集群准备 Operator 的多个实例"。
2.8.1. 使用自定义资源定义来扩展 Kubernetes API
Operator 使用 Kubernetes 扩展机制(自定义资源定义(CRD)),以便使由 Operator 管理的自定义类似于内置的原生 Kubernetes 对象。本指南介绍了集群管理员如何通过创建和管理 CRD 来扩展其 OpenShift Container Platform 集群。
在 Kubernetes API 中,
resource(资源)
是存储某一类 API 对象集的端点。例如,内置
Pod
资源包含一组
Pod
对象。
自定义资源定义
(CRD)对象在集群中定义一个新的、唯一的对象类型,称为
kind
,并允许 Kubernetes API 服务器处理其整个生命周期。
自定义资源
(CR) 对象由集群管理员通过集群中已添加的 CRD 创建,并支持所有集群用户在项目中增加新的资源类型。
当集群管理员增加新 CRD 至集群中时,Kubernetes API 服务器的回应方式是新建一个可由整个集群或单个项目(命名空间)访问的 RESTful 资源路径,并开始服务于指定的 CR。
集群管理员如果要向其他用户授予 CRD 访问权限,可使用集群角色聚合来向用户授予
admin
、
edit
或
view
默认集群角色访问权限。集群角色聚合支持将自定义策略规则插入到这些集群角色中。此行为将新资源整合到集群的 RBAC 策略中,就像内置资源一样。
Operator 会通过将 CRD 与任何所需 RBAC 策略和其他软件特定逻辑打包到一起来利用 CRD。集群管理员也可以手动将 CRD 添加到 Operator 生命周期之外的集群中,供所有用户使用。
虽然只有集群管理员可创建 CRD,但具有 CRD 读写权限的开发人员也可通过现有 CRD 来创建 CR。
要创建自定义资源 (CR) 对象,集群管理员首先必须创建一个自定义资源定义 (CRD)。
以
cluster-admin
用户身份访问 OpenShift Container Platform 集群。
要创建 CRD:
先创建一个包含以下字段类型的 YAML 文件:
集群管理员可向现有集群范围的自定义资源定义 (CRD) 授予权限。如果使用
admin
、
edit
和
view
默认集群角色,请利用集群角色聚合来制定规则。
您必须为每个角色明确分配权限。权限更多的角色不会继承权限较少角色的规则。如果要为某个角色分配规则,还必须将该操作动词分配给具有更多权限的角色。例如,如果要向 view 角色授予
get crontabs
的权限,也必须向
edit
和
admin
角色授予该权限。
admin
或
edit
角色通常会分配给通过项目模板创建项目的用户。
创建 CRD。
为 CRD 创建集群角色定义文件。集群角色定义是一个 YAML 文件,其中包含适用于各个集群角色的规则。OpenShift Container Platform 控制器会将您指定的规则添加到默认集群角色中。
5
11
指定 CRD 的组名。
6
12
指定适用于这些规则的 CRD 的复数名称。
7
13
指定代表角色所获得的权限的操作动词。例如,对
admin
和
edit
角色应用读写权限,对
view
角色应用只读权限。
指定该标签向
view
默认角色授予权限。
指定该标签向
cluster-reader
默认角色授予权限。
创建集群角色:
$ oc create -f <file_name>.yaml
将自定义资源定义 (CRD) 添加至集群后,可使用 CLI 按照自定义资源 (CR) 规范通过文件创建 CR。
集群管理员已将 CRD 添加至集群中。
为 CR 创建 YAML 文件。在下面的定义示例中,
cronSpec
和
image
自定义字段在
Kind: CronTab
的 CR 中设定。
Kind
来自 CRD 对象的
spec.kind
字段:
您可使用 CLI 检查集群中存在的自定义资源 (CR) 对象。
您有权访问的命名空间中已存在 CR 对象。
要获取特定类型的 CR 的信息,请运行:
$ oc get <kind>
$ oc get crontab
本指南向开发人员介绍了如何管理来自自定义资源定义 (CRD) 的自定义资源 (CR)。
在 Kubernetes API 中,
resource(资源)
是存储某一类 API 对象集的端点。例如,内置
Pod
资源包含一组
Pod
对象。
自定义资源定义
(CRD)对象在集群中定义一个新的、唯一的对象类型,称为
kind
,并允许 Kubernetes API 服务器处理其整个生命周期。
自定义资源
(CR) 对象由集群管理员通过集群中已添加的 CRD 创建,并支持所有集群用户在项目中增加新的资源类型。
Operator 会通过将 CRD 与任何所需 RBAC 策略和其他软件特定逻辑打包到一起来利用 CRD。集群管理员也可以手动将 CRD 添加到 Operator 生命周期之外的集群中,供所有用户使用。
虽然只有集群管理员可创建 CRD,但具有 CRD 读写权限的开发人员也可通过现有 CRD 来创建 CR。
将自定义资源定义 (CRD) 添加至集群后,可使用 CLI 按照自定义资源 (CR) 规范通过文件创建 CR。
集群管理员已将 CRD 添加至集群中。
为 CR 创建 YAML 文件。在下面的定义示例中,
cronSpec
和
image
自定义字段在
Kind: CronTab
的 CR 中设定。
Kind
来自 CRD 对象的
spec.kind
字段:
您可使用 CLI 检查集群中存在的自定义资源 (CR) 对象。
您有权访问的命名空间中已存在 CR 对象。
要获取特定类型的 CR 的信息,请运行:
$ oc get <kind>
$ oc get crontab
3.1. 从已安装的 Operator 创建应用程序
本指南向开发人员介绍了如何使用 OpenShift Container Platform Web 控制台从已安装的 Operator 创建应用程序。
3.1.1. 使用 Operator 创建 etcd 集群
本流程介绍了如何通过由 Operator Lifecycle Manager (OLM) 管理的 etcd Operator 来新建一个 etcd 集群。
访问 OpenShift Container Platform 4.13 集群
管理员已在集群范围内安装了 etcd Operator。
针对此流程在 OpenShift Container Platform Web 控制台中新建一个项目。这个示例使用名为
my-etcd
的项目。
导航至
Operators → Installed Operators
页面。由集群管理员安装到集群且可供使用的 Operator 将以集群服务版本(CSV)列表形式显示在此处。CSV 用于启动和管理由 Operator 提供的软件。
使用以下命令从 CLI 获得该列表:
$ oc get csv
在
Installed Operators
页面中,点 etcd Operator 查看更多详情和可用操作。
正如
Provided API
下所示,该 Operator 提供了三类新资源,包括一种用于
etcd Cluster
的资源(
EtcdCluster
资源)。这些对象的工作方式与内置的原生 Kubernetes 对象(如
Deployment
或
ReplicaSet
)相似,但包含特定于管理 etcd 的逻辑。
新建 etcd 集群:
在
etcd Cluster
API 框中,点
Create instance
。
在下一页中,您可对
EtcdCluster
对象的最小起始模板进行任何修改,比如集群大小。现在,点击
Create
即可完成。点击后即可触发 Operator 启动 pod、服务和新 etcd 集群的其他组件。
点
example
etcd 集群,然后点
Resources
选项卡,您可以看到项目现在包含很多由 Operator 自动创建和配置的资源。
验证已创建了支持您从项目中的其他 pod 访问数据库的 Kubernetes 服务。
给定项目中具有
edit
角色的所有用户均可创建、管理和删除应用程序实例(本例中为 etcd 集群),这些实例由已在项目中创建的 Operator 以自助方式管理,就像云服务一样。如果要赋予其他用户这一权利,项目管理员可使用以下命令添加角色:
$ oc policy add-role-to-user edit <user> -n <target_project>
现在您有了一个 etcd 集群,当 pod 运行不畅,或在集群中的节点之间迁移时,该集群将对故障做出反应并重新平衡数据。最重要的是,具有适当访问权限的集群管理员或开发人员现在可轻松将该数据库用于其应用程序。
如果集群管理员将 Operator 安装权限委托给您的帐户,您可以以自助服务的方式将 Operator 安装并订阅到命名空间中。
-
集群管理员必须在 OpenShift Container Platform 用户帐户中添加某些权限,以便允许将自助服务 Operator 安装到命名空间。详情请参阅
允许非集群管理员安装 Operator
。
3.2.2. 关于使用 OperatorHub 安装 Operator
OperatorHub 是一个发现 Operator 的用户界面,它与 Operator Lifecycle Manager(OLM)一起工作,后者在集群中安装和管理 Operator。
作为具有适当权限的用户,您可以使用 OpenShift Container Platform Web 控制台或 CLI 安装来自 OperatorHub 的 Operator。
安装过程中,您必须为 Operator 确定以下初始设置:
选择要在其中安装 Operator 的特定命名空间。
如果某个 Operator 可通过多个频道获得,则可任选您想要订阅的频道。例如,要通过
stable
频道部署(如果可用),则从列表中选择这个选项。
您可以选择自动或者手动更新。
如果选择自动更新某个已安装的 Operator,则当所选频道中有该 Operator 的新版本时,Operator Lifecycle Manager(OLM)将自动升级 Operator 的运行实例,而无需人为干预。
如果选择手动更新,则当有新版 Operator 可用时,OLM 会创建更新请求。作为集群管理员,您必须手动批准该更新请求,才可将 Operator 更新至新版本。
了解 OperatorHub
3.2.3. 使用 Web 控制台从 OperatorHub 安装
您可以使用 OpenShift Container Platform Web 控制台从 OperatorHub 安装并订阅 Operator。
使用具有 Operator 安装权限的账户访问 OpenShift Container Platform 集群。
在 Web 控制台中导航至
Operators → OperatorHub
页面。
找到您需要的 Operator(滚动页面会在
Filter by keyword
框中输入查找关键字)。例如,输入
advanced
来查找 Advanced Cluster Management for Kubernetes Operator。
您还可以根据
基础架构功能
过滤选项。例如,如果您希望 Operator 在断开连接的环境中工作,请选择
Disconnected
。
选择要显示更多信息的 Operator。
选择 Community Operator 会警告红帽没有认证社区 Operator ; 您必须确认该警告方可继续。
阅读 Operator 信息并单击
Install
。
在
Install Operator
页面中:
选择要在其中安装 Operator 的特定单一命名空间。该 Operator 仅限在该单一命名空间中监视和使用。
选择一个
更新频道
(如有多个可用)。
如前面所述,选择
自动
或
手动
批准策略。
点击
Install
使 Operator 可供 OpenShift Container Platform 集群上的所选命名空间使用。
如果选择了
手动
批准策略,订阅的升级状态将保持在
Upgrading
状态,直至您审核并批准安装计划。
在
Install Plan
页面批准后,订阅的升级状态将变为
Up to date
。
如果选择了
Automatic
批准策略,升级状态会在不用人工参与的情况下变为
Up to date
。
在订阅的升级状态成为
Up to date
后,选择
Operators → Installed Operators
来验证已安装 Operator 的 ClusterServiceVersion(CSV)是否最终出现了。
状态
最终会在相关命名空间中变为
InstallSucceeded
。
对于
All namespaces…
安装模式,状态在
openshift-operators
命名空间中解析为
InstallSucceeded
,但如果检查其他命名空间,则状态为
Copied
。
如果没有:
检查
openshift-operators
项目(如果选择了
A specific namespace…
安装模式)中的 openshift-operators 项目中的 pod 的日志,这会在
Workloads → Pods
页面中报告问题以便进一步排除故障。
3.2.4. 使用 CLI 从 OperatorHub 安装
您可以使用 CLI 从 OperatorHub 安装 Operator,而不必使用 OpenShift Container Platform Web 控制台。使用
oc
命令来创建或更新一个
订阅
对象。
使用具有 Operator 安装权限的账户访问 OpenShift Container Platform 集群。
已安装 OpenShift CLI(
oc
)。
查看 OperatorHub 中集群可用的 Operator 列表:
$ oc get packagemanifests -n openshift-marketplace
创建一个
Subscription
对象 YAML 文件,以便为 Operator 订阅一个命名空间,如
sub.yaml
:
您可以通过在
Subscription
对象中设置集群服务版本(CSV)来安装 Operator 的特定版本。
使用具有 Operator 安装权限的账户访问 OpenShift Container Platform 集群。
已安装 OpenShift CLI(
oc
)。
运行以下命令,查找您要安装的 Operator 的可用版本和频道:
$ oc describe packagemanifests <operator_name> -n <catalog_namespace>
例如,以下命令从 OperatorHub 打印 Red Hat Quay Operator 可用频道和版本:
$ oc describe packagemanifests quay-operator -n openshift-marketplace
例 3.1. 输出示例
Name: quay-operator
Namespace: operator-marketplace
Labels: catalog=redhat-operators
catalog-namespace=openshift-marketplace
hypershift.openshift.io/managed=true
operatorframework.io/arch.amd64=supported
operatorframework.io/os.linux=supported
provider=Red Hat
provider-url=
Annotations: <none>
API Version: packages.operators.coreos.com/v1
Kind: PackageManifest
Current CSV: quay-operator.v3.7.11
Entries:
Name: quay-operator.v3.7.11
Version: 3.7.11
Name: quay-operator.v3.7.10
Version: 3.7.10
Name: quay-operator.v3.7.9
Version: 3.7.9
Name: quay-operator.v3.7.8
Version: 3.7.8
Name: quay-operator.v3.7.7
Version: 3.7.7
Name: quay-operator.v3.7.6
Version: 3.7.6
Name: quay-operator.v3.7.5
Version: 3.7.5
Name: quay-operator.v3.7.4
Version: 3.7.4
Name: quay-operator.v3.7.3
Version: 3.7.3
Name: quay-operator.v3.7.2
Version: 3.7.2
Name: quay-operator.v3.7.1
Version: 3.7.1
Name: quay-operator.v3.7.0
Version: 3.7.0
Name: stable-3.7
Current CSV: quay-operator.v3.8.5
Entries:
Name: quay-operator.v3.8.5
Version: 3.8.5
Name: quay-operator.v3.8.4
Version: 3.8.4
Name: quay-operator.v3.8.3
Version: 3.8.3
Name: quay-operator.v3.8.2
Version: 3.8.2
Name: quay-operator.v3.8.1
Version: 3.8.1
Name: quay-operator.v3.8.0
Version: 3.8.0
Name: stable-3.8
Default Channel: stable-3.8
Package Name: quay-operator
您可以运行以下命令来以 YAML 格式输出 Operator 的版本和频道信息:
$ oc get packagemanifests <operator_name> -n <catalog_namespace> -o yaml
通过设置
startingCSV
字段,创建一个
Subscription
对象 YAML 文件,向带有特定版本的 Operator 订阅一个命名空间。将
installPlanApproval
字段设置为
Manual
,以便在目录中存在更新的版本时防止 Operator 自动升级。
例如,可以使用以下
sub.yaml
文件安装 Red Hat Quay Operator,专门用于版本 3.7.10:
手动批准待处理的安装计划以完成 Operator 安装。
手动批准待处理的 Operator 更新
通过使用 Operator Lifecycle Manager (OLM),集群管理员可将基于 OLM 的 Operator 安装到 OpenShift Container Platform 集群。
如需有关 OLM 如何处理在同一命名空间中并置安装的 Operator 的更新,以及使用自定义全局 Operator 组安装 Operator 的替代方法,请参阅
多租户和 Operator 共处
。
4.1.1. 关于使用 OperatorHub 安装 Operator
OperatorHub 是一个发现 Operator 的用户界面,它与 Operator Lifecycle Manager(OLM)一起工作,后者在集群中安装和管理 Operator。
作为具有适当权限的用户,您可以使用 OpenShift Container Platform Web 控制台或 CLI 安装来自 OperatorHub 的 Operator。
安装过程中,您必须为 Operator 确定以下初始设置:
选择要在其中安装 Operator 的特定命名空间。
如果某个 Operator 可通过多个频道获得,则可任选您想要订阅的频道。例如,要通过
stable
频道部署(如果可用),则从列表中选择这个选项。
您可以选择自动或者手动更新。
如果选择自动更新某个已安装的 Operator,则当所选频道中有该 Operator 的新版本时,Operator Lifecycle Manager(OLM)将自动升级 Operator 的运行实例,而无需人为干预。
如果选择手动更新,则当有新版 Operator 可用时,OLM 会创建更新请求。作为集群管理员,您必须手动批准该更新请求,才可将 Operator 更新至新版本。
了解 OperatorHub
4.1.2. 使用 Web 控制台从 OperatorHub 安装
您可以使用 OpenShift Container Platform Web 控制台从 OperatorHub 安装并订阅 Operator。
使用具有
cluster-admin
权限的账户访问 OpenShift Container Platform 集群。
使用具有 Operator 安装权限的账户访问 OpenShift Container Platform 集群。
在 Web 控制台中导航至
Operators → OperatorHub
页面。
找到您需要的 Operator(滚动页面会在
Filter by keyword
框中输入查找关键字)。例如,输入
advanced
来查找 Advanced Cluster Management for Kubernetes Operator。
您还可以根据
基础架构功能
过滤选项。例如,如果您希望 Operator 在断开连接的环境中工作,请选择
Disconnected
。
选择要显示更多信息的 Operator。
选择 Community Operator 会警告红帽没有认证社区 Operator ; 您必须确认该警告方可继续。
阅读 Operator 信息并单击
Install
。
在
Install Operator
页面中:
任选以下一项:
All namespaces on the cluster (default)
,选择该项会将 Operator 安装至默认
openshift-operators
命名空间,以便供集群中的所有命名空间监视和使用。该选项并非始终可用。
A specific namespace on the cluster
,该项支持您选择单一特定命名空间来安装 Operator。该 Operator 仅限在该单一命名空间中监视和使用。
选择要在其中安装 Operator 的特定单一命名空间。该 Operator 仅限在该单一命名空间中监视和使用。
选择一个
更新频道
(如有多个可用)。
如前面所述,选择
自动
或
手动
批准策略。
点击
Install
使 Operator 可供 OpenShift Container Platform 集群上的所选命名空间使用。
如果选择了
手动
批准策略,订阅的升级状态将保持在
Upgrading
状态,直至您审核并批准安装计划。
在
Install Plan
页面批准后,订阅的升级状态将变为
Up to date
。
如果选择了
Automatic
批准策略,升级状态会在不用人工参与的情况下变为
Up to date
。
在订阅的升级状态成为
Up to date
后,选择
Operators → Installed Operators
来验证已安装 Operator 的 ClusterServiceVersion(CSV)是否最终出现了。
状态
最终会在相关命名空间中变为
InstallSucceeded
。
对于
All namespaces…
安装模式,状态在
openshift-operators
命名空间中解析为
InstallSucceeded
,但如果检查其他命名空间,则状态为
Copied
。
如果没有:
检查
openshift-operators
项目(如果选择了
A specific namespace…
安装模式)中的 openshift-operators 项目中的 pod 的日志,这会在
Workloads → Pods
页面中报告问题以便进一步排除故障。
4.1.3. 使用 CLI 从 OperatorHub 安装
您可以使用 CLI 从 OperatorHub 安装 Operator,而不必使用 OpenShift Container Platform Web 控制台。使用
oc
命令来创建或更新一个
订阅
对象。
使用具有 Operator 安装权限的账户访问 OpenShift Container Platform 集群。
已安装 OpenShift CLI(
oc
)。
查看 OperatorHub 中集群可用的 Operator 列表:
$ oc get packagemanifests -n openshift-marketplace
创建一个
Subscription
对象 YAML 文件,以便为 Operator 订阅一个命名空间,如
sub.yaml
:
您可以通过在
Subscription
对象中设置集群服务版本(CSV)来安装 Operator 的特定版本。
使用具有 Operator 安装权限的账户访问 OpenShift Container Platform 集群。
已安装 OpenShift CLI(
oc
)。
运行以下命令,查找您要安装的 Operator 的可用版本和频道:
$ oc describe packagemanifests <operator_name> -n <catalog_namespace>
例如,以下命令从 OperatorHub 打印 Red Hat Quay Operator 可用频道和版本:
$ oc describe packagemanifests quay-operator -n openshift-marketplace
例 4.1. 输出示例
Name: quay-operator
Namespace: operator-marketplace
Labels: catalog=redhat-operators
catalog-namespace=openshift-marketplace
hypershift.openshift.io/managed=true
operatorframework.io/arch.amd64=supported
operatorframework.io/os.linux=supported
provider=Red Hat
provider-url=
Annotations: <none>
API Version: packages.operators.coreos.com/v1
Kind: PackageManifest
Current CSV: quay-operator.v3.7.11
Entries:
Name: quay-operator.v3.7.11
Version: 3.7.11
Name: quay-operator.v3.7.10
Version: 3.7.10
Name: quay-operator.v3.7.9
Version: 3.7.9
Name: quay-operator.v3.7.8
Version: 3.7.8
Name: quay-operator.v3.7.7
Version: 3.7.7
Name: quay-operator.v3.7.6
Version: 3.7.6
Name: quay-operator.v3.7.5
Version: 3.7.5
Name: quay-operator.v3.7.4
Version: 3.7.4
Name: quay-operator.v3.7.3
Version: 3.7.3
Name: quay-operator.v3.7.2
Version: 3.7.2
Name: quay-operator.v3.7.1
Version: 3.7.1
Name: quay-operator.v3.7.0
Version: 3.7.0
Name: stable-3.7
Current CSV: quay-operator.v3.8.5
Entries:
Name: quay-operator.v3.8.5
Version: 3.8.5
Name: quay-operator.v3.8.4
Version: 3.8.4
Name: quay-operator.v3.8.3
Version: 3.8.3
Name: quay-operator.v3.8.2
Version: 3.8.2
Name: quay-operator.v3.8.1
Version: 3.8.1
Name: quay-operator.v3.8.0
Version: 3.8.0
Name: stable-3.8
Default Channel: stable-3.8
Package Name: quay-operator
您可以运行以下命令来以 YAML 格式输出 Operator 的版本和频道信息:
$ oc get packagemanifests <operator_name> -n <catalog_namespace> -o yaml
通过设置
startingCSV
字段,创建一个
Subscription
对象 YAML 文件,向带有特定版本的 Operator 订阅一个命名空间。将
installPlanApproval
字段设置为
Manual
,以便在目录中存在更新的版本时防止 Operator 自动升级。
例如,可以使用以下
sub.yaml
文件安装 Red Hat Quay Operator,专门用于版本 3.7.10:
手动批准待处理的安装计划以完成 Operator 安装。
手动批准待处理的 Operator 更新
在自定义命名空间中安装全局 Operator
4.1.5. 为多租户集群准备多个 Operator 实例
作为集群管理员,您可以添加多个 Operator 实例以用于多租户集群。这是使用标准
All namespaces
安装模式的替代解决方案,可被视为违反最小特权的原则,或
Multinamespace
模式(没有被广泛采用)。如需更多信息,请参阅"多租户集群中的Operator"。
在以下步骤中,
租户
是为一组部署的工作负载共享通用访问和特权的用户或组。
租户 Operator
是 Operator 实例,仅用于由该租户使用。
您要安装的 Operator 的所有实例都必须在给定集群中相同。
有关这个限制和其他限制的更多信息,请参阅"多租户集群中的Operator"。
在安装 Operator 前,为租户 Operator 创建一个命名空间,该 Operator 与租户的命名空间分开。例如,如果租户的命名空间是
team1
,您可以创建一个
team1-operator
命名空间:
定义
Namespace
资源并保存 YAML 文件,如
team1-operator.yaml
:
apiVersion: v1
kind: Namespace
metadata:
name: team1-operator
运行以下命令创建命名空间:
$ oc create -f team1-operator.yaml
为租户 Operator 创建 Operator 组,范围到租户的命名空间,只有
spec.targetNamespaces
列表中有一个命名空间条目:
定义
OperatorGroup
资源并保存 YAML 文件,如
team1-operatorgroup.yaml
:
apiVersion: operators.coreos.com/v1
kind: OperatorGroup
metadata:
name: team1-operatorgroup
namespace: team1-operator
spec:
targetNamespaces:
- team1 1
-
1
-
仅在
spec.targetNamespaces
列表中定义租户的命名空间。
运行以下命令来创建 Operator 组:
$ oc create -f team1-operatorgroup.yaml
4.1.6. 在自定义命名空间中安装全局 Operator
在使用 OpenShift Container Platform Web 控制台安装 Operator 时,默认行为会将支持
All namespaces
安装模式的 Operator 安装到默认的
openshift-operators
全局命名空间中。这可能导致与命名空间中所有 Operator 共享安装计划和更新策略相关的问题。有关这些限制的详情,请参阅 "Multitenancy 和 Operator colocation"。
作为集群管理员,您可以通过创建自定义全局命名空间并使用该命名空间安装单个或范围 Operator 及其依赖项来手动绕过此默认行为。
您可以使用具有
cluster-admin
角色的用户访问集群。
在安装 Operator 前,为所需 Operator 安装创建一个命名空间。此安装命名空间将成为自定义全局命名空间:
定义
Namespace
资源并保存 YAML 文件,如
global-operators.yaml
:
apiVersion: v1
kind: Namespace
metadata:
name: global-operators
运行以下命令创建命名空间:
$ oc create -f global-operators.yaml
创建自定义
全局 Operator 组
,这是监视所有命名空间的 Operator 组:
定义
OperatorGroup
资源并保存 YAML 文件,如
global-operatorgroup.yaml
。省略
spec.selector
和
spec.targetNamespaces
字段,使其成为一个
全局 Operator 组
,该组选择所有命名空间:
apiVersion: operators.coreos.com/v1
kind: OperatorGroup
metadata:
name: global-operatorgroup
namespace: global-operators
创建的全局 OperatorGroup 的
status.namespace
包含空字符串 (
""
),而该字符串会向正在使用的 Operator 发出信号,要求其监视所有命名空间。
运行以下命令来创建 Operator 组:
$ oc create -f global-operatorgroup.yaml
4.1.7. Operator 工作负载的 Pod 放置
默认情况下,Operator Lifecycle Manager(OLM)在安装 Operator 或部署 Operand 工作负载时,会将 pod 放置到任意 worker 节点上。作为管理员,您可以使用节点选择器、污点和容限组合使用项目来控制将 Operator 和 Operands 放置到特定节点。
控制 Operator 和 Operand 工作负载的 pod 放置有以下先决条件:
根据您的要求,确定 pod 的目标节点或一组节点。如果可用,请注意现有标签,如
node-role.kubernetes.io/app
,用于标识节点。否则,使用计算机器集或直接编辑节点来添加标签,如
myoperator
。您将在以后的步骤中使用此标签作为项目上的节点选择器。
如果要确保只有具有特定标签的 pod 才能在节点上运行,同时将不相关的工作负载加载到其他节点,通过使用一个计算机器集或直接编辑节点为节点添加污点。使用一个效果来确保与污点不匹配的新 pod 不能调度到节点上。例如,
myoperator:NoSchedule
污点确保与污点不匹配的新 pod 不能调度到该节点上,但节点上现有的 pod 可以保留。
创建使用默认节点选择器配置的项目,如果您添加了污点,则创建一个匹配的容限。
此时,您创建的项目可在以下情况下用于将 pod 定向到指定节点:
-
对于 Operator pod
-
管理员可以在项目中创建
Subscription
对象,如以下部分所述。因此,Operator pod 放置在指定的节点上。
-
对于 Operand pod
-
通过使用已安装的 Operator,用户可以在项目中创建一个应用程序,这样可将 Operator 拥有的自定义资源(CR)放置到项目中。因此,Operand pod 放置到指定节点上,除非 Operator 在其他命名空间中部署集群范围对象或资源,在这种情况下,不会应用这个自定义的 pod 放置。
手动向节点
或
计算机器集
添加污点和容限
创建项目范围节点选择器
使用节点选择器和容限创建项目
默认情况下,当安装 Operator 时,OpenShift Container Platform 会随机将 Operator pod 安装到其中一个 worker 节点。然而,在某些情况下,您可能希望该 pod 调度到特定节点或一组节点上。
以下示例描述了您可能希望将 Operator pod 调度到特定节点或一组节点的情况:
如果 Operator 需要特定的平台,如
amd64
或
arm64
如果 Operator 需要特定的操作系统,如 Linux 或 Windows
如果您希望 Operator 在同一个主机上或位于同一机架的主机上工作
如果您希望 Operator 在整个基础架构中分散,以避免因为网络或硬件问题而停机
您可以通过在 Operator 的
Subscription
对象中添加节点关联性、pod 关联性或 pod 反关联性限制来控制 Operator pod 的安装位置。节点关联性是由调度程序用来确定 pod 的可放置位置的一组规则。pod 关联性允许您确保将相关的 pod 调度到同一节点。通过 Pod 反关联性,您可以防止 pod 调度到节点上。
以下示例演示了如何使用节点关联性或 pod 反关联性将自定义 Metrics Autoscaler Operator 实例安装到集群中的特定节点:
作为集群管理员,您可以升级以前使用 OpenShift Container Platform 集群上的 Operator Lifecycle Manager(OLM)安装的 Operator。
如需有关 OLM 如何处理在同一命名空间中并置安装的 Operator 的更新,以及使用自定义全局 Operator 组安装 Operator 的替代方法,请参阅
多租户和 Operator 共处
。
已安装的 Operator 的订阅指定一个更新频道,用于跟踪和接收 Operator 的更新。您可以更改更新频道,以开始跟踪并从更新频道接收更新。
订阅中更新频道的名称可能会因 Operator 而异,但应遵守给定 Operator 中的常规约定。例如,频道名称可能会遵循 Operator 提供的应用程序的次发行版本更新流(
1.2
、
1.3
)或发行的频率(
stable
、
fast
)。
您不能将已安装的 Operator 更改为比当前频道旧的频道。
红帽客户门户网站 Labs 包括以下应用程序,可帮助管理员准备更新其 Operator:
Red Hat OpenShift Container Platform Operator Update Information Checker
您可以使用应用程序搜索基于 Operator Lifecycle Manager 的 Operator,并在不同版本的 OpenShift Container Platform 中验证每个更新频道的可用 Operator 版本。不包含基于 Cluster Version Operator 的 Operator。
您可以使用 OpenShift Container Platform Web 控制台更改 Operator 的更新频道。
如果订阅中的批准策略被设置为
Automatic
,则更新过程会在所选频道中提供新的 Operator 版本时立即启动。如果批准策略设为
Manual
,则必须手动批准待处理的更新。
之前使用 Operator Lifecycle Manager(OLM)安装的 Operator。
在 web 控制台的
Administrator
视角中,导航到
Operators → Installed Operators
。
点击您要更改更新频道的 Operator 名称。
点
Subscription
标签页。
点
Update channel
下的更新频道名称。
点要更改的更新频道,然后点
Save
。
对于带有
自动批准策略
的订阅,更新会自动开始。返回到
Operators → Installed Operators
页面,以监控更新的进度。完成后,状态会变为
Succeeded
和
Up to date
。
对于采用
手动
批准策略的订阅,您可以从
Subscription
选项卡中手动批准更新。
4.2.3. 手动批准待处理的 Operator 更新
如果已安装的 Operator 的订阅被设置为
Manual
,则当其当前更新频道中发布新更新时,在开始安装前必须手动批准更新。
之前使用 Operator Lifecycle Manager(OLM)安装的 Operator。
在 OpenShift Container Platform Web 控制台的
Administrator
视角中,进入
Operators → Installed Operators
。
处于待定更新的 Operator 会显示
Upgrade available
状态。点您要更新的 Operator 的名称。
点
Subscription
标签页。任何需要批准的更新都会在
Upgrade status
旁边显示。例如:它可能会显示
1 requires approval
。
点
1 requires approval
,然后点
Preview Install Plan
。
检查列出可用于更新的资源。在满意后,点
Approve
。
返回到
Operators → Installed Operators
页面,以监控更新的进度。完成后,状态会变为
Succeeded
和
Up to date
。
下面介绍如何删除或卸载以前使用 OpenShift Container Platform 集群上的 Operator Lifecycle Manager(OLM)安装的 Operator。
在尝试重新安装同一 Operator 前,您必须已成功并完全卸载了 Operator。没有正确地完全卸载 Operator 可能会留下一些资源,如项目或命名空间,处于"Terminating"状态,并导致尝试重新安装 Operator 时观察到 "error resolving resource" 消息。如需更多信息,请参阅
卸载失败后重新安装 Operator
。
4.3.1. 使用 Web 控制台从集群中删除 Operator
集群管理员可以使用 Web 控制台从所选命名空间中删除已安装的 Operator。
您可以使用具有
cluster-admin
权限的账户访问 OpenShift Container Platform 集群 Web 控制台。
进入到
Operators
→
Installed Operators
页面。
在
Filter by name
字段中滚动或输入关键字以查找您要删除的 Operator。然后点它。
在
Operator Details
页面右侧,从
Actions
列表中选择
Uninstall Operator
。
此时会显示
Uninstall Operator?
对话框。
选择
Uninstall
来删除 Operator、Operator 部署和 pod。按照此操作,Operator 将停止运行,不再接收更新。
此操作不会删除 Operator 管理的资源,包括自定义资源定义 (CRD) 和自定义资源 (CR) 。Web 控制台和继续运行的集群资源启用的仪表板和导航项可能需要手动清理。要在卸载 Operator 后删除这些,您可能需要手动删除 Operator CRD。
4.3.2. 使用 CLI 从集群中删除 Operator
集群管理员可以使用 CLI 从所选命名空间中删除已安装的 Operator。
可以使用具有
cluster-admin
权限的账户访问 OpenShift Container Platform 集群。
OpenShift CLI (
oc
)安装在您的工作站上。
确保在
currentCSV
字段中标识了订阅 Operator 的最新版本(如
serverless-operator
)。
$ oc get subscription.operators.coreos.com serverless-operator -n openshift-serverless -o yaml | grep currentCSV
在 Operator Lifecycle Manager(OLM)中,如果您订阅的是引用网络中无法访问的镜像的 Operator,您可以在
openshift-marketplace
命名空间中找到带有以下错误的作业:
ImagePullBackOff for
Back-off pulling image "example.com/openshift4/ose-elasticsearch-operator-bundle@sha256:6d2587129c846ec28d384540322b40b05833e7e00b25cca584e004af9a1d292e"
rpc error: code = Unknown desc = error pinging docker registry example.com: Get "https://example.com/v2/": dial tcp: lookup example.com on 10.0.0.1:53: no such host
因此,订阅会处于这个失败状态,Operator 无法安装或升级。
您可以通过删除订阅、集群服务版本(CSV)及其他相关对象来刷新失败的订阅。重新创建订阅后,OLM 会重新安装 Operator 的正确版本。
您有一个失败的订阅,无法拉取不能访问的捆绑包镜像。
已确认可以访问正确的捆绑包镜像。
从安装 Operator 的命名空间中获取
Subscription
和
ClusterServiceVersion
对象的名称:
$ oc get sub,csv -n <namespace>
4.4. 配置 Operator Lifecycle Manager 功能
Operator Lifecycle Manager(OLM)控制器由名为
cluster
的
OLMConfig
自定义资源(CR)进行配置。集群管理员可以修改此资源以启用或禁用某些功能。
本文档概述了由
OLMConfig
资源配置的 OLM 当前支持的功能。
当 Operator Lifecycle Manager (OLM) 安装 Operator 时,默认情况下会在 Operator 配置为监视的每个命名空间中创建其集群服务版本 (CSV) 的简化副本。这些 CSV 称为
复制的 CSV
,并告知用户控制器在给定命名空间中主动协调资源事件。
当 Operator 配置为使用
AllNamespaces
安装模式时,与将单个或指定命名空间集为目标时,会在集群中的每个命名空间中创建 Operator 的复制的 CSV。在大型集群中,带有命名空间和安装的 Operator 可能存在于数百个或数千种 CSV 中,复制的 CSV 消耗大量资源,如 OLM 的内存用量、集群 etcd 限值和网络带宽。
为了支持这些较大的集群,集群管理员可以为使用
AllNamespaces
模式全局安装的 Operator 禁用复制的 CSV。
如果您禁用复制的 CSV,则在
AllNamespaces
模式中安装的 Operator 只将其 CSV 复制到
openshift
命名空间,而不是集群中的每个命名空间。在禁用复制的 CSV 模式中,Web 控制台和 CLI 的行为有所不同:
在 web 控制台中,默认行为会被修改为显示每个命名空间中的
openshift
命名空间中复制的 CSV,即使 CSV 不会实际复制到每个命名空间中。这允许常规用户仍可在其命名空间中查看这些 Operator 的详情,并创建相关的自定义资源 (CR)。
在 OpenShift CLI (
oc
) 中,常规用户可以使用
oc get csvs
命令查看直接安装在其命名空间中的 Operator,但
openshift
命名空间中的复制的 CSV 无法在其命名空间中可见。受此限制影响的 Operator 仍然可用,并继续协调用户命名空间中的事件。
要查看安装的全局 Operator 的完整列表,类似于 Web 控制台行为,所有经过身份验证的用户都可以运行以下命令:
$ oc get csvs -n openshift
流程
-
编辑名为
cluster
的
OLMConfig
对象,将
spec.features.disableCopiedCSVs
字段设置为
true
:
$ oc apply -f - <<EOF
apiVersion: operators.coreos.com/v1
kind: OLMConfig
metadata:
name: cluster
spec:
features:
disableCopiedCSVs: true 1
EOF
-
1
-
为
AllNamespaces
安装模式 Operator 禁用复制的 CSV
当禁用复制的 CSV 时,OLM 会在 Operator 命名空间中捕获这些信息:
$ oc get events
4.5. 在 Operator Lifecycle Manager 中配置代理支持
如果在 OpenShift Container Platform 集群中配置了全局代理,Operator Lifecycle Manager(OLM)会自动配置使用集群范围代理管理的 Operator。但是,您也可以配置已安装的 Operator 来覆盖全局代理服务器或注入自定义 CA 证书。
配置集群范围代理
配置自定义 PKI
(自定义 CA 证书)
开发支持
Go
、
Ansible
和
Helm
的代理设置的 Operator
如果配置了集群范围的出口代理,使用 Operator Lifecycle Manager(OLM)运行的 Operator 会继承其部署上的集群范围代理设置。集群管理员还可以通过配置 Operator 的订阅来覆盖这些代理设置。
操作员必须为任何受管 Operands 处理 pod 中的代理设置环境变量。
使用具有
cluster-admin
权限的账户访问 OpenShift Container Platform 集群。
在 Web 控制台中导航至
Operators → OperatorHub
页面。
选择 Operator 并点
Install
。
在
Install Operator
页面中,修改
Subscription
对象,使其在
spec
部分中包含一个或多个以下环境变量:
HTTP_PROXY
HTTPS_PROXY
NO_PROXY
当集群管理员使用配置映射向集群添加自定义 CA 证书时,Cluster Network Operator 会将用户提供的证书和系统 CA 证书合并为一个捆绑包(bundle)。您可以将这个合并捆绑包注入 Operator Lifecycle Manager (OLM) 上运行的 Operator 中,如果您有一个中间人(man-in-the-middle)HTTPS 代理,这将会有用。
使用具有
cluster-admin
权限的账户访问 OpenShift Container Platform 集群。
使用配置映射添加自定义 CA 证书至集群。
在 OLM 上安装并运行所需的 Operator。
在存在 Operator 订阅的命名空间中创建一个空配置映射,并包括以下标签:
apiVersion: v1
kind: ConfigMap
metadata:
name: trusted-ca 1
labels:
config.openshift.io/inject-trusted-cabundle: "true" 2
-
1
-
配置映射的名称。
请求 Cluster Network Operator 注入合并的捆绑包。
创建此配置映射后,它会立即使用合并捆绑包的证书内容填充。
更新您的
Subscription
对象,使其包含
spec.config
部分,该部分可将
trusted-ca
配置映射作为卷挂载到需要自定义 CA 的 pod 中的每个容器:
apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
name: my-operator
spec:
package: etcd
channel: alpha
config: 1
selector:
matchLabels:
<labels_for_pods> 2
volumes: 3
- name: trusted-ca
configMap:
name: trusted-ca
items:
- key: ca-bundle.crt 4
path: tls-ca-bundle.pem 5
volumeMounts: 6
- name: trusted-ca
mountPath: /etc/pki/ca-trust/extracted/pem
readOnly: true
-
1
-
如果不存在,请添加
config
部分。
指定标签以匹配 Operator 拥有的 pod。
创建一个
trusted-ca
卷。
ca-bundle.crt
需要作为配置映射键。
tls-ca-bundle.pem
需要作为配置映射路径。
创建一个
trusted-ca
卷挂载。
Operator 的部署可能无法验证颁发机构,并显示
x509 certificate signed by unknown authority
错误。即使在使用 Operator 订阅时注入自定义 CA,也会发生这个错误。在这种情况下,您可以使用 Operator 的订阅将
mountPath
设置为 trusted-ca 的
/etc/ssl/certs
。
了解 Operator Lifecycle Manager (OLM) 中的系统状态,对于决定和调试已安装 Operator 的问题来说非常重要。OLM 可让您了解订阅和相关目录源的状态以及执行的操作。这样有助于用户更好地理解 Operator 的运行状况。
订阅可报告以下状况类型:
表 4.1. 订阅状况类型
状况
|
描述
|
CatalogSourcesUnhealthy
用于解析的一个或多个目录源不健康。
InstallPlanMissing
缺少订阅的安装计划。
InstallPlanPending
订阅的安装计划正在安装中。
InstallPlanFailed
订阅的安装计划失败。
ResolutionFailed
订阅的依赖项解析失败。
默认 OpenShift Container Platform 集群 Operator 由 Cluster Version Operator(CVO)管理,它们没有
Subscription
对象。应用程序 Operator 由 Operator Lifecycle Manager(OLM)管理,它们具有
Subscription
对象。
刷新失败的订阅
4.6.2. 使用 CLI 查看 Operator 订阅状态
您可以使用 CLI 查看 Operator 订阅状态。
您可以使用具有
cluster-admin
角色的用户访问集群。
已安装 OpenShift CLI(
oc
)。
列出 Operator 订阅:
$ oc get subs -n <operator_namespace>
使用
oc describe
命令检查
Subscription
资源:
$ oc describe sub <subscription_name> -n <operator_namespace>
在命令输出中,找到 Operator 订阅状况类型的
Conditions
部分。在以下示例中,
CatalogSourcesUnhealthy
条件类型具有
false
状态,因为所有可用目录源都健康:
Name: cluster-logging
Namespace: openshift-logging
Labels: operators.coreos.com/cluster-logging.openshift-logging=
Annotations: <none>
API Version: operators.coreos.com/v1alpha1
Kind: Subscription
# ...
Conditions:
Last Transition Time: 2019-07-29T13:42:57Z
Message: all available catalogsources are healthy
Reason: AllCatalogSourcesHealthy
Status: False
Type: CatalogSourcesUnhealthy
# ...
默认 OpenShift Container Platform 集群 Operator 由 Cluster Version Operator(CVO)管理,它们没有
Subscription
对象。应用程序 Operator 由 Operator Lifecycle Manager(OLM)管理,它们具有
Subscription
对象。
4.6.3. 使用 CLI 查看 Operator 目录源状态
您可以使用 CLI 查看 Operator 目录源的状态。
您可以使用具有
cluster-admin
角色的用户访问集群。
已安装 OpenShift CLI(
oc
)。
列出命名空间中的目录源。例如,您可以检查
openshift-marketplace
命名空间,该命名空间用于集群范围的目录源:
$ oc get catalogsources -n openshift-marketplace
作为集群管理员,您可以使用 Operator Lifecycle Manager(OLM)来管理 Operator 状况。
作为集群管理员,您可能想要忽略由 Operator 报告的、支持的 Operator 条件。当存在时,
Spec.Overrides
阵列中的 Operator 条件会覆盖
Spec.Conditions
阵列中的条件,以便集群管理员可以处理 Operator 向 Operator Lifecycle Manager(OLM)报告了不正确状态的情况。
默认情况下,
OperatorCondition
对象中不存在
Spec.Overrides
数组,直到集群管理员添加为止。
Spec.Conditions
数组还不存在,直到被用户添加或因为自定义 Operator 逻辑而添加为止。
例如,一个 Operator 的已知版本,它始终会告知它是不可升级的。在这种情况下,尽管报告是不可升级的,您仍然希望升级 Operator。这可以通过在
OperatorCondition
对象的
Spec.Overrides
阵列中添加
type
和
status
来覆盖 Operator 条件来实现。
您可以使用具有
cluster-admin
角色的用户访问集群。
具有
OperatorCondition
对象的 Operator,使用 OLM 安装。
编辑 Operator 的
OperatorCondition
对象:
$ oc edit operatorcondition <name>
在对象中添加
Spec.Overrides
数组:
4.7.2. 更新 Operator 以使用 Operator 条件
Operator Lifecycle Manager(OLM)会自动为每个它所协调的
ClusterServiceVersion
资源创建一个
OperatorCondition
资源。CSV 中的所有服务帐户都会被授予 RBAC,以便与 Operator 拥有的
OperatorCondition
交互。
Operator 作者可开发其自己的 Operator 来使用
operator-lib
库,以便在由 OLM 部署 Operator 后,它可以设置自己的条件。有关将 Operator 条件设置为 Operator 作者的更多信息,请参阅
启用 Operator 条件
页面。
为了保持向后兼容,OLM 认为在没有
OperatorCondition
时代表不使用条件。因此,要使用 Operator 条件的 Operator,在将 pod 的就绪探测设置为
true
前应设置默认条件。这为 Operator 提供了一个宽限期,用于将条件更新为正确的状态。
集群管理员可以使用
Operator 组
来允许常规用户安装 Operator。
operator 组
Operator 可能需要广泛权限才可运行,且不同版本需要的权限也可能不同。Operator Lifecycle Manager (OLM) 需要
cluster-admin
权限才可运行。默认情况下,Operator 作者可在集群服务版本(CSV)中指定任意权限集,OLM 之后会将其授予 Operator。
为确保 Operator 无法获得集群范围的权限,并且用户无法使用 OLM 升级权限,集群管理员可在将 Operator 添加到集群前手动审核 Operator。集群管理员还可获得一些工具来决定和限制在使用服务账户安装或升级 Operator 期间允许的操作。
集群管理员可以将 Operator 组与赋予了一组权限的服务账户关联。服务帐户在 Operator 上设置策略,通过使用基于角色的访问控制 (RBAC) 规则来确保它们仅在预先确定的边界内运行。因此,Operator 无法执行这些规则未明确允许的任何操作。
通过使用 Operator 组,具有足够权限的用户可以安装具有有限范围的 Operator。因此,更多 Operator Framework 工具可以安全地提供给更多用户,为使用 Operator 构建应用程序提供更丰富的体验。
Subscription
对象的基于角色的访问控制 (RBAC) 会自动授予命名空间中具有
edit
或
admin
角色的用户。但是,
OperatorGroup
对象不存在 RBAC;没有什么情况可防止常规用户安装 Operator。预安装 Operator 组实际上会提供安装权限。
在将 Operator 组与服务帐户关联时请注意以下几点:
APIService
和
CustomResourceDefinition
资源都由 OLM 使用
cluster-admin
角色来创建。不应向与 Operator 组相关联的服务账户授予写入这些资源的权限。
与该 Operator 组相关联的所有 Operator 现已被限制在指定服务账户获得的权限范围内。如果 Operator 请求了超出服务账户范围的权限,安装会失败,并显示适当的错误,以便集群管理员能够排除故障并解决问题。
在确定是否可在集群上安装或升级 Operator 时,Operator Lifecycle Manager(OLM)会考虑以下情况:
集群管理员新建了一个 Operator 组并指定了服务账户。已安装与该 Operator 组关联的所有 Operator,并根据相应服务账户获得的权限运行。
集群管理员新建了一个 Operator 组,且不指定任何服务帐户。OpenShift Container Platform 保持向后兼容性,因此会保留默认行为,并允许安装和升级 Operator。
对于未指定服务账户的现有 Operator 组,会保留默认行为,并允许安装和升级 Operator。
集群管理员更新了现有 Operator 组并指定了服务帐户。OLM 支持现有 Operator 继续根据当前权限运行。现有 Operator 升级后,它会重新安装并根据相应服务账户获得的权限运行,与新 Operator 一样。
由 Operator 组指定的服务帐户通过添加或删除权限来更改,或者现有服务账户被换为新服务帐户。现有 Operator 升级后,它会重新安装并根据更新后的服务账户获得的权限运行,与新 Operator 一样。
集群管理员从 Operator 组中删除服务账户。默认行为保留,并允许安装和升级 Operator。
当 Operator 组与服务账户绑定,并且安装或升级了 Operator 时,Operator Lifecycle Manager(OLM)会使用以下工作流:
OLM 会提取给定
订阅
对象。
OLM 获取与该订阅相关联的 Operator 组。
OLM 确定 Operator 组是否指定了服务帐户。
OLM 在服务账户范围内创建一个客户端,并使用该范围内客户端来安装 Operator。这样可确保 Operator 请求的任何权限始终限制在 Operator 组中服务账户的权限范围内。
OLM 新建一个服务账户,在 CSV 中指定其权限集,并将其分配至 Operator。Operator 将根据所分配的服务账户运行。
要为 Operator Lifecycle Manager(OLM)上的 Operator 安装和升级提供范围规则,请将服务帐户与 Operator 组关联。
集群管理员可借鉴本例,将一组 Operator 限制到指定命名空间中。
您可以使用具有
cluster-admin
角色的用户访问集群。
已安装 OpenShift CLI(
oc
)。
新建命名空间:
$ cat <<EOF | oc create -f -
apiVersion: v1
kind: Namespace
metadata:
name: scoped
分配 Operator 的权限范围。这涉及创建新服务帐户、相关角色和角色绑定。
$ cat <<EOF | oc create -f -
apiVersion: v1
kind: ServiceAccount
metadata:
name: scoped
namespace: scoped
为简便起见,以下示例授予服务账户在指定命名空间进行任何操作的权限。在生产环境中,应创建更为精细的权限集:
$ cat <<EOF | oc create -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: scoped
namespace: scoped
rules:
- apiGroups: ["*"]
resources: ["*"]
verbs: ["*"]
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: scoped-bindings
namespace: scoped
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: scoped
subjects:
- kind: ServiceAccount
name: scoped
namespace: scoped
在指定的命名空间中创建 OperatorGroup 对象。该 Operator 组以指定的命名空间为目标,以确保其租期仅限于该命名空间。
另外,Operator 组允许用户指定服务帐户。指定上一步中创建的服务帐户:
$ cat <<EOF | oc create -f -
apiVersion: operators.coreos.com/v1
kind: OperatorGroup
metadata:
name: scoped
namespace: scoped
spec:
serviceAccountName: scoped
targetNamespaces:
- scoped
在指定命名空间中安装的任何 Operator 均会关联至此 Operator 组,因此也会关联到指定的服务账户。
Operator Lifecycle Manager (OLM) 为每个 Operator 组创建以下集群角色:
<operatorgroup_name>-admin
<operatorgroup_name>-edit
<operatorgroup_name>-view
当手动创建 Operator 组时,您必须指定一个没有与现有集群角色或其他 Operator 组冲突的唯一名称。
在指定命名空间中创建 Subscription 对象以安装 Operator:
$ cat <<EOF | oc create -f -
apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
name: etcd
namespace: scoped
spec:
channel: singlenamespace-alpha
name: etcd
source: <catalog_source_name> 1
sourceNamespace: <catalog_source_namespace> 2
EOF - 1
指定已存在于指定命名空间中或位于全局目录命名空间中的目录源。
指定创建目录源的命名空间。
与该 Operator 组相关联的所有 Operator 都仅限于为指定服务账户授予的权限。如果 Operator 请求的权限超出服务账户范围,安装会失败并显示相关错误。
Operator Lifecycle Manager(OLM)使用 Operator 组中指定的服务账户来创建或更新与正在安装的 Operator 相关的以下资源:
ClusterServiceVersion
Subscription
Secret
ServiceAccount
Service
ClusterRole 和 ClusterRoleBinding
Role 和 RoleBinding
要将 Operator 限制到指定命名空间,集群管理员可以首先向服务账户授予以下权限:
以下角色只是一个通用示例,具体 Operator 可能需要额外规则。
kind: Role
rules:
- apiGroups: ["operators.coreos.com"]
resources: ["subscriptions", "clusterserviceversions"]
verbs: ["get", "create", "update", "patch"]
- apiGroups: [""]
resources: ["services", "serviceaccounts"]
verbs: ["get", "create", "update", "patch"]
- apiGroups: ["rbac.authorization.k8s.io"]
resources: ["roles", "rolebindings"]
verbs: ["get", "create", "update", "patch"]
- apiGroups: ["apps"] 1
resources: ["deployments"]
verbs: ["list", "watch", "get", "create", "update", "patch", "delete"]
- apiGroups: [""] 2
resources: ["pods"]
verbs: ["list", "watch", "get", "create", "update", "patch", "delete"] - 1 2
增加创建其他资源的权限,如此处显示的部署和 pod。
另外,如果任何 Operator 指定了 pull secret,还必须增加以下权限:
kind: ClusterRole 1
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get"]
kind: Role
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["create", "update", "patch"] - 1
需要从 OLM 命名空间中获取 secret。
当在全局目录命名空间
openshift-marketplace
中创建 Operator 目录时,目录的 Operator 会提供给所有命名空间。在其他命名空间中创建的目录仅使其 Operator 在目录的同一命名空间中可用。
在非集群管理员用户委托了 Operator 安装权限的集群上,集群管理员可能需要进一步控制或限制允许用户安装的 Operator 集合。这可以通过以下操作来实现:
禁用所有默认全局目录。
在预安装相关 Operator 组的同一命名空间中启用自定义、策展的目录。
禁用默认的 OperatorHub 目录源
在集群中添加目录源
如果因为缺少权限而导致 Operator 安装失败,请按照以下流程找出错误。
查看
Subscription
对象。其状态中有一个指向
InstallPlan
对象的对象引用
installPlanRef
,该对象试图为 Operator 创建需要的
[Cluster]Role[Binding]
:
apiVersion: operators.coreos.com/v1
kind: Subscription
metadata:
name: etcd
namespace: scoped
status:
installPlanRef:
apiVersion: operators.coreos.com/v1
kind: InstallPlan
name: install-4plp8
namespace: scoped
resourceVersion: "117359"
uid: 2c1df80e-afea-11e9-bce3-5254009c9c23
检查
InstallPlan
对象的状态中的任何错误:
apiVersion: operators.coreos.com/v1
kind: InstallPlan
status:
conditions:
- lastTransitionTime: "2019-07-26T21:13:10Z"
lastUpdateTime: "2019-07-26T21:13:10Z"
message: 'error creating clusterrole etcdoperator.v0.9.4-clusterwide-dsfx4: clusterroles.rbac.authorization.k8s.io
is forbidden: User "system:serviceaccount:scoped:scoped" cannot create resource
"clusterroles" in API group "rbac.authorization.k8s.io" at the cluster scope'
reason: InstallComponentFailed
status: "False"
type: Installed
phase: Failed
错误信息中会显示:
创建失败的资源类型,包括资源的 API 组。本例中为
rbac.authorization.k8s.io
组中的
clusterroles
。
资源名称。
错误类型:
is forbidden
表明相应用户没有足够权限来执行这一操作。
试图创建或更新资源的用户名称。本例中指的是 Operator 组中指定的服务账户。
操作范围:
集群范围内
或范围外。
用户可在服务账户中增加所缺权限,然后迭代操作。
Operator Lifecycle Manager(OLM)目前未提供第一次尝试的完整错误列表。
集群管理员和 Operator 目录维护人员可以使用 OpenShift Container Platform 的 Operator Lifecycle Manager (OLM) 上的
捆绑包格式
创建和管理打包的自定义目录。
Kubernetes 定期弃用后续版本中删除的某些 API。因此,从使用删除 API 的 Kubernetes 版本的 OpenShift Container Platform 版本开始,Operator 无法使用删除 API 的 API。
如果您的集群使用自定义目录,请参阅
控制 Operator 与 OpenShift Container Platform 版本的兼容性
,以了解更多有关 Operator 作者如何更新其项目的详细信息,以帮助避免工作负载问题并防止不兼容的升级。
红帽提供的 Operator 目录
基于文件的目录
是 Operator Lifecycle Manager (OLM) 中目录格式的最新迭代。它是基于纯文本(JSON 或 YAML)和早期 SQLite 数据库格式的声明式配置演变,并且完全向后兼容。
从 OpenShift Container Platform 4.11 开始,默认的红帽提供的 Operator 目录以基于文件的目录格式发布。通过以过时的 SQLite 数据库格式发布的 4.10,用于 OpenShift Container Platform 4.6 的默认红帽提供的 Operator 目录。
与 SQLite 数据库格式相关的
opm
子命令、标志和功能已被弃用,并将在以后的版本中删除。功能仍被支持,且必须用于使用已弃用的 SQLite 数据库格式的目录。
许多
opm
子命令和标志都用于 SQLite 数据库格式,如
opm index prune
,它们无法使用基于文件的目录格式。有关使用基于文件的目录的更多信息,请参阅
Operator Framework 打包格式
以及
使用 oc-mirror 插件为断开连接的安装 mirror 镜像
。
您可以使用
opm
CLI 创建一个目录镜像,它使用纯文本(
基于文件的目录
)格式(JSON 或 YAML),替换已弃用的 SQLite 数据库格式。
已安装
opm
CLI。
您有
podman
版本 1.9.3+。
已构建捆绑包镜像并推送到支持
Docker v2-2
的 registry。
初始化目录:
运行以下命令,为目录创建一个目录:
$ mkdir <catalog_dir>
运行
opm generate dockerfile
命令生成可构建目录镜像的 Dockerfile:
$ opm generate dockerfile <catalog_dir> \
-i registry.redhat.io/openshift4/ose-operator-registry:v4.13 1
-
1
-
使用
-i
标志指定官方红帽基础镜像,否则 Dockerfile 使用默认的上游镜像。
Dockerfile 必须与您在上一步中创建的目录目录位于相同的父目录中:
检查错误代码是否为
0
:
$ echo $?
将目录镜像推送到 registry:
如果需要,运行
podman login
命令与目标 registry 进行身份验证:
$ podman login <registry>
运行
podman push
命令来推送目录镜像:
$ podman push <registry>/<namespace>/<catalog_image_name>:<tag>
您可以使用
opm
CLI 更新或过滤(也称为 prune)使用基于文件的目录格式的目录镜像。通过提取和修改现有目录镜像的内容,您可以从目录中更新、添加或删除一个或多个 Operator 软件包条目。然后,您可以将镜像重新构建为目录的更新版本。
或者,如果您已在镜像 registry 上已有目录镜像,您可以使用 oc-mirror CLI 插件在将其镜像到目标 registry 时自动从该目录镜像更新的源版本中修剪任何删除的镜像。
有关 oc-mirror 插件和此用例的更多信息,请参阅"更新您的镜像 registry 内容"部分,特别是"使用 oc-mirror 插件为断开连接的安装镜像镜像"部分。
在您的工作站上有以下内容:
opm
CLI。
podman
版本 1.9.3+。
基于文件的目录镜像。
最近在与此目录相关的工作站上初始化的目录结构。
如果您没有初始化的 catalog 目录,请创建目录并生成 Dockerfile。如需更多信息,请参阅"创建基于文件的目录镜像"中的"初始化目录"步骤。
以 YAML 格式将目录镜像的内容提取到 catalog 目录中的
index.yaml
文件中:
$ opm render <registry>/<namespace>/<catalog_image_name>:<tag> \
-o yaml > <catalog_dir>/index.yaml
或者,您可以使用
-o json
标志以 JSON 格式输出。
通过更新、添加或删除一个或多个 Operator 软件包条目,将生成的
index.yaml
文件的内容修改为您的规格。
在目录中发布捆绑包后,假设您安装了其中一个用户。确保之前发布目录中的所有捆绑包都具有到当前或更新频道头的更新路径,以避免安装该版本的用户。
例如,如果要删除 Operator 软件包,以下示例列出了一组
olm.package
、
olm.channel
和
olm.bundle
blob,它们必须删除才能从目录中删除软件包:
例 4.2. 删除条目示例
---
defaultChannel: release-2.7
icon:
base64data: <base64_string>
mediatype: image/svg+xml
name: example-operator
schema: olm.package
entries:
- name: example-operator.v2.7.0
skipRange: '>=2.6.0 <2.7.0'
- name: example-operator.v2.7.1
replaces: example-operator.v2.7.0
skipRange: '>=2.6.0 <2.7.1'
- name: example-operator.v2.7.2
replaces: example-operator.v2.7.1
skipRange: '>=2.6.0 <2.7.2'
- name: example-operator.v2.7.3
replaces: example-operator.v2.7.2
skipRange: '>=2.6.0 <2.7.3'
- name: example-operator.v2.7.4
replaces: example-operator.v2.7.3
skipRange: '>=2.6.0 <2.7.4'
name: release-2.7
package: example-operator
schema: olm.channel
image: example.com/example-inc/example-operator-bundle@sha256:<digest>
name: example-operator.v2.7.0
package: example-operator
properties:
- type: olm.gvk
value:
group: example-group.example.io
kind: MyObject
version: v1alpha1
- type: olm.gvk
value:
group: example-group.example.io
kind: MyOtherObject
version: v1beta1
- type: olm.package
value:
packageName: example-operator
version: 2.7.0
- type: olm.bundle.object
value:
data: <base64_string>
- type: olm.bundle.object
value:
data: <base64_string>
relatedImages:
- image: example.com/example-inc/example-related-image@sha256:<digest>
name: example-related-image
schema: olm.bundle
将更改保存到 index.yaml 文件。
验证目录:
$ opm validate <catalog_dir>
重建目录:
$ podman build . \
-f <catalog_dir>.Dockerfile \
-t <registry>/<namespace>/<catalog_image_name>:<tag>
将更新的目录镜像推送到 registry:
$ podman push <registry>/<namespace>/<catalog_image_name>:<tag>
Operator 目录的 SQLite 数据库格式是一个弃用的功能。弃用的功能仍然包含在 OpenShift Container Platform 中,并将继续被支持。但是,这个功能会在以后的发行版本中被删除,且不建议在新的部署中使用。
有关 OpenShift Container Platform 中已弃用或删除的主要功能的最新列表,请参阅 OpenShift Container Platform 发行注记中
已弃用和删除的功能
部分。
4.9.3.1. 创建基于 SQLite 的索引镜像
您可以使用
opm
CLI 根据 SQLite 数据库格式创建索引镜像。
已安装
opm
CLI。
您有
podman
版本 1.9.3+。
已构建捆绑包镜像并推送到支持
Docker v2-2
的 registry。
启动一个新的索引:
$ opm index add \
--bundles <registry>/<namespace>/<bundle_image_name>:<tag> \1
--tag <registry>/<namespace>/<index_image_name>:<tag> \2
[--binary-image <registry_base_image>] 3
-
1
-
要添加到索引中的捆绑包镜像以逗号分隔的列表。
希望索引镜像具有的镜像标签。
可选:用于为目录提供服务的备选 registry 基础镜像。
将索引镜像推送到 registry。
如果需要,与目标 registry 进行身份验证:
$ podman login <registry>
-
推送索引镜像:
$ podman push <registry>/<namespace>/<index_image_name>:<tag>
4.9.3.2. 更新基于 SQLite 的索引镜像
在将 OperatorHub 配置为使用引用自定义索引镜像的目录源后,集群管理员可通过将捆绑包镜像添加到索引镜像来保持其集群上的可用 Operator 最新状态。
您可以使用
opm index add
命令来更新存在的索引镜像。
已安装
opm
CLI。
您有
podman
版本 1.9.3+。
构建并推送到 registry 的索引镜像。
引用索引镜像的现有目录源。
通过添加捆绑包镜像来更新现有索引:
$ opm index add \
--bundles <registry>/<namespace>/<new_bundle_image>@sha256:<digest> \1
--from-index <registry>/<namespace>/<existing_index_image>:<existing_tag> \2
--tag <registry>/<namespace>/<existing_index_image>:<updated_tag> \3
--pull-tool podman 4
-
1
-
--bundles
标志指定要添加到索引中的、以逗号分隔的额外捆绑包镜像列表。
--from-index
标志指定之前推送的索引。
--tag
标志指定要应用到更新的索引镜像的镜像标签。
--pull-tool
标志指定用于拉取容器镜像的工具。
-
<registry>
-
指定 registry 的主机名,如
quay.io
或
mirror.example.com
。
-
<namespace>
-
指定 registry 的命名空间,如
ocs-dev
或
abc
。
-
<new_bundle_image>
-
指定要添加到 registry 的新捆绑包镜像,如
ocs-operator
。
-
<digest>
-
指定捆绑包镜像的 SHA 镜像 ID 或摘要,如
c7f11097a628f092d8bad148406aa0e0951094a03445fd4bc0775431ef683a41
。
-
<existing_index_image>
-
指定之前推送的镜像,如
abc-redhat-operator-index
。
-
<existing_tag>
-
指定之前推送的镜像标签,如
4.13
。
-
<updated_tag>
-
指定要应用到更新的索引镜像的镜像标签,如
4.13.1
。
$ opm index add \
--bundles quay.io/ocs-dev/ocs-operator@sha256:c7f11097a628f092d8bad148406aa0e0951094a03445fd4bc0775431ef683a41 \
--from-index mirror.example.com/abc/abc-redhat-operator-index:4.13 \
--tag mirror.example.com/abc/abc-redhat-operator-index:4.13.1 \
--pull-tool podman
推送更新的索引镜像:
$ podman push <registry>/<namespace>/<existing_index_image>:<updated_tag>
-
Operator Lifecycle Manager(OLM)会在常规时间段内自动轮询目录源中引用的索引镜像,验证是否已成功添加新软件包:
$ oc get packagemanifests -n openshift-marketplace
4.9.3.3. 过滤基于 SQLite 的索引镜像
基于 Operator Bundle Format 的索引镜像是 Operator 目录的容器化快照。您可以过滤或
prune(修剪)
除指定的软件包列表以外的所有索引,创建只包含您想要的 Operator 的源索引副本。
您有
podman
版本 1.9.3+。
grpcurl
(第三方命令行工具)
已安装
opm
CLI。
访问支持
Docker v2-2
的 registry
通过目标 registry 进行身份验证:
$ podman login <target_registry>
确定您要包括在您的修剪索引中的软件包列表。
运行您要修剪容器中的源索引镜像。例如:
$ podman run -p50051:50051 \
-it registry.redhat.io/redhat/redhat-operator-index:v4.13
检查
package.out
文件,确定要保留在此列表中的哪个软件包名称。例如:
OpenShift Container Platform 4.11 中引入了
Pod 安全准入
,以确保 pod 安全标准。使用基于 SQLite 的目录格式构建的目录源以及在 OpenShift Container Platform 4.11 无法运行受限 pod 安全强制前发布的
opm
CLI 工具的版本。
在 OpenShift Container Platform 4.13 中,命名空间默认没有限制 pod 安全强制,默认目录源安全模式被设置为
legacy
。
计划在以后的 OpenShift Container Platform 发行版本中包括所有命名空间的默认限制强制。当发生受限强制时,目录源 pod 规格的安全上下文必须与受限 pod 安全标准匹配。如果您的目录源镜像需要不同的 pod 安全标准,则必须明确设置命名空间的 pod 安全准入标签。
如果您不想以受限方式运行基于 SQLite 的目录源 pod,则不需要在 OpenShift Container Platform 4.13 中更新目录源。
但是,建议您采取措施来确保目录源在受限 pod 安全强制下运行。如果您不采取措施来确保目录源在受限 pod 安全强制下运行,您的目录源可能不会在以后的 OpenShift Container Platform 版本中运行。
作为目录作者,您可以通过完成以下任一操作来启用与受限 pod 安全强制的兼容性:
将您的目录迁移到基于文件的目录格式。
使用 OpenShift Container Platform 4.11 或更高版本发布的
opm
CLI 工具版本更新您的目录镜像。
SQLite 数据库目录格式已弃用,但仍然被红帽支持。在以后的发行版本中,不支持 SQLite 数据库格式,目录将需要迁移到基于文件的目录格式。从 OpenShift Container Platform 4.11 开始,默认的红帽提供的 Operator 目录以基于文件的目录格式发布。基于文件的目录与受限 pod 安全强制兼容。
如果您不想更新 SQLite 数据库目录镜像,或将目录迁移到基于文件的目录格式,您可以将目录配置为使用升级的权限运行。
了解并管理 pod 安全准入
4.9.4.1. 将 SQLite 数据库目录迁移到基于文件的目录格式
您可以将已弃用的 SQLite 数据库格式目录更新为基于文件的目录格式。
SQLite 数据库目录源
您可以使用具有
cluster-admin
角色的用户访问集群。
工作站上 OpenShift Container Platform 4.13 发布的
opm
CLI 工具的最新版本
运行以下命令,将 SQLite 数据库目录迁移到基于文件的目录:
$ opm migrate <registry_image> <fbc_directory>
运行以下命令,为您的基于文件的目录生成 Dockerfile:
$ opm generate dockerfile <fbc_directory> \
--binary-image \
registry.redhat.io/openshift4/ose-operator-registry:v4.13
后续步骤
-
生成的 Dockerfile 可以构建、标记并推送到 registry。
在集群中添加目录源
4.9.4.2. 重建 SQLite 数据库目录镜像
您可以使用 OpenShift Container Platform 版本发布的
opm
CLI 工具的最新版本重建 SQLite 数据库目录镜像。
SQLite 数据库目录源
您可以使用具有
cluster-admin
角色的用户访问集群。
工作站上 OpenShift Container Platform 4.13 发布的
opm
CLI 工具的最新版本
运行以下命令,使用
opm
CLI 工具的最新版本重建目录:
$ opm index add --binary-image \
registry.redhat.io/openshift4/ose-operator-registry:v4.13 \
--from-index <your_registry_image> \
--bundles "" -t \<your_registry_image>
如果您不想更新 SQLite 数据库目录镜像,或将目录迁移到基于文件的目录格式,您可以执行以下操作以确保目录源在默认 pod 安全强制更改为受限时运行:
在目录源定义中手动将目录安全模式设置为 legacy。此操作可确保您的目录使用旧权限运行,即使默认目录安全模式更改为 restricted。
为基准或特权 pod 安全强制标记目录源命名空间。
SQLite 数据库目录格式已弃用,但仍然被红帽支持。在以后的发行版本中,不支持 SQLite 数据库格式,目录将需要迁移到基于文件的目录格式。基于文件的目录与受限 pod 安全强制兼容。
SQLite 数据库目录源
您可以使用具有
cluster-admin
角色的用户访问集群。
支持运行带有升级 pod 安全准入标准
baseline
或
privileged
的 pod 的目标命名空间
通过将
spec.grpcPodConfig.securityContextConfig
标签设置为
legacy
来编辑
CatalogSource
定义,如下例所示:
将目录源添加到 OpenShift Container Platform 集群可为用户发现和安装 Operator。集群管理员可以创建一个
CatalogSource
对象来引用索引镜像。OperatorHub 使用目录源来填充用户界面。
或者,您可以使用 Web 控制台管理目录源。在
Administration
→
Cluster Settings
→
Configuration
→
OperatorHub
页面中,点
Sources
选项卡,您可以在其中创建、更新、删除、禁用和启用单独的源。
构建并推送索引镜像到 registry。
您可以使用具有
cluster-admin
角色的用户访问集群。
创建一个
CatalogSource
对象来引用索引镜像。
根据您的规格修改以下内容,并将它保存为
catalogSource.yaml
文件:
apiVersion: operators.coreos.com/v1alpha1
kind: CatalogSource
metadata:
name: my-operator-catalog
namespace: openshift-marketplace 1
annotations:
olm.catalogImageTemplate: 2
"<registry>/<namespace>/<index_image_name>:v{kube_major_version}.{kube_minor_version}.{kube_patch_version}"
spec:
sourceType: grpc
grpcPodConfig:
securityContextConfig: <security_mode> 3
image: <registry>/<namespace>/<index_image_name>:<tag> 4
displayName: My Operator Catalog
publisher: <publisher_name> 5
updateStrategy:
registryPoll: 6
interval: 30m
-
1
-
如果您希望目录源对所有命名空间中的用户全局可用,请指定
openshift-marketplace
命名空间。否则,您可以指定一个不同的命名空间来对目录进行作用域并只对该命名空间可用。
可选:将
olm.catalogImageTemplate
注解设置为索引镜像名称,并使用一个或多个 Kubernetes 集群版本变量,如为镜像标签构建模板时所示。
指定
legacy
或
restricted
的值。如果没有设置该字段,则默认值为
legacy
。在以后的 OpenShift Container Platform 发行版本中,计划默认值为
restricted
。如果您的目录无法使用
restricted
权限运行,建议您手动将此字段设置为
legacy
。
指定索引镜像。如果您在镜像名称后指定了标签,如
:v4.13
,则目录源 Pod 会使用镜像 pull 策略
Always
,这意味着 pod 始终在启动容器前拉取镜像。如果您指定了摘要,如
@sha256:<id>
,则镜像拉取策略为
IfNotPresent
,这意味着仅在节点上不存在的镜像时才拉取镜像。
指定发布目录的名称或机构名称。
目录源可以自动检查新版本以保持最新。
使用该文件创建
CatalogSource
对象:
$ oc apply -f catalogSource.yaml
-
确定成功创建以下资源。
检查 pod:
$ oc get pods -n openshift-marketplace
4.9.6. 从私有 registry 访问 Operator 的镜像
如果与 Operator Lifecycle Manager(OLM)管理的 Operator 相关的某些镜像托管在需要经过身份验证的容器镜像 registry(也称为私有 registry)中时,在默认情况下,OLM 和 OperatorHub 将无法拉取镜像。要启用访问权限,可以创建一个包含 registry 验证凭证的 pull secret。通过引用一个或多个目录源的 pull secret,OLM 可以处理将 secret 放置到 Operator 和目录命名空间中以允许进行安装。
Operator 或其 Operands 所需的其他镜像可能会需要访问私有 registry。对于这种情况,OLM 不处理将 secret 放置到目标租户命名空间中,但身份验证凭证可以添加到全局范围集群 pull secret 中,或单独的命名空间服务帐户中,以启用所需的访问权限。
在决定由 OLM 管理的 Operator 是否有适当的拉取访问权限时,应该考虑以下类型的镜像:
CatalogSource
对象可以引用索引镜像,该镜像使用 Operator 捆绑包格式,并作为托管在镜像 registry 中的容器镜像的目录源打包。如果索引镜像托管在私有 registry 中,可以使用 secret 来启用拉取访问。
捆绑包镜像
Operator 捆绑包镜像是元数据和清单,并被打包为容器镜像,代表 Operator 的一个特定版本。如果目录源中引用的任何捆绑包镜像托管在一个或多个私有 registry 中,可以使用一个 secret 来启用拉取(pull)访问。
Operator 和 Operand 镜像
如果从目录源安装的 Operator 使用私有镜像,对于 Operator 镜像本身或它监视的 Operand 镜像之一,Operator 将无法安装,因为部署无法访问所需的 registry 身份验证。在目录源中引用 secret 不会使 OLM 将 secret 放置到安装 Operands 的目标租户命名空间中。
相反,身份验证详情被添加到
openshift-config
命名空间中的全局集群 pull secret 中,该 secret 提供对集群上所有命名空间的访问。另外,如果不允许访问整个集群,则可将 pull secret 添加到目标租户命名空间的
default
服务帐户中。
您至少有一个托管在私有 registry 中的以下之一:
一个索引镜像或目录镜像。
一个 Operator 捆绑包镜像。
一个 Operator 或 Operand 镜像。
您可以使用具有
cluster-admin
角色的用户访问集群。
为每个必需的私有 registry 创建 secret。
登录到私有 registry 以创建或更新 registry 凭证文件:
$ podman login <registry>:<port>
registry 凭证的文件路径可能会根据用于登录到 registry 的容器工具的不同而有所不同。对于
podman
CLI,默认位置为
${XDG_RUNTIME_DIR}/containers/auth.json
。对于
docker
CLI,默认位置为
/root/.docker/config.json
。
建议您为每个 secret 只包含一个 registry 的凭证,并在单独的 secret 中为多个 registry 管理凭证。后续步骤中的
CatalogSource
可包括多个 secret,OpenShift Container Platform 会将这些 secret 合并为一个单独的虚拟凭证文件,以便在镜像拉取过程中使用。
默认情况下,registry 凭证文件可以在一个 registry 中存储多个 registry 或多个存储库的详细信息。确认您的文件的当前内容。例如:
4.9.7. 禁用默认的 OperatorHub 目录源
在 OpenShift Container Platform 安装过程中,默认为 OperatorHub 配置由红帽和社区项目提供的源内容的 operator 目录。作为集群管理员,您可以禁用默认目录集。
通过在
OperatorHub
对象中添加
disableAllDefaultSources: true 来
禁用默认目录的源:
$ oc patch OperatorHub cluster --type json \
-p '[{"op": "add", "path": "/spec/disableAllDefaultSources", "value": true}]'
或者,您可以使用 Web 控制台管理目录源。在
Administration
→
Cluster Settings
→
Configuration
→
OperatorHub
页面中,点
Sources
选项卡,您可以在其中创建、更新、删除、禁用和启用单独的源。
作为集群管理员,您可以删除之前添加到集群中的自定义 Operator 目录,方法是删除相关的目录源。
您可以使用具有
cluster-admin
角色的用户访问集群。
在 Web 控制台的
Administrator 视角中
,导航到
Administration
→
Cluster Settings
。
点
Configuration
选项卡,然后点
OperatorHub
。
点
Sources
选项卡。
选择您要删除的目录的
Options
菜单
,然后点
Delete CatalogSource
。
4.10. 在受限网络中使用 Operator Lifecycle Manager
对于在受限网络中安装的 OpenShift Container Platform 集群(也称为
断开连接的集群
),Operator Lifecycle Manager(OLM)默认无法访问托管在远程 registry 上的红帽提供的 OperatorHub 源,因为这些远程源需要足够的互联网连接。
但是,作为集群管理员,如果您有一个有完全互联网访问的工作站,则仍可以让集群在受限网络中使用 OLM。工作站需要完全访问互联网来拉取远程 OperatorHub 内容,用于准备远程源的本地镜像,并将内容推送到镜像 registry。
镜像 registry 可以位于堡垒主机上,它需要连接到您的工作站和断开连接的集群,或者一个完全断开连接的或
airgapped
主机,这需要可移动介质物理将镜像内容移到断开连接的环境中。
本指南描述了在受限网络中启用 OLM 所需的流程:
为 OLM 禁用默认远程 OperatorHub 源。
使用有完全互联网访问的工作站来创建并推送 OperatorHub 内容的本地镜像到镜像 registry。
将 OLM 配置为从镜像 registry 上的本地源而不是默认的远程源安装和管理 Operator。
在受限网络中启用 OLM 后,您可以继续使用不受限制的工作站在发布新版 Operator 时保持本地 OperatorHub 源的更新。
虽然 OLM 可以从本地源管理 Operator,但给定 Operator 在受限网络中成功运行仍取决于 Operator 本身满足以下条件:
在
ClusterServiceVersion
(CSV) 对象的
relatedImages
参数中列出所有相关的镜像,或 Operator 执行时可能需要的其他容器镜像。
通过摘要 (SHA) 而不是标签来引用所有指定的镜像。
您可以通过使用以下选择过滤,在
Red Hat Ecosystem Catalog
上搜索软件以获取支持以断开连接模式运行的红帽 Operator 列表:
容器化应用程序
Operator
基础架构特性
红帽提供的 Operator 目录
为受限网络环境启用 Operator
-
以具有
cluster-admin
权限的用户身份登录 OpenShift Container Platform 集群。
如果您在 IBM Z 上的受限网络中使用 OLM,则必须至少为放置 registry 的目录分配 12 GB 的存储空间。
4.10.2. 禁用默认的 OperatorHub 目录源
在 OpenShift Container Platform 安装过程中,默认为 OperatorHub 配置由红帽和社区项目提供的源内容的 operator 目录。在受限网络环境中,必须以集群管理员身份禁用默认目录。然后,您可以将 OperatorHub 配置为使用本地目录源。
通过在
OperatorHub
对象中添加
disableAllDefaultSources: true 来
禁用默认目录的源:
$ oc patch OperatorHub cluster --type json \
-p '[{"op": "add", "path": "/spec/disableAllDefaultSources", "value": true}]'
或者,您可以使用 Web 控制台管理目录源。在
Administration
→
Cluster Settings
→
Configuration
→
OperatorHub
页面中,点
Sources
选项卡,您可以在其中创建、更新、删除、禁用和启用单独的源。
4.10.3. 对 Operator 目录进行镜像(mirror)
有关与断开连接的集群一起使用的 Operator 目录的说明,请参阅
为断开连接的安装安装 → 镜像
。
从 OpenShift Container Platform 4.11 开始,默认的红帽提供的 Operator 目录以基于文件的目录格式发布。通过以过时的 SQLite 数据库格式发布的 4.10,用于 OpenShift Container Platform 4.6 的默认红帽提供的 Operator 目录。
与 SQLite 数据库格式相关的
opm
子命令、标志和功能已被弃用,并将在以后的版本中删除。功能仍被支持,且必须用于使用已弃用的 SQLite 数据库格式的目录。
许多
opm
子命令和标志都用于 SQLite 数据库格式,如
opm index prune
,它们无法使用基于文件的目录格式。有关使用基于文件的目录的更多信息,请参阅
Operator Framework 打包格式
,
管理自定义目录
,以及
使用 oc-mirror 插件为断开连接的安装 mirror 镜像
。
将目录源添加到 OpenShift Container Platform 集群可为用户发现和安装 Operator。集群管理员可以创建一个
CatalogSource
对象来引用索引镜像。OperatorHub 使用目录源来填充用户界面。
或者,您可以使用 Web 控制台管理目录源。在
Administration
→
Cluster Settings
→
Configuration
→
OperatorHub
页面中,点
Sources
选项卡,您可以在其中创建、更新、删除、禁用和启用单独的源。
构建并推送索引镜像到 registry。
您可以使用具有
cluster-admin
角色的用户访问集群。
创建一个
CatalogSource
对象来引用索引镜像。如果使用
oc adm catalog mirror
命令将目录镜像到目标 registry,您可以使用 manifests 目录中生成的
catalogSource.yaml
文件作为起点。
根据您的规格修改以下内容,并将它保存为
catalogSource.yaml
文件:
apiVersion: operators.coreos.com/v1alpha1
kind: CatalogSource
metadata:
name: my-operator-catalog 1
namespace: openshift-marketplace 2
spec:
sourceType: grpc
grpcPodConfig:
securityContextConfig: <security_mode> 3
image: <registry>/<namespace>/redhat-operator-index:v4.13 4
displayName: My Operator Catalog
publisher: <publisher_name> 5
updateStrategy:
registryPoll: 6
interval: 30m
-
1
-
如果您在上传到 registry 前将内容镜像到本地文件,请从
metadata.name
字段中删除任何反斜杠(
/
)字符,以避免在创建对象时出现 "invalid resource name" 错误。
如果您希望目录源对所有命名空间中的用户全局可用,请指定
openshift-marketplace
命名空间。否则,您可以指定一个不同的命名空间来对目录进行作用域并只对该命名空间可用。
指定
legacy
或
restricted
的值。如果没有设置该字段,则默认值为
legacy
。在以后的 OpenShift Container Platform 发行版本中,计划默认值为
restricted
。如果您的目录无法使用
restricted
权限运行,建议您手动将此字段设置为
legacy
。
指定索引镜像。如果您在镜像名称后指定了标签,如
:v4.13
,则目录源 Pod 会使用镜像 pull 策略
Always
,这意味着 pod 始终在启动容器前拉取镜像。如果您指定了摘要,如
@sha256:<id>
,则镜像拉取策略为
IfNotPresent
,这意味着仅在节点上不存在的镜像时才拉取镜像。
指定发布目录的名称或机构名称。
目录源可以自动检查新版本以保持最新。
使用该文件创建
CatalogSource
对象:
$ oc apply -f catalogSource.yaml
-
确定成功创建以下资源。
检查 pod:
$ oc get pods -n openshift-marketplace
当源类型
grpc
的 Operator Lifecycle Manager (OLM) 目录源定义
spec.image
时,Catalog Operator 会创建一个提供定义的镜像内容的 pod。默认情况下,此 pod 在规格中定义以下内容:
只有
kubernetes.io/os=linux
节点选择器。
默认优先级类名称:
system-cluster-critical
。
没有容限。
作为管理员,您可以通过修改
CatalogSource
对象的可选
spec.grpcPodConfig
部分中的字段来覆盖这些值。
Marketplace Operator
openshift-marketplace
负责管理默认的
OperatorHub
自定义资源 (CR)。此 CR 管理
CatalogSource
对象。如果您试图修改
CatalogSource
对象的
spec.grpcPodConfig
部分中的字段,则 Marketplace Operator 会自动恢复这些修改。默认情况下,如果您修改了
CatalogSource
对象的
spec.grpcPodConfig
部分中的字段,则 Marketplace Operator 会自动恢复这些更改。
要将持久性更改应用到
CatalogSource
对象,您必须首先禁用一个默认的
CatalogSource
对象。
OLM 概念和资源 → Catalog source
4.11.1. 在本地级别禁用默认 CatalogSource 对象
您可以通过禁用默认的
CatalogSource
对象,对
CatalogSource
对象(如目录源 pod)应用到本地级别。当默认
CatalogSource
对象的配置不符合您的机构需求时,请考虑默认配置。默认情况下,如果您修改
CatalogSource
对象的
spec.grpcPodConfig
部分中的字段,Marketplace Operator 会自动恢复这些更改。
Marketplace Operator
openshift-marketplace
负责管理
OperatorHub
的默认自定义资源 (CR)。
OperatorHub
管理
CatalogSource
对象。
要将持久性更改应用到
CatalogSource
对象,您必须首先禁用一个默认的
CatalogSource
对象。
要在本地级别禁用所有默认
CatalogSource
对象,请输入以下命令:
$ oc patch operatorhub cluster -p '{"spec": {"disableAllDefaultSources": true}}' --type=merge
4.11.3. 覆盖目录源 pod 的优先级类名称
先决条件
-
源类型的
CatalogSource
对象
,
定义了
spec.image
编辑
CatalogSource
对象并添加或修改
spec.grpcPodConfig
部分,使其包含以下内容:
grpcPodConfig:
priorityClassName: <priority_class>
其中
<priority_class>
是以下之一:
Kubernetes 提供的默认优先级类之一:
system-cluster-critical
或
system-node-critical
用于分配默认优先级的空集合 (
""
)
预先存在的和自定义优先级类
在以前的版本中,唯一可以被覆盖的 pod 调度参数是
priorityClassName
。这可以通过将
operatorframework.io/priorityclass
注解添加到
CatalogSource
对象来实现。例如:
apiVersion: operators.coreos.com/v1alpha1
kind: CatalogSource
metadata:
name: example-catalog
namespace: openshift-marketplace
annotations:
operatorframework.io/priorityclass: system-cluster-critical
如果
CatalogSource
对象同时定义了注解和
spec.grpcPodConfig.priorityClassName
,注解优先于配置参数。
Pod 优先级类
4.12. 管理平台 Operator (技术预览)
平台 Operator 是一个基于 OLM 的 Operator,可在 OpenShift Container Platform 集群的第 0 天操作期间或之后安装,并参与集群的生命周期。作为集群管理员,您可以使用
PlatformOperator
API 管理平台 Operator。
平台 Operator 类型只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅
技术预览功能支持范围
。
|
|
|
|
|
|
|