Red Hat Training

A Red Hat training course is available for OpenShift Container Platform

23.2.3. 为 GCP 配置 OpenShift Container Platform registry

Google Cloud Platform(GCP)提供对象存储,OpenShift Container Platform 可以使用 OpenShift Container Platform 使用 OpenShift Container Platform 容器镜像 registry 存储容器镜像。

如需更多信息,请参阅 GCP 文档中的 Cloud Storage

先决条件

您必须在安装前创建存储桶来托管 registry 镜像。以下命令使用配置的服务帐户创建区域存储桶:

gsutil mb -c regional -l <region> gs://ocp-registry-bucket
cat <<EOF > labels.json
{
  "ocp-cluster": "mycluster"
}
EOF
gsutil label set labels.json gs://ocp-registry-bucket
rm -f labels.json
注意

默认情况下,存储桶的数据会使用 Google 管理的密钥自动加密。要指定不同的密钥来加密数据,请参阅 GCP 中的数据加密选项

如需更多信息,请参阅创建存储存储桶文档

流程

配置 registry 的 Ansible 清单文件 以使用 Google Cloud Storage (GCS) 存储桶:

[OSEv3:vars]
# GCP Provider Configuration
openshift_hosted_registry_storage_provider=gcs
openshift_hosted_registry_storage_kind=object
openshift_hosted_registry_replicas=1 1
openshift_hosted_registry_storage_gcs_bucket=<bucket_name> 2
openshift_hosted_registry_storage_gcs_keyfile=<bucket_keyfile> 3
openshift_hosted_registry_storage_gcs_rootdirectory=<registry_directory> 4
1
用于配置的副本数。
2
registry 存储的存储桶名称。
3
使用自定义密钥文件加密数据的安装程序主机上的路径。
4
用于存储数据的目录。默认情况下 /registry

如需更多信息,请参阅 GCP 文档中的 Cloud Storage

23.2.3.1. 为 GCP 手动配置 OpenShift Container Platform registry

要使用 GCP 对象存储,请编辑 registry 的配置文件并挂载到 registry pod。

有关存储驱动程序配置文件的更多信息,请参阅 Google Cloud Storage Driver 文档

流程

  1. 导出当前的 /etc/registry/config.yml 文件:

    $ oc get secret registry-config \
        -o jsonpath='{.data.config\.yml}' -n default | base64 -d \
      >> config.yml.old
  2. 从旧的 /etc/registry/config.yml 文件创建新配置文件:

    $ cp config.yml.old config.yml
  3. 编辑该文件以包含 GCP 参数。在 registry 配置文件的 storage 部分指定存储桶和密钥文件:

    storage:
      delete:
        enabled: true
      cache:
        blobdescriptor: inmemory
      gcs:
        bucket: ocp-registry 1
        keyfile: mykeyfile 2
    1
    使用 GCP 存储桶名称替换。
    2
    私有服务帐户密钥文件,采用 JSON 格式。如果使用 Google Application Default Credentials,请不要指定 keyfile 参数。
  4. 删除 registry-config secret:

    $ oc delete secret registry-config -n default
  5. 重新创建 secret 来引用更新的配置文件:

    $ oc create secret generic registry-config \
        --from-file=config.yml -n default
  6. 重新部署 registry 以读取更新的配置:

    $ oc rollout latest docker-registry -n default
23.2.3.1.1. 验证 registry 是否使用 GCP 对象存储

验证 registry 是否使用 GCP 存储桶存储:

流程

  1. 使用 GCP 存储成功部署 registry 后,如果 registry 部署使用 emptydir 而不是 GCP 存储桶存储,registry deploymentconfig 不会显示任何信息:

    $ oc describe dc docker-registry -n default
    ...
    Mounts:
      ...
      /registry from registry-storage (rw)
    Volumes:
    registry-storage:
    Type:       EmptyDir 1
    ...
    1
    共享 pod 生命周期的临时目录。
  2. 检查 /registry 挂载点是否为空。这是将使用卷 GCP 存储:

    $ oc exec \
        $(oc get pod -l deploymentconfig=docker-registry \
        -o=jsonpath='{.items[0].metadata.name}')  -i -t -- ls -l /registry
    total 0
  3. 如果为空,它会因为 GCP 存储桶配置在 registry-config secret 中执行:

    $ oc describe secret registry-config
    Name:         registry-config
    Namespace:    default
    Labels:       <none>
    Annotations:  <none>
    
    Type:  Opaque
    
    Data
    ====
    config.yml:  398 bytes
  4. 安装程序会使用扩展的 registry 功能创建带有所需配置的 config.yml 文件,如安装文档所述。要查看配置文件,包括存储存储桶配置的 storage 部分:

    $ oc exec \
        $(oc get pod -l deploymentconfig=docker-registry \
          -o=jsonpath='{.items[0].metadata.name}') \
      cat /etc/registry/config.yml
    
    version: 0.1
    log:
      level: debug
    http:
      addr: :5000
    storage:
      delete:
        enabled: true
      cache:
        blobdescriptor: inmemory
      gcs:
        bucket: ocp-registry
    auth:
      openshift:
        realm: openshift
    middleware:
      registry:
      - name: openshift
      repository:
      - name: openshift
        options:
          pullthrough: True
          acceptschema2: True
          enforcequota: False
      storage:
      - name: openshift

    或者,您可以查看 secret:

    $ oc get secret registry-config -o jsonpath='{.data.config\.yml}' | base64 -d
    version: 0.1
    log:
      level: debug
    http:
      addr: :5000
    storage:
      delete:
        enabled: true
      cache:
        blobdescriptor: inmemory
      gcs:
        bucket: ocp-registry
    auth:
      openshift:
        realm: openshift
    middleware:
      registry:
      - name: openshift
      repository:
      - name: openshift
        options:
          pullthrough: True
          acceptschema2: True
          enforcequota: False
      storage:
      - name: openshift

    您可以通过在 GCP 控制台中查看 Storage,然后点 Browser 并选择存储桶,或运行 gsutil 命令验证镜像推送是否成功:

    $ gsutil ls gs://ocp-registry/
    gs://ocp-registry/docker/
    
    $ gsutil du gs://ocp-registry/
    7660385     gs://ocp-registry/docker/registry/v2/blobs/sha256/03/033565e6892e5cc6dd03187d00a4575720a928db111274e0fbf31b410a093c10/data
    7660385     gs://ocp-registry/docker/registry/v2/blobs/sha256/03/033565e6892e5cc6dd03187d00a4575720a928db111274e0fbf31b410a093c10/
    7660385     gs://ocp-registry/docker/registry/v2/blobs/sha256/03/
    ...

如果使用 emptyDir 卷,/registry 挂载点类似如下:

$ oc exec \
    $(oc get pod -l deploymentconfig=docker-registry \
    -o=jsonpath='{.items[0].metadata.name}')  -i -t -- df -h /registry
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdc         30G  226M   30G   1% /registry


$ oc exec \
    $(oc get pod -l deploymentconfig=docker-registry \
    -o=jsonpath='{.items[0].metadata.name}')  -i -t -- ls -l /registry
total 0
drwxr-sr-x. 3 1000000000 1000000000 22 Jun 19 12:24 docker