×

在某些情况下,您可能需要将 OpenShift Container Platform 集群从连接集群转换为断开连接的集群。

断开连接的集群,也称为受限集群,没有与互联网的活动连接。因此,您必须镜像注册表和安装介质的内容。您可以在可以访问互联网和封闭网络的主机上创建此镜像注册表,或者将镜像复制到可以在网络边界之间移动的设备上。

本主题描述了将现有连接集群转换为断开连接集群的常规流程。

关于镜像注册表

您可以将 OpenShift Container Platform 安装和后续产品更新所需的镜像镜像到容器镜像注册表,例如 Red Hat Quay、JFrog Artifactory、Sonatype Nexus Repository 或 Harbor。如果您无法访问大型容器注册表,则可以使用 *Red Hat OpenShift 的镜像注册表*,这是一个包含在 OpenShift Container Platform 订阅中的小型容器注册表。

您可以使用任何支持 Docker v2-2 的容器注册表,例如 Red Hat Quay、*Red Hat OpenShift 的镜像注册表*、Artifactory、Sonatype Nexus Repository 或 Harbor。无论您选择哪个注册表,将内容从 Red Hat 托管的互联网站点镜像到隔离的镜像注册表的流程都是相同的。镜像内容后,您可以配置每个集群以从您的镜像注册表检索此内容。

OpenShift 镜像注册表不能用作目标注册表,因为它不支持在镜像过程中所需的无标签推送。

如果选择不是 *Red Hat OpenShift 的镜像注册表* 的容器注册表,则您配置的集群中的每一台机器都必须能够访问它。如果注册表不可访问,则安装、更新或正常的操作(例如工作负载迁移)可能会失败。因此,您必须以高可用性的方式运行镜像注册表,并且镜像注册表至少必须与您的 OpenShift Container Platform 集群的生产可用性相匹配。

使用 OpenShift Container Platform 镜像填充镜像注册表时,您可以遵循两种方案。如果您有一台主机既可以访问互联网和镜像注册表,又无法访问集群节点,则可以直接从该主机镜像内容。此过程称为 *连接镜像*。如果您没有这样的主机,则必须将镜像镜像到文件系统,然后将该主机或可移动介质带入您的受限环境。此过程称为 *断开连接镜像*。

对于镜像注册表,要查看已拉取镜像的来源,您必须查看 CRI-O 日志中的 尝试访问 日志条目。其他查看镜像拉取源的方法(例如在节点上使用 crictl images 命令)会显示未镜像的镜像名称,即使镜像是从镜像位置拉取的。

Red Hat 不对与 OpenShift Container Platform 一起使用的第三方注册表进行测试。

先决条件

准备集群以进行镜像

断开集群连接之前,您必须将镜像镜像或复制到断开连接的集群中的每个节点都可以访问的镜像注册表。为了镜像镜像,您必须通过以下方式准备集群:

  • 将镜像注册表的证书添加到主机上的受信任 CA 列表中。

  • 创建一个包含镜像拉取密钥(来自 cloud.openshift.com 令牌)的 .dockerconfigjson 文件。

步骤
  1. 配置允许镜像镜像的凭据

    1. 将镜像注册表的 CA 证书(采用简单的 PEM 或 DER 文件格式)添加到受信任的 CA 列表中。例如:

      $ cp </path/to/cert.crt> /usr/share/pki/ca-trust-source/anchors/
      其中
      </path/to/cert.crt>

      指定证书在本地文件系统中的路径。

    2. 更新 CA 信任。例如,在 Linux 中:

      $ update-ca-trust
    3. 从全局拉取密钥中提取 .dockerconfigjson 文件

      $ oc extract secret/pull-secret -n openshift-config --confirm --to=.
      示例输出
      .dockerconfigjson
    4. 编辑 .dockerconfigjson 文件以添加镜像注册表和身份验证凭据,并将其另存为新文件

      {"auths":{"<local_registry>": {"auth": "<credentials>","email": "[email protected]"}}},"<registry>:<port>/<namespace>/":{"auth":"<token>"}}}

      其中

      <local_registry>

      指定镜像注册表用于提供内容的注册表域名,以及可选的端口。

      auth

      指定镜像注册表的 base64 编码用户名和密码。

      <registry>:<port>/<namespace>

      指定镜像注册表详细信息。

      <token>

      指定镜像注册表的 base64 编码 username:password

      例如

      $ {"auths":{"cloud.openshift.com":{"auth":"b3BlbnNoaWZ0Y3UjhGOVZPT0lOMEFaUjdPUzRGTA==","email":"[email protected]"},
      "quay.io":{"auth":"b3BlbnNoaWZ0LXJlbGVhc2UtZGOVZPT0lOMEFaUGSTd4VGVGVUjdPUzRGTA==","email":"[email protected]"},
      "registry.connect.redhat.com"{"auth":"NTE3MTMwNDB8dWhjLTFEZlN3VHkxOSTd4VGVGVU1MdTpleUpoYkdjaUailA==","email":"[email protected]"},
      "registry.redhat.io":{"auth":"NTE3MTMwNDB8dWhjLTFEZlN3VH3BGSTd4VGVGVU1MdTpleUpoYkdjaU9fZw==","email":"[email protected]"},
      "registry.svc.ci.openshift.org":{"auth":"dXNlcjpyWjAwWVFjSEJiT2RKVW1pSmg4dW92dGp1SXRxQ3RGN1pwajJhN1ZXeTRV"},"my-registry:5000/my-namespace/":{"auth":"dXNlcm5hbWU6cGFzc3dvcmQ="}}}

镜像镜像

正确配置集群后,您可以将镜像从外部存储库镜像到镜像存储库。

步骤
  1. 镜像 Operator Lifecycle Manager (OLM) 镜像

    $ oc adm catalog mirror registry.redhat.io/redhat/redhat-operator-index:v{product-version} <mirror_registry>:<port>/olm -a <reg_creds>

    其中

    product-version

    指定与要安装的 OpenShift Container Platform 版本相对应的标签,例如 4.8

    mirror_registry

    指定要将 Operator 内容镜像到的目标注册表的完全限定域名 (FQDN) 和命名空间,其中 <namespace> 是注册表上的任何现有命名空间。

    reg_creds

    指定修改后的 .dockerconfigjson 文件的位置。

    例如

    $ oc adm catalog mirror registry.redhat.io/redhat/redhat-operator-index:v4.8 mirror.registry.com:443/olm -a ./.dockerconfigjson  --index-filter-by-os='.*'
  2. 镜像任何其他 Red Hat 提供的 Operator 的内容

    $ oc adm catalog mirror <index_image> <mirror_registry>:<port>/<namespace> -a <reg_creds>

    其中

    index_image

    指定要镜像的目录的索引镜像。

    mirror_registry

    指定要将 Operator 内容镜像到的目标注册表的 FQDN 和命名空间,其中 <namespace> 是注册表上的任何现有命名空间。

    reg_creds

    可选:如果需要,指定注册表凭据文件的位置。

    例如

    $ oc adm catalog mirror registry.redhat.io/redhat/community-operator-index:v4.8 mirror.registry.com:443/olm -a ./.dockerconfigjson  --index-filter-by-os='.*'
  3. 镜像 OpenShift Container Platform 镜像存储库

    $ oc adm release mirror -a .dockerconfigjson --from=quay.io/openshift-release-dev/ocp-release:v<product-version>-<architecture> --to=<local_registry>/<local_repository> --to-release-image=<local_registry>/<local_repository>:v<product-version>-<architecture>

    其中

    product-version

    指定与要安装的 OpenShift Container Platform 版本相对应的标签,例如 4.8.15-x86_64

    architecture

    指定服务器的架构类型,例如 x86_64

    local_registry

    指定镜像存储库的注册表域名。

    本地镜像仓库

    指定要在您的注册表中创建的仓库名称,例如 ocp4/openshift4

    例如

    $ oc adm release mirror -a .dockerconfigjson --from=quay.io/openshift-release-dev/ocp-release:4.8.15-x86_64 --to=mirror.registry.com:443/ocp/release --to-release-image=mirror.registry.com:443/ocp/release:4.8.15-x86_64
    示例输出
    info: Mirroring 109 images to mirror.registry.com/ocp/release ...
    mirror.registry.com:443/
      ocp/release
    	manifests:
      	sha256:086224cadce475029065a0efc5244923f43fb9bb3bb47637e0aaf1f32b9cad47 -> 4.8.15-x86_64-thanos
      	sha256:0a214f12737cb1cfbec473cc301aa2c289d4837224c9603e99d1e90fc00328db -> 4.8.15-x86_64-kuryr-controller
      	sha256:0cf5fd36ac4b95f9de506623b902118a90ff17a07b663aad5d57c425ca44038c -> 4.8.15-x86_64-pod
      	sha256:0d1c356c26d6e5945a488ab2b050b75a8b838fc948a75c0fa13a9084974680cb -> 4.8.15-x86_64-kube-client-agent
    
    …..
    sha256:66e37d2532607e6c91eedf23b9600b4db904ce68e92b43c43d5b417ca6c8e63c mirror.registry.com:443/ocp/release:4.5.41-multus-admission-controller
    sha256:d36efdbf8d5b2cbc4dcdbd64297107d88a31ef6b0ec4a39695915c10db4973f1 mirror.registry.com:443/ocp/release:4.5.41-cluster-kube-scheduler-operator
    sha256:bd1baa5c8239b23ecdf76819ddb63cd1cd6091119fecdbf1a0db1fb3760321a2 mirror.registry.com:443/ocp/release:4.5.41-aws-machine-controllers
    info: Mirroring completed in 2.02s (0B/s)
    
    Success
    Update image:  mirror.registry.com:443/ocp/release:4.5.41-x86_64
    Mirror prefix: mirror.registry.com:443/ocp/release
  4. 根据需要镜像其他注册表

    $ oc image mirror <online_registry>/my/image:latest <mirror_registry>
附加资源

配置集群以使用镜像注册表

创建镜像并将其镜像到镜像注册表后,必须修改集群,以便 Pod 可以从镜像注册表拉取镜像。

您必须

  • 将镜像注册表凭据添加到全局拉取密钥。

  • 将镜像注册表服务器证书添加到集群。

  • 创建ImageContentSourcePolicy 自定义资源 (ICSP),它将镜像注册表与源注册表关联。

    1. 将镜像注册表凭据添加到集群全局拉取密钥

      $ oc set data secret/pull-secret -n openshift-config --from-file=.dockerconfigjson=<pull_secret_location> (1)
      1 提供新的拉取密钥文件的路径。

      例如

      $ oc set data secret/pull-secret -n openshift-config --from-file=.dockerconfigjson=.mirrorsecretconfigjson
    2. 将 CA 签名的镜像注册表服务器证书添加到集群中的节点

      1. 创建一个包含镜像注册表服务器证书的 ConfigMap。

        $ oc create configmap <config_map_name> --from-file=<mirror_address_host>..<port>=$path/ca.crt -n openshift-config

        例如

        S oc create configmap registry-config --from-file=mirror.registry.com..443=/root/certs/ca-chain.cert.pem -n openshift-config
      2. 使用 ConfigMap 更新image.config.openshift.io/cluster 自定义资源 (CR)。OpenShift Container Platform 会将这些更改应用于集群中的所有节点。

        $ oc patch image.config.openshift.io/cluster --patch '{"spec":{"additionalTrustedCA":{"name":"<config_map_name>"}}}' --type=merge

        例如

        $ oc patch image.config.openshift.io/cluster --patch '{"spec":{"additionalTrustedCA":{"name":"registry-config"}}}' --type=merge
    3. 创建一个 ICSP 以将容器拉取请求从在线注册表重定向到镜像注册表

      1. 创建ImageContentSourcePolicy 自定义资源

        apiVersion: operator.openshift.io/v1alpha1
        kind: ImageContentSourcePolicy
        metadata:
          name: mirror-ocp
        spec:
          repositoryDigestMirrors:
          - mirrors:
            - mirror.registry.com:443/ocp/release (1)
            source: quay.io/openshift-release-dev/ocp-release (2)
          - mirrors:
            - mirror.registry.com:443/ocp/release
            source: quay.io/openshift-release-dev/ocp-v4.0-art-dev
        1 指定镜像镜像注册表和仓库的名称。
        2 指定包含已镜像内容的在线注册表和仓库。
      2. 创建 ICSP 对象

        $ oc create -f registryrepomirror.yaml
        示例输出
        imagecontentsourcepolicy.operator.openshift.io/mirror-ocp created

        OpenShift Container Platform 会将这些更改应用于集群中的所有节点。

    4. 验证是否已添加镜像注册表的凭据、CA 和 ICSP

      1. 登录到一个节点

        $ oc debug node/<node_name>
      2. 在调试 shell 中将/host设置为根目录

        sh-4.4# chroot /host
      3. 检查config.json文件中的凭据

        sh-4.4# cat /var/lib/kubelet/config.json
        示例输出
        {"auths":{"brew.registry.redhat.io":{"xx=="},"brewregistry.stage.redhat.io":{"auth":"xxx=="},"mirror.registry.com:443":{"auth":"xx="}}} (1)
        
        1 确保镜像注册表和凭据存在。
      4. 更改到certs.d目录

        sh-4.4# cd /etc/docker/certs.d/
      5. 列出certs.d目录中的证书

        sh-4.4# ls
        示例输出
        image-registry.openshift-image-registry.svc.cluster.local:5000
        image-registry.openshift-image-registry.svc:5000
        mirror.registry.com:443 (1)
        1 确保镜像注册表在列表中。
      6. 检查 ICSP 是否已将镜像注册表添加到registries.conf文件

        sh-4.4# cat /etc/containers/registries.conf
        示例输出
        unqualified-search-registries = ["registry.access.redhat.com", "docker.io"]
        
        [[registry]]
          prefix = ""
          location = "quay.io/openshift-release-dev/ocp-release"
          mirror-by-digest-only = true
        
          [[registry.mirror]]
            location = "mirror.registry.com:443/ocp/release"
        
        [[registry]]
          prefix = ""
          location = "quay.io/openshift-release-dev/ocp-v4.0-art-dev"
          mirror-by-digest-only = true
        
          [[registry.mirror]]
            location = "mirror.registry.com:443/ocp/release"

        registry.mirror参数指示在原始注册表之前搜索镜像注册表。

      7. 退出节点。

        sh-4.4# exit

确保应用程序继续运行

在将集群与网络断开连接之前,请确保您的集群按预期运行,并且所有应用程序都按预期运行。

步骤

使用以下命令检查集群的状态

  • 确保您的 Pod 正在运行

    $ oc get pods --all-namespaces
    示例输出
    NAMESPACE                                          NAME                                                          READY   STATUS      RESTARTS   AGE
    kube-system                                        apiserver-watcher-ci-ln-47ltxtb-f76d1-mrffg-master-0          1/1     Running     0          39m
    kube-system                                        apiserver-watcher-ci-ln-47ltxtb-f76d1-mrffg-master-1          1/1     Running     0          39m
    kube-system                                        apiserver-watcher-ci-ln-47ltxtb-f76d1-mrffg-master-2          1/1     Running     0          39m
    openshift-apiserver-operator                       openshift-apiserver-operator-79c7c646fd-5rvr5                 1/1     Running     3          45m
    openshift-apiserver                                apiserver-b944c4645-q694g                                     2/2     Running     0          29m
    openshift-apiserver                                apiserver-b944c4645-shdxb                                     2/2     Running     0          31m
    openshift-apiserver                                apiserver-b944c4645-x7rf2                                     2/2     Running     0          33m
     ...
  • 确保您的节点处于就绪状态

    $ oc get nodes
    示例输出
    NAME                                       STATUS   ROLES    AGE   VERSION
    ci-ln-47ltxtb-f76d1-mrffg-master-0         Ready    master   42m   v1.30.3
    ci-ln-47ltxtb-f76d1-mrffg-master-1         Ready    master   42m   v1.30.3
    ci-ln-47ltxtb-f76d1-mrffg-master-2         Ready    master   42m   v1.30.3
    ci-ln-47ltxtb-f76d1-mrffg-worker-a-gsxbz   Ready    worker   35m   v1.30.3
    ci-ln-47ltxtb-f76d1-mrffg-worker-b-5qqdx   Ready    worker   35m   v1.30.3
    ci-ln-47ltxtb-f76d1-mrffg-worker-c-rjkpq   Ready    worker   34m   v1.30.3

将集群与网络断开连接

镜像所有必需的仓库并配置您的集群以作为断开连接的集群工作后,您可以将集群与网络断开连接。

当集群失去互联网连接时,Insights Operator 会降级。您可以通过暂时禁用 Insights Operator来避免此问题,直到您可以恢复它。

恢复降级的 Insights Operator

将集群与网络断开连接必然会导致集群失去互联网连接。Insights Operator 会降级,因为它需要访问Red Hat Insights

本主题介绍如何从降级的 Insights Operator 中恢复。

步骤
  1. 编辑您的.dockerconfigjson文件以删除cloud.openshift.com条目,例如

    "cloud.openshift.com":{"auth":"<hash>","email":"[email protected]"}
  2. 保存文件。

  3. 使用编辑后的.dockerconfigjson文件更新集群密钥

    $ oc set data secret/pull-secret -n openshift-config --from-file=.dockerconfigjson=./.dockerconfigjson
  4. 验证 Insights Operator 是否不再降级

    $ oc get co insights
    示例输出
    NAME       VERSION   AVAILABLE   PROGRESSING   DEGRADED   SINCE
    insights   4.5.41    True        False         False      3d

恢复网络

如果要重新连接断开的集群并从在线注册表拉取镜像,请删除集群的 ImageContentSourcePolicy (ICSP) 对象。没有 ICSP,对外部注册表的拉取请求将不再重定向到镜像注册表。

步骤
  1. 查看集群中的 ICSP 对象

    $ oc get imagecontentsourcepolicy
    示例输出
    NAME                 AGE
    mirror-ocp           6d20h
    ocp4-index-0         6d18h
    qe45-index-0         6d15h
  2. 删除在断开集群连接时创建的所有 ICSP 对象

    $ oc delete imagecontentsourcepolicy <icsp_name> <icsp_name> <icsp_name>

    例如

    $ oc delete imagecontentsourcepolicy mirror-ocp ocp4-index-0 qe45-index-0
    示例输出
    imagecontentsourcepolicy.operator.openshift.io "mirror-ocp" deleted
    imagecontentsourcepolicy.operator.openshift.io "ocp4-index-0" deleted
    imagecontentsourcepolicy.operator.openshift.io "qe45-index-0" deleted
  3. 等待所有节点重新启动并返回到就绪状态,并验证registries.conf文件是否指向原始注册表而不是镜像注册表

    1. 登录到一个节点

      $ oc debug node/<node_name>
    2. 在调试 shell 中将/host设置为根目录

      sh-4.4# chroot /host
    3. 检查registries.conf文件

      sh-4.4# cat /etc/containers/registries.conf
      示例输出
      unqualified-search-registries = ["registry.access.redhat.com", "docker.io"] (1)
      
      1 由您删除的 ICSP 创建的registryregistry.mirror条目将被删除。