第 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+ 版

流程

  1. 禁用默认 OperatorSource。

    disableAllDefaultSources: true 添加至 spec:

    $ oc patch OperatorHub cluster --type json \
        -p '[{"op": "add", "path": "/spec/disableAllDefaultSources", "value": true}]'

    该操作将禁用在 OpenShift Container Platform 安装期间默认配置的默认 OperatorSource。

  2. 获取软件包列表。

    要获取默认 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 或您想要向用户公开的子集。

  3. 拉取 Operator 内容。

    对于软件包列表中的给定 Operator,您必须拉取最新的内容:

    $ curl https://quay.io/cnr/api/v1/packages/<namespace>/<operator_name>/<release>

    本例使用 etcd Operator:

    1. 检索摘要:

      $ curl https://quay.io/cnr/api/v1/packages/community-operators/etcd/0.0.12
    2. 从该 JSON 中获取摘要并用它拉取压缩存档:

      $ curl -XGET https://quay.io/cnr/api/v1/packages/community-operators/etcd/blobs/sha256/8108475ee5e83a0187d6d0a729451ef1ce6d34c44a868a200151c36f3232822b \
          -o etcd.tar.gz
    3. 要拉取信息,必须将存档文件与您需要的所有其他 Operator 一起解压缩至 manifests/<operator_name>/ 目录中。例如,解压缩至名为 manifests/etcd/ 的现有目录:

      $ mkdir -p manifests/etcd/ 1
      $ tar -xf etcd.tar.gz -C manifests/etcd/
      1
      为每个解压的归档创建不同的子目录,这样文件就不会被其他 Operator 的后续解压所覆盖了。
  4. 如有必要,请拆分 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 下的软件包内容分开,放入各自文件中。

    1. 要创建 CSV 文件,在 bundle.yaml 文件中找到以下行:

      data:
        clusterServiceVersions: |

      省略这些行,但保存由完整 CSV 资源内容组成的新文件,用以下行开头,并删除前置 - 字符:

      clusterserviceversion.yaml 文件片断示例

      apiVersion: operators.coreos.com/v1alpha1
      kind: ClusterServiceVersion
      [...]

    2. 要创建 CRD 文件,在 bundle.yaml 文件中找到以下行:

        customResourceDefinitions: |

      省略该行,但保存由每个完整的 CRD 资源内容组成的新文件,用以下行开头,并删除前置 - 字符:

      customresourcedefinition.yaml 文件片断示例

      apiVersion: apiextensions.k8s.io/v1beta1
      kind: CustomResourceDefinition
      [...]

    3. 要创建软件包文件,在 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

  5. 识别您要使用的 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 所需镜像。
  6. 创建 Operator 目录镜像。

    1. 将以下内容保存到某个 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"]
    2. 使用 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 标记镜像。
  7. 将 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
  8. 创建指向新 Operator 目录镜像的 CatalogSource。

    1. 将以下内容保存到文件中,如 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
    2. 创建 CatalogSource 资源:

      $ oc create -f my-operator-catalog.yaml
    3. 验证 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 页面中查看这些内容。

  9. 对您要使用的 Operator 所需的镜像制作镜像。

    1. 确定您所期望的 Operator 定义的镜像。本例使用 etcd Operator,需要 quay.io/coreos/etcd-operator 镜像。

      重要

      该流程仅显示被镜像(mirror)的 Operator 镜像本身,而非 Operand 镜像(受 Operator 管理的组件)。Operand 镜像必须被镜像(mirror);查看各个 Operator 的文档以识别所需的 Operand 镜像。

    2. 要使用被镜像的镜像,您必须首先为每个镜像创建一个 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
    3. 在不受网络限制的情况下,从工作站使用 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
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.