第 9 章 在受限网络中使用 Operator Lifecycle Manager
如果在受限网络中安装 OpenShift Container Platform,Operator Lifecycle Manager (OLM) 将不再使用默认的 OperatorHub 源,因为这类源需要足够的网络连接。集群管理员可禁用这些默认源并创建本地镜像,以便 OLM 从本地源安装和管理 Operator。
9.1. 针对受限网络配置 OperatorHub
集群管理员可对 OLM 和 OperatorHub 进行配置,以便在受限网络环境中使用本地内容。
先决条件
- 集群管理员访问 OpenShift Container Platform 集群及其内部 registry。
- 无网络限制的独立工作站。
- 如果向 OpenShift Container Platform 集群的内部 registry 推送镜像,则必须通过路由公开 registry。
-
podman
1.4.4+ 版
流程
禁用默认 OperatorSource。
将
disableAllDefaultSources: true
添加至 spec:$ oc patch OperatorHub cluster --type json \ -p '[{"op": "add", "path": "/spec/disableAllDefaultSources", "value": true}]'
该操作将禁用在 OpenShift Container Platform 安装期间默认配置的默认 OperatorSource。
获取软件包列表。
要获取默认 OperatorSource 可用的软件包列表,请在不受网络限制的情况下从工作站运行以下
curl
命令:$ curl https://quay.io/cnr/api/v1/packages?namespace=redhat-operators > packages.txt $ curl https://quay.io/cnr/api/v1/packages?namespace=community-operators >> packages.txt $ curl https://quay.io/cnr/api/v1/packages?namespace=certified-operators >> packages.txt
新
packages.txt
中的每个软件包均为一个 Operator,您可将其添加至您的受限网络目录中。在该列表中,您可拉取每个 Operator 或您想要向用户公开的子集。拉取 Operator 内容。
对于软件包列表中的给定 Operator,您必须拉取最新的内容:
$ curl https://quay.io/cnr/api/v1/packages/<namespace>/<operator_name>/<release>
本例使用 etcd Operator:
检索摘要:
$ curl https://quay.io/cnr/api/v1/packages/community-operators/etcd/0.0.12
从该 JSON 中获取摘要并用它拉取压缩存档:
$ curl -XGET https://quay.io/cnr/api/v1/packages/community-operators/etcd/blobs/sha256/8108475ee5e83a0187d6d0a729451ef1ce6d34c44a868a200151c36f3232822b \ -o etcd.tar.gz
要拉取信息,必须将存档文件与您需要的所有其他 Operator 一起解压缩至
manifests/<operator_name>/
目录中。例如,解压缩至名为manifests/etcd/
的现有目录:$ mkdir -p manifests/etcd/ 1 $ tar -xf etcd.tar.gz -C manifests/etcd/
- 1
- 为每个解压的归档创建不同的子目录,这样文件就不会被其他 Operator 的后续解压所覆盖了。
如有必要,请拆分
bundle.yaml
内容。在您的新
manifests/<operator_name>
目录中,目的是让捆绑包采用以下目录结构:manifests/ └── etcd ├── 0.0.12 │ ├── clusterserviceversion.yaml │ └── customresourcedefinition.yaml └── package.yaml
如果您的文件已采用该结构,则跳过这一步。而如果您只看到了一个名为
bundle.yaml
的文件,则必须先拆分该文件以确保与要求的结构一致。您必须将
data.clusterServiceVersion
下的 CSV 内容(列表中的每个文件)、data.customResourceDefinition
下的 CRD 内容(列表中的每个文件)和data.Package
下的软件包内容分开,放入各自文件中。要创建 CSV 文件,在
bundle.yaml
文件中找到以下行:data: clusterServiceVersions: |
省略这些行,但保存由完整 CSV 资源内容组成的新文件,用以下行开头,并删除前置
-
字符:clusterserviceversion.yaml
文件片断示例apiVersion: operators.coreos.com/v1alpha1 kind: ClusterServiceVersion [...]
要创建 CRD 文件,在
bundle.yaml
文件中找到以下行:customResourceDefinitions: |
省略该行,但保存由每个完整的 CRD 资源内容组成的新文件,用以下行开头,并删除前置
-
字符:customresourcedefinition.yaml
文件片断示例apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition [...]
要创建软件包文件,在
bundle.yaml
文件中找到以下行:packages: |
省略这一行,但保存由软件包内容组成的新文件,用以下行开头,删除前置
-
字符,并以packageName
条目结尾:package.yaml
文件示例channels: - currentCSV: etcdoperator.v0.9.4 name: singlenamespace-alpha - currentCSV: etcdoperator.v0.9.4-clusterwide name: clusterwide-alpha defaultChannel: singlenamespace-alpha packageName: etcd
识别您要使用的 Operator 所需的镜像。
检查每个 Operator 的 CSV 文件中的
image:
字段,以明确 Operator 所需镜像的 pull spec,并做好记录以供后续步骤使用。例如,在 etcd Operator CSV 的以下
deployments
spec 中:spec: serviceAccountName: etcd-operator containers: - name: etcd-operator command: - etcd-operator - --create-crd=false image: quay.io/coreos/etcd-operator@sha256:bd944a211eaf8f31da5e6d69e8541e7cada8f16a9f7a5a570b22478997819943 1 env: - name: MY_POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace - name: MY_POD_NAME valueFrom: fieldRef: fieldPath: metadata.name
- 1
- Operator 所需镜像。
创建 Operator 目录镜像。
将以下内容保存到某个 Dockerfile 中,如
custom-registry.Dockerfile
:FROM registry.redhat.io/openshift4/ose-operator-registry:v4.2.24 AS builder COPY manifests manifests RUN /bin/initializer -o ./bundles.db FROM registry.access.redhat.com/ubi7/ubi COPY --from=builder /registry/bundles.db /bundles.db COPY --from=builder /usr/bin/registry-server /registry-server COPY --from=builder /bin/grpc_health_probe /bin/grpc_health_probe EXPOSE 50051 ENTRYPOINT ["/registry-server"] CMD ["--database", "bundles.db"]
使用
podman
命令从 Dockerfile 中创建和标记容器镜像:$ podman build -f custom-registry.Dockerfile \ -t <local_registry_host_name>:<local_registry_host_port>/<namespace>/custom-registry 1
- 1
- 为受限网络 OpenShift Container Platform 集群和任何命名空间的内部 registry 标记镜像。
将 Operator 目录镜像推送至 registry。
您的新 Operator 目录镜像必须推送至受限网络 OpenShift Container Platform 集群可访问的 registry 中。该 registry 可以是集群本身的内部 registry,也可以是集群可通过网络访问的另一 registry,如内部部署的 Quay Enterprise registry。
在本例中,需登录并推送该镜像至内部 registry OpenShift Container Platform 集群:
$ podman push <local_registry_host_name>:<local_registry_host_port>/<namespace>/custom-registry
创建指向新 Operator 目录镜像的 CatalogSource。
将以下内容保存到文件中,如
my-operator-catalog.yaml
中:apiVersion: operators.coreos.com/v1alpha1 kind: CatalogSource metadata: name: my-operator-catalog namespace: openshift-marketplace spec: displayName: My Operator Catalog sourceType: grpc image: <local_registry_host_name>:<local_registry_host_port>/<namespace>/custom-registry:latest
创建 CatalogSource 资源:
$ oc create -f my-operator-catalog.yaml
验证 CatalogSource 和软件包清单是否已创建成功:
# 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 etcd My Operator Catalog 34s
此外,您还可在 Web 控制台的 OperatorHub 页面中查看这些内容。
对您要使用的 Operator 所需的镜像制作镜像。
确定您所期望的 Operator 定义的镜像。本例使用 etcd Operator,需要
quay.io/coreos/etcd-operator
镜像。重要该流程仅显示被镜像(mirror)的 Operator 镜像本身,而非 Operand 镜像(受 Operator 管理的组件)。Operand 镜像必须被镜像(mirror);查看各个 Operator 的文档以识别所需的 Operand 镜像。
要使用被镜像的镜像,您必须首先为每个镜像创建一个 ImageContentSourcePolicy 来更改 Operator 目录镜像的源位置。例如:
apiVersion: operator.openshift.io/v1alpha1 kind: ImageContentSourcePolicy metadata: name: etcd-operator spec: repositoryDigestMirrors: - mirrors: - <local_registry_host_name>:<local_registry_host_port>/coreos/etcd-operator source: quay.io/coreos/etcd-operator
在不受网络限制的情况下,从工作站使用
oc image mirror
命令,将镜像从源 registry 中拉取出来,并推送至内部 registry,而不存储在本地:$ oc image mirror quay.io/coreos/etcd-operator \ <local_registry_host_name>:<local_registry_host_port>/coreos/etcd-operator
现在,您可在受限网络 OpenShift Container Platform 集群上从 OperatorHub 中安装 Operator。
其他资源
- 有关将 OpenShift Container Platform 集群的内部 registry 公开至集群外访问权限的详细信息请参阅公开 registry。
- 有关访问内部 registry 的详细信息,请参阅访问 registry。