4.8. 管理自定义目录
本指南论述了如何使用 OpenShift Container Platform 中的 Operator Lifecycle Manager(OLM)上的捆绑包格式(bundle format) 进行打包的 Operator 的自定义目录。
OpenShift Container Platform 4.8 及之后的版本中删除了对 Operator 的传统软件包清单格式的支持,包括使用传统格式的自定义目录。
Kubernetes 定期弃用后续版本中删除的某些 API。因此,从使用删除 API 的 Kubernetes 版本的 OpenShift Container Platform 版本开始,Operator 无法使用删除 API 的 API。
如果您的集群使用自定义目录,请参阅控制 Operator 与 OpenShift Container Platform 版本的兼容性,以了解更多有关 Operator 作者如何更新其项目的详细信息,以帮助避免工作负载问题并防止不兼容的升级。
其他资源
4.8.1. 先决条件
-
安装
opm
CLI。
4.8.2. 创建索引镜像
您可以使用 opm
CLI 创建索引镜像。
先决条件
-
opm
版本 1.12.3+ -
podman
版本 1.9.3+ 构建并推送到支持 Docker v2-2 的 registry 的捆绑包镜像
重要OpenShift Container Platform 集群的内部 registry 不能用作目标 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
将索引镜像推送到 registry。
如果需要,与目标 registry 进行身份验证:
$ podman login <registry>
推送索引镜像:
$ podman push <registry>/<namespace>/<index_image_name>:<tag>
4.8.3. 从索引镜像创建目录
您可以从索引镜像创建 Operator 目录,并将其应用到 OpenShift Container Platform 集群,供 Operator Lifecycle Manager(OLM)使用。
先决条件
- 构建并推送到 registry 的索引镜像。
流程
创建一个
CatalogSource
对象来引用索引镜像。根据您的规格修改以下内容,并将它保存为
catalogSource.yaml
文件:apiVersion: operators.coreos.com/v1alpha1 kind: CatalogSource metadata: name: my-operator-catalog namespace: openshift-marketplace 1 spec: sourceType: grpc image: <registry>:<port>/<namespace>/redhat-operator-index:v4.8 2 displayName: My Operator Catalog publisher: <publisher_name> 3 updateStrategy: registryPoll: 4 interval: 30m
使用该文件创建
CatalogSource
对象:$ oc apply -f catalogSource.yaml
确定成功创建以下资源。
检查 pod:
$ oc get pods -n openshift-marketplace
输出示例
NAME READY STATUS RESTARTS AGE my-operator-catalog-6njx6 1/1 Running 0 28s marketplace-operator-d9f549946-96sgr 1/1 Running 0 26h
检查目录源:
$ oc get catalogsource -n openshift-marketplace
输出示例
NAME DISPLAY TYPE PUBLISHER AGE my-operator-catalog My Operator Catalog grpc 5s
检查软件包清单:
$ oc get packagemanifest -n openshift-marketplace
输出示例
NAME CATALOG AGE jaeger-product My Operator Catalog 93s
现在,您可以在 OpenShift Container Platform Web 控制台中通过 OperatorHub 安装 Operator。
其他资源
- 如果您的索引镜像托管在私有 registry 上且需要进行身份验证,请参阅 从私有 registry 访问 Operator 的镜像。
4.8.4. 更新索引镜像
在将 OperatorHub 配置为使用引用自定义索引镜像的目录源后,集群管理员可通过将捆绑包镜像添加到索引镜像来保持其集群上的可用 Operator 最新状态。
您可以使用 opm index add
命令来更新存在的索引镜像。
先决条件
-
opm
版本 1.12.3+ -
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
其中:
<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.8
。 <updated_tag>
-
指定要应用到更新的索引镜像的镜像标签,如
4.8.1
。
示例命令
$ opm index add \ --bundles quay.io/ocs-dev/ocs-operator@sha256:c7f11097a628f092d8bad148406aa0e0951094a03445fd4bc0775431ef683a41 \ --from-index mirror.example.com/abc/abc-redhat-operator-index:4.8 \ --tag mirror.example.com/abc/abc-redhat-operator-index:4.8.1 \ --pull-tool podman
推送更新的索引镜像:
$ podman push <registry>/<namespace>/<existing_index_image>:<updated_tag>
Operator Lifecycle Manager(OLM)会在常规时间段内自动轮询目录源中引用的索引镜像,验证是否已成功添加新软件包:
$ oc get packagemanifests -n openshift-marketplace
4.8.5. 修剪索引镜像
基于 Operator Bundle Format 的索引镜像是 Operator 目录的容器化快照。您可以修剪除指定的软件包列表以外的所有索引,创建只包含您想要的 Operator 的源索引副本。
先决条件
-
podman
版本 1.9.3+ -
grpcurl
(第三方命令行工具) -
opm
版本 1.18.0+ 访问支持 Docker v2-2 的 registry
重要OpenShift Container Platform 集群的内部 registry 不能用作目标 registry,因为它不支持没有标签的推送(在镜像过程中需要这个功能)。
流程
通过目标 registry 进行身份验证:
$ podman login <target_registry>
确定您要包括在您的修剪索引中的软件包列表。
运行您要修剪容器中的源索引镜像。例如:
$ podman run -p50051:50051 \ -it registry.redhat.io/redhat/redhat-operator-index:v4.8
输出示例
Trying to pull registry.redhat.io/redhat/redhat-operator-index:v4.8... Getting image source signatures Copying blob ae8a0c23f5b1 done ... INFO[0000] serving registry database=/database/index.db port=50051
在一个单独的终端会话中,使用
grpcurl
命令获取由索引提供的软件包列表:$ grpcurl -plaintext localhost:50051 api.Registry/ListPackages > packages.out
检查
package.out
文件,确定要保留在此列表中的哪个软件包名称。例如:软件包列表片断示例
... { "name": "advanced-cluster-management" } ... { "name": "jaeger-product" } ... { { "name": "quay-operator" } ...
-
在您执行
podman run
命令的终端会话中,按 Ctrl 和 C 停止容器进程。
运行以下命令来修剪指定软件包以外的所有源索引:
$ opm index prune \ -f registry.redhat.io/redhat/redhat-operator-index:v4.8 \1 -p advanced-cluster-management,jaeger-product,quay-operator \2 [-i registry.redhat.io/openshift4/ose-operator-registry:v4.8] \3 -t <target_registry>:<port>/<namespace>/redhat-operator-index:v4.8 4
运行以下命令将新索引镜像推送到目标 registry:
$ podman push <target_registry>:<port>/<namespace>/redhat-operator-index:v4.8
其中
<namespace>
是 registry 上的任何现有命名空间。
4.8.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 镜像。
流程
为每个必需的私有 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 存储凭证的文件
{ "auths": { "registry.redhat.io": { "auth": "FrNHNydQXdzclNqdg==" }, "quay.io": { "auth": "Xd2lhdsbnRib21iMQ==" } } }
由于此文件用于后续步骤中创建 secret,请确保为每个文件只存储一个 registry 的详情。这可使用以下方法之一完成:
-
使用
podman logout <registry>
命令为额外 registry 删除凭证,直到您只保留一个 registry。 编辑 registry 凭证文件,将 registry 详情分开以存储在多个文件中。例如:
为一个 registry 存储凭证的文件
{ "auths": { "registry.redhat.io": { "auth": "FrNHNydQXdzclNqdg==" } } }
为另一个 registry 存储凭证的文件
{ "auths": { "quay.io": { "auth": "Xd2lhdsbnRib21iMQ==" } } }
-
使用
在
openshift-marketplace
命名空间中创建 secret,其中包含私有 registry 的身份验证凭证:$ oc create secret generic <secret_name> \ -n openshift-marketplace \ --from-file=.dockerconfigjson=<path/to/registry/credentials> \ --type=kubernetes.io/dockerconfigjson
重复此步骤,为任何其他需要的私有 registry 创建额外的 secret,更新
--from-file
标志以指定另一个 registry 凭证文件路径。
创建或更新现有的
CatalogSource
对象以引用一个或多个 secret:apiVersion: operators.coreos.com/v1alpha1 kind: CatalogSource metadata: name: my-operator-catalog namespace: openshift-marketplace spec: sourceType: grpc secrets: 1 - "<secret_name_1>" - "<secret_name_2>" image: <registry>:<port>/<namespace>/<image>:<tag> displayName: My Operator Catalog publisher: <publisher_name> updateStrategy: registryPoll: interval: 30m
- 1
- 添加
spec.secrets
部分并指定任何所需 secret。
如果订阅的 Operator 引用的任何 Operator 或 Operand 镜像需要访问私有 registry,您可以提供对集群中的所有命名空间或单独的目标租户命名空间的访问。
要访问集群中的所有命名空间,请将身份验证详情添加到
openshift-config
命名空间中的全局集群 pull secret 中。警告集群资源必须调整为新的全局 pull secret,这样可暂时限制集群的可用性。
从全局 pull secret 中提取
.dockerconfigjson
文件:$ oc extract secret/pull-secret -n openshift-config --confirm
使用所需私有 registry 或 registry 的身份验证凭证更新
.dockerconfigjson
文件,并将它保存为新文件:$ cat .dockerconfigjson | \ jq --compact-output '.auths["<registry>:<port>/<namespace>/"] |= . + {"auth":"<token>"}' \1 > new_dockerconfigjson
- 1
- 将
<registry>:<port> /<namespace>
替换为私有 registry 的详情,将<token>
替换为您的身份验证凭证。
使用新文件更新全局 pull secret:
$ oc set data secret/pull-secret -n openshift-config \ --from-file=.dockerconfigjson=new_dockerconfigjson
要更新单个命名空间,请向 Operator 的服务帐户添加一个 pull secret,以便在目标租户命名空间中访问该 Operator。
在租户命名空间中为
openshift-marketplace
重新创建 secret:$ oc create secret generic <secret_name> \ -n <tenant_namespace> \ --from-file=.dockerconfigjson=<path/to/registry/credentials> \ --type=kubernetes.io/dockerconfigjson
通过搜索租户命名空间来验证 Operator 的服务帐户名称:
$ oc get sa -n <tenant_namespace> 1
- 1
- 如果 Operator 安装在单独的命名空间中,请搜索该命名空间。如果 Operator 已为所有命名空间安装,请搜索
openshift-operators
命名空间。
输出示例
NAME SECRETS AGE builder 2 6m1s default 2 6m1s deployer 2 6m1s etcd-operator 2 5m18s 1
- 1
- 已安装的 etcd Operator 的服务帐户。
将 secret 链接到 Operator 的服务帐户:
$ oc secrets link <operator_sa> \ -n <tenant_namespace> \ <secret_name> \ --for=pull
其他资源
- 如需了解更多与 secret 相关的信息,包括用于 registry 凭证的 secret 类型的信息,请参阅什么是 secret?
- 如需了解有关更改此 secret 的影响的更多详细信息,请参阅更新全局集群 pull secret。
- 如需了解更多有关将 pull secret 链接到每个命名空间的服务帐户的详情,请参阅允许 Pod 引用其他安全 registry 中的镜像。
4.8.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
4.8.8. 删除自定义目录
作为集群管理员,您可以删除之前添加到集群中的自定义 Operator 目录,方法是删除相关的目录源。
流程
-
在 Web 控制台的 Administrator 视角中,导航至 Administration
Cluster Settings。 - 点 Global Configuration 选项卡,然后点 OperatorHub。
- 点 Sources 选项卡。
- 选择您要删除的目录的 Options 菜单 ,然后点 Delete CatalogSource。