6.7. 导入和使用镜像和镜像流


以下小节介绍了如何导入和使用镜像流。

6.7.1. 从私有容器镜像仓库(registry)导入镜像和镜像流

镜像流可以被配置为从需要身份验证的私有镜像仓库中导入标签和镜像元数据。如果您将 Cluster Samples Operator 用来拉取内容的位置改为 registry.redhat.io 以外的位置,则适用这个过程。

注意

从不安全或安全容器镜像仓库导入时,secret 中定义的容器镜像仓库 URL 必须包含 :80 端口后缀,或在尝试从容器仓库仓库导入时不使用 secret。

流程

  1. 您必须通过输入以下命令来创建一个用于存储凭证的 secret 对象:

    $ oc create secret generic <secret_name> --from-file=.dockerconfigjson=<file_absolute_path> --type=kubernetes.io/dockerconfigjson
  2. 配置 secret 后,请创建新镜像流或输入 oc import-image 命令:

    $ oc import-image <imagestreamtag> --from=<image> --confirm

    在导入过程中,Red Hat OpenShift Service on AWS 会提取 secret 并将其提供给远程方。

6.7.1.1. 允许 Pod 引用其他安全 registry 中的镜像

要从其他私有或安全 registry 中拉取安全容器,您必须从容器客户端凭证(如 Docker 或 Podman)创建一个 pull secret,并将其添加到您的服务帐户中。

Docker 和 Podman 都使用配置文件来存储身份验证详情,以登录到安全或不安全的 registry:

  • docker :默认情况下,Docker 使用 $HOME/.docker/config.json
  • Podman: 默认情况下,Podman 使用 $HOME/.config/containers/auth.json

如果您之前已登录到安全或不安全的 registry,则这些文件会存储您的身份验证信息。

注意

如果 Docker 和 Podman 凭证文件和关联的 pull secret 都包含对同一 registry 的多个引用,如 quay.ioquay.io/<example_repository>。但是,Docker 和 Podman 都不支持完全相同的 registry 路径的多个条目。

config.json 文件示例

{
   "auths":{
      "cloud.openshift.com":{
         "auth":"b3Blb=",
         "email":"you@example.com"
      },
      "quay.io":{
         "auth":"b3Blb=",
         "email":"you@example.com"
      },
      "quay.io/repository-main":{
         "auth":"b3Blb=",
         "email":"you@example.com"
      }
   }
}

pull secret 示例

apiVersion: v1
data:
  .dockerconfigjson: ewogICAiYXV0aHMiOnsKICAgICAgIm0iOnsKICAgICAgIsKICAgICAgICAgImF1dGgiOiJiM0JsYj0iLAogICAgICAgICAiZW1haWwiOiJ5b3VAZXhhbXBsZS5jb20iCiAgICAgIH0KICAgfQp9Cg==
kind: Secret
metadata:
  creationTimestamp: "2021-09-09T19:10:11Z"
  name: pull-secret
  namespace: default
  resourceVersion: "37676"
  uid: e2851531-01bc-48ba-878c-de96cfe31020
type: Opaque

流程

  • 从现有身份验证文件创建 secret:

    • 对于使用 .docker/config.json 的 Docker 客户端,请输入以下命令:

      $ oc create secret generic <pull_secret_name> \
          --from-file=.dockerconfigjson=<path/to/.docker/config.json> \
          --type=kubernetes.io/dockerconfigjson
    • 对于使用 .config/containers/auth.json 的 Podman 客户端,请输入以下命令:

      $ oc create secret generic <pull_secret_name> \
           --from-file=<path/to/.config/containers/auth.json> \
           --type=kubernetes.io/podmanconfigjson
  • 如果您还没有安全 registry 的 Docker 凭证文件,则可运行以下命令创建一个 secret:

    $ oc create secret docker-registry <pull_secret_name> \
        --docker-server=<registry_server> \
        --docker-username=<user_name> \
        --docker-password=<password> \
        --docker-email=<email>
  • 要使用 secret 为 Pod 拉取镜像,您必须将 secret 添加到您的服务帐户中。本例中服务帐户的名称应与 Pod 使用的服务帐户的名称匹配。默认服务帐户是 default

    $ oc secrets link default <pull_secret_name> --for=pull

6.7.2. 使用清单列表

使用 oc import-imageoc tag CLI 命令时,您可以通过添加 --import-mode 标志来导入单个子清单或清单列表的所有清单。

请参考以下命令,以创建包含单个子清单或多架构镜像的镜像流。

流程

  • 输入以下命令来创建包含多架构镜像的镜像流,并将导入模式设置为 PreserveOriginal

    $ oc import-image <multiarch-image-stream-tag>  --from=<registry>/<project_name>/<image-name> \
    --import-mode='PreserveOriginal' --reference-policy=local --confirm

    输出示例

    ---
    Arch:           <none>
    Manifests:      linux/amd64     sha256:6e325b86566fafd3c4683a05a219c30c421fbccbf8d87ab9d20d4ec1131c3451
                    linux/arm64     sha256:d8fad562ffa75b96212c4a6dc81faf327d67714ed85475bf642729703a2b5bf6
                    linux/ppc64le   sha256:7b7e25338e40d8bdeb1b28e37fef5e64f0afd412530b257f5b02b30851f416e1
    ---

  • 或者,输入以下命令使用 Legacy 导入模式导入镜像,这会丢弃清单列表并导入单个子清单:

    $ oc import-image <multiarch-image-stream-tag>  --from=<registry>/<project_name>/<image-name> \
    --import-mode='Legacy' --confirm
    注意

    --import-mode= 默认值为 Legacy。排除这个值,或者没有指定 LegacyPreserveOriginal,会导入单个子清单。无效的导入模式会返回以下错误:error: valid ImportMode values are Legacy or PreserveOriginal

限制

使用清单列表有以下限制:

  • 在某些情况下,用户可能想直接使用子清单。当运行 oc adm prune imagesCronJob 修剪器运行时,它们无法检测何时使用子清单列表。因此,使用 oc adm prune imagesCronJob 修剪器的管理员可能会删除整个清单列表,包括子清单列表。

    为避免这种限制,您可以根据标签或摘要使用清单列表。

6.7.2.1. 配置定期导入清单列表

要定期重新导入清单列表,您可以使用 --scheduled 标志。

流程

  • 输入以下命令将镜像流设置为定期更新清单列表:

    $ oc import-image <multiarch-image-stream-tag>  --from=<registry>/<project_name>/<image-name> \
    --import-mode='PreserveOriginal' --scheduled=true

6.7.2.2. 导入清单列表时配置 SSL/TSL

要在导入清单列表时配置 SSL/TSL,您可以使用 --insecure 标志。

流程

  • 设置 --insecure=true,以便导入清单列表跳过 SSL/TSL 验证。例如:

    $ oc import-image <multiarch-image-stream-tag> --from=<registry>/<project_name>/<image-name> \
    --import-mode='PreserveOriginal' --insecure=true

6.7.3. 为 --import-mode 指定架构

您可以通过排除或包含 --import-mode= 标志来在多架构和单一构架之间交换导入的镜像流

流程

  • 运行以下命令,通过排除 --import-mode= 标志,将镜像流从多架构更新至单一架构:

    $ oc import-image <multiarch-image-stream-tag> --from=<registry>/<project_name>/<image-name>
  • 运行以下命令,将镜像流从单架构更新至多架构:

    $ oc import-image <multiarch-image-stream-tag>  --from=<registry>/<project_name>/<image-name> \
    --import-mode='PreserveOriginal'

6.7.4. --import-mode 的配置字段

下表描述了 --import-mode= 标志可用的选项:

参数描述

Legacy

--import-mode 的默认选项。指定后,清单列表将被丢弃,并导入单个子清单。平台会按照优先级顺序进行选择:

  1. 标签注解
  2. control plane 架构
  3. Linux/AMD64
  4. 列表中的第一个清单

PreserveOriginal

指定后,会保留原始清单。对于清单列表,将导入清单列表及其所有子清单。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.