第 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}]'
    Copy to Clipboard Toggle word wrap

    该操作将禁用在 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
    Copy to Clipboard Toggle word wrap

    packages.txt 中的每个软件包均为一个 Operator,您可将其添加至您的受限网络目录中。在该列表中,您可拉取每个 Operator 或您想要向用户公开的子集。

  3. 拉取 Operator 内容。

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

    $ curl https://quay.io/cnr/api/v1/packages/<namespace>/<operator_name>/<release>
    Copy to Clipboard Toggle word wrap

    本例使用 etcd Operator:

    1. 检索摘要:

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

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

      $ mkdir -p manifests/etcd/ 
      1
      
      $ tar -xf etcd.tar.gz -C manifests/etcd/
      Copy to Clipboard Toggle word wrap
      1
      为每个解压的归档创建不同的子目录,这样文件就不会被其他 Operator 的后续解压所覆盖了。
  4. 如有必要,请拆分 bundle.yaml 内容。

    在您的新 manifests/<operator_name> 目录中,目的是让捆绑包采用以下目录结构:

    manifests/
    └── etcd
        ├── 0.0.12
        │   ├── clusterserviceversion.yaml
        │   └── customresourcedefinition.yaml
        └── package.yaml
    Copy to Clipboard Toggle word wrap

    如果您的文件已采用该结构,则跳过这一步。而如果您只看到了一个名为 bundle.yaml 的文件,则必须先拆分该文件以确保与要求的结构一致。

    您必须将 data.clusterServiceVersion 下的 CSV 内容(列表中的每个文件)、data.customResourceDefinition 下的 CRD 内容(列表中的每个文件)和 data.Package 下的软件包内容分开,放入各自文件中。

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

      data:
        clusterServiceVersions: |
      Copy to Clipboard Toggle word wrap

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

      clusterserviceversion.yaml 文件片断示例

      apiVersion: operators.coreos.com/v1alpha1
      kind: ClusterServiceVersion
      [...]
      Copy to Clipboard Toggle word wrap

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

        customResourceDefinitions: |
      Copy to Clipboard Toggle word wrap

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

      customresourcedefinition.yaml 文件片断示例

      apiVersion: apiextensions.k8s.io/v1beta1
      kind: CustomResourceDefinition
      [...]
      Copy to Clipboard Toggle word wrap

    3. 要创建软件包文件,在 bundle.yaml 文件中找到以下行:

        packages: |
      Copy to Clipboard Toggle word wrap

      省略这一行,但保存由软件包内容组成的新文件,用以下行开头,删除前置 - 字符,并以 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
      Copy to Clipboard Toggle word wrap

  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
    Copy to Clipboard Toggle word wrap
    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"]
      Copy to Clipboard Toggle word wrap
    2. 使用 podman 命令从 Dockerfile 中创建和标记容器镜像:

      $ podman build -f custom-registry.Dockerfile \
          -t <local_registry_host_name>:<local_registry_host_port>/<namespace>/custom-registry 
      1
      Copy to Clipboard Toggle word wrap
      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
    Copy to Clipboard Toggle word wrap
  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
      Copy to Clipboard Toggle word wrap
    2. 创建 CatalogSource 资源:

      $ oc create -f my-operator-catalog.yaml
      Copy to Clipboard Toggle word wrap
    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
      Copy to Clipboard Toggle word wrap

      此外,您还可在 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
      Copy to Clipboard Toggle word wrap
    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
      Copy to Clipboard Toggle word wrap

现在,您可在受限网络 OpenShift Container Platform 集群上从 OperatorHub 中安装 Operator。

其他资源

  • 有关将 OpenShift Container Platform 集群的内部 registry 公开至集群外访问权限的详细信息请参阅公开 registry
  • 有关访问内部 registry 的详细信息,请参阅访问 registry
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat