镜像


Red Hat OpenShift Service on AWS 4

Red Hat OpenShift Service on AWS 镜像。

Red Hat OpenShift Documentation Team

摘要

本文档提供了创建和管理镜像及镜像流的说明。另外还介绍如何使用模板。

第 1 章 镜像概述

1.1. 了解容器、镜像和镜像流

当您设置为创建和管理容器化软件时,务必要理解容器、镜像和镜像流等重要概念。镜像包含一组准备就绪可运行的软件,容器是容器镜像的一个运行实例。镜像流提供了一种方法来存储相同基本镜像的不同版本。这些不同版本通过相同镜像名称的不同标签(tag)来表示。

1.2. 镜像

Red Hat OpenShift Service on AWS 中的容器基于 OCI 或 Docker 格式的容器镜像。镜像是一种二进制文件,包含运行单一容器的所有要求以及描述其需求和功能的元数据。

您可以将其视为一种打包技术。容器只能访问其镜像中定义的资源,除非创建时授予容器其他访问权限。通过在跨多个主机的多个容器中部署同一镜像,并在它们之间进行负载平衡,Red Hat OpenShift Service on AWS 可以为打包到镜像的服务提供冗余和横向扩展。

您可以使用 podmandocker CLI 直接构建镜像,但 Red Hat OpenShift Service on AWS 也提供构建器镜像,通过向现有镜像添加代码或配置来协助创建新镜像。

由于应用程序会随时间发展,因此单个镜像名称实际上可以指代同一镜像的许多不同版本。每个不同的镜像都会有一个代表它的唯一哈希值(一个较长的十六进制值,如 fd44297e2ddb050ec4f…​),它通常会被缩短为一个 12 位长的值(如 fd44297e2ddb)。

您可以创建和管理 容器镜像。

1.3. 镜像 registry

镜像 registry 是一个可存储和提供容器镜像的内容服务器。例如:

registry.redhat.io
Copy to Clipboard Toggle word wrap

registry 包含一个或多个镜像存储库的集合,其中包含一个或多个标记的镜像。红帽在 registry.redhat.io 上为订阅者提供了一个 registry。Red Hat OpenShift Service on AWS 还可以提供自己的 OpenShift 镜像 registry 来管理自定义容器镜像。

1.4. 镜像存储库

镜像存储库是相关容器镜像和标识它们的标签(tag)的集合。例如,Red Hat OpenShift Service on AWS Jenkins 镜像位于存储库中:

docker.io/openshift/jenkins-2-centos7
Copy to Clipboard Toggle word wrap

1.5. 镜像标签

镜像标签(tag)是应用于存储库中容器镜像的标签,用于将特定镜像与镜像流中的其他镜像区分开来。标签通常代表某种版本号。例如,这里 :v3.11.59-2 是标签:

registry.access.redhat.com/openshift3/jenkins-2-rhel7:v3.11.59-2
Copy to Clipboard Toggle word wrap

您可以向镜像添加其他标签。例如,可为镜像分配 :v3.11.59-2:latest 标签。

Red Hat OpenShift Service on AWS 提供了 oc tag 命令,该命令类似于 docker tag 命令,但在镜像流上运行,而不是直接在镜像上运行。

1.6. 镜像 ID

镜像 ID 是 SHA(安全哈希算法)代码,可用于拉取(pull)镜像。SHA 镜像 ID 不能更改。特定 SHA 标识符会始终引用完全相同的容器镜像内容。例如:

docker.io/openshift/jenkins-2-centos7@sha256:ab312bda324
Copy to Clipboard Toggle word wrap

1.7. 容器

Red Hat OpenShift Service on AWS 应用程序的基本单元称为容器。Linux 容器技术是一种轻量型机制,用于隔离运行中的进程,使它们只能跟指定的资源交互。容器一词被定义为容器镜像的特定运行或暂停实例。

在一个单一的主机上可以包括多个容器来运行多个不同的应用程序实例,且相互间无法看到其他应用程序的进程、文件、网络等。通常情况下,每个容器提供一项服务,常称为微服务,如 Web 服务器或数据库,但容器也可用于任意工作负载。

多年来,Linux 内核一直在整合容器技术的能力。Docker 项目为主机上的 Linux 容器开发了便捷的管理接口。最近,开放容器计划还为容器格式和容器运行时制定了开放标准。Red Hat OpenShift Service on AWS 和 Kubernetes 添加了在多主机安装间编配 OCI 和 Docker 格式的容器的功能。

虽然在使用 Red Hat OpenShift Service on AWS 时,您不直接与容器运行时交互,但了解其功能和术语非常重要,以了解其在 Red Hat OpenShift Service on AWS 中的角色,以及应用程序在容器内运行的方式。

podman 等工具可用于替代 docker 命令行工具来直接运行和管理容器。使用 podman,您可以独立于 Red Hat OpenShift Service on AWS 来试验容器。

1.8. 为什么使用镜像流

镜像流及其关联的标签提供了一个用于从 Red Hat OpenShift Service on AWS 中引用容器镜像的抽象集。镜像流及其标签用于查看可用镜像,确保您使用所需的特定镜像,即使存储库中的镜像发生变化也是如此。

镜像流不含实际镜像数据,它提供了相关镜像的一个单独的虚拟视图,类似于镜像存储库。

您可配置构建(Build)和部署(Depolyment)来监测一个镜像流的通知。当新的镜像被添加时,执行相应的构建或部署。

例如,如果部署正在使用某个镜像并且创建了该镜像的新版本,则会自动执行部署以获取镜像的新版本。

但是,如果部署或构建所用的 imagestreamtag 没有更新,则即使更新了容器镜像 registry 中的容器镜像,构建或部署仍会继续使用之前的,已知良好的镜像。

源镜像可存储在以下任一位置:

  • Red Hat OpenShift Service on AWS 的集成 registry。
  • 一个外部 registry,如 registry.redhat.io 或 quay.io。
  • Red Hat OpenShift Service on AWS 集群中的其他镜像流。

当您定义引用镜像流标签的对象时,如构建或部署配置,您将指向镜像流标签而不是存储库。构建或部署应用程序时,Red Hat OpenShift Service on AWS 会使用镜像流标签查询存储库,以查找镜像的关联 ID 并使用确切的镜像。

镜像流元数据会与其他集群信息一起存储在 etcd 实例中。

使用镜像流有以下几大优势:

  • 您可以添加标签、回滚标签和快速处理镜像,而无需使用命令行重新执行 push 操作。
  • 当一个新镜像被推送(push)到 registry 时,可触发构建和部署。另外,Red Hat OpenShift Service on AWS 为其他资源(如 Kubernetes 对象)提供了通用触发器。
  • 您可以为定期重新导入标记标签。如果源镜像已更改,则这个更改会被发现并反应在镜像流中。取决于构建或部署的具体配置,这可能会触发构建和/或部署流程。
  • 您可使用细粒度访问控制来共享镜像,快速向整个团队分发镜像。
  • 如果源更改,imagestreamtag 仍将指向已知良好的镜像版本,以确保您的应用程序不会意外中断。
  • 您可以通过镜像流对象的权限配置安全性,以了解谁可以查看和使用镜像。
  • 在集群级别上缺少读取或列出镜像权限的用户仍可使用镜像流来检索项目中标记的镜像。

您可以管理镜像流,将镜像流 与 Kubernetes 资源一起使用,并触发镜像流更新

1.9. 镜像流标签

镜像流标签是指向镜像流中镜像的命名指针。镜像流标签与容器镜像标签类似。

1.10. 镜像流镜像

镜像流镜像允许您从标记了特定容器镜像的特定镜像流中检索该镜像。镜像流镜像是一个 API 资源对象,用于收集一些有关特定镜像 SHA 标识符的元数据。

1.11. 镜像流触发器

镜像流触发器(imagestream trigger)会在镜像流标签更改时引发特定操作。例如,导入可导致标签值变化。当有部署、构建或其他资源监听这些信息时,就会启动触发器。

1.12. 如何使用 Cluster Samples Operator

在初始启动时,Operator 会创建默认样本资源来初始化镜像流和模板的创建过程。您可以使用 Cluster Samples Operator 管理存储在 openshift 命名空间中的示例镜像流和模板。

作为集群管理员,您可以使用 Cluster Samples Operator:

1.13. 关于模板

模板是要复制的对象的定义。您可以使用模板来构建和部署配置。

1.14. 如何使用 Ruby on Rails

作为开发人员,您可以使用 Ruby on Rails 进行:

  • 编写应用程序:

    • 设置数据库。
    • 创建欢迎页面。
    • 为 Red Hat OpenShift Service on AWS 配置应用程序。
    • 将您的应用存储在 Git 中。
  • 在 Red Hat OpenShift Service on AWS 中部署应用程序:

    • 创建数据库服务。
    • 创建 frontend 服务。
    • 为应用程序创建路由。

第 2 章 Cluster Samples Operator 概述

Cluster Samples Operator 运行在 openshift 命名空间中,用于安装和更新 Red Hat OpenShift Service on AWS 镜像流和 Red Hat OpenShift Service on AWS 模板。

Cluster Samples Operator 已被弃用
  • 从 Red Hat OpenShift Service on AWS 4.16 开始,Cluster Samples Operator 已被弃用。Cluster Samples Operator 不会将新的模板、示例或非 Source-to-Image (Non-S2I)镜像流添加到 Cluster Samples Operator 中。但是,现有 S2I 构建器镜像流和模板将继续接收更新,直到以后的发行版本中删除了 Cluster Samples Operator。S2I 镜像流和模板包括:

    • Ruby
    • Python
    • Node.js
    • Perl
    • PHP
    • HTTPD
    • Nginx
    • EAP
    • Java
    • Webserver
    • .NET
    • Go
  • Cluster Samples Operator 将停止管理和提供对非 S2I 示例(镜像流和模板)的支持。您可以联系镜像流或模板所有者以获取任何要求和将来的计划。此外,请参阅托管镜像流或模板的存储库列表

2.1. 了解 Cluster Samples Operator

在安装过程中,Operator 会为自己创建默认配置对象,然后创建示例镜像流和模板,包括快速启动模板。

注意

为便于从需要凭证的其他 registry 中导入镜像流,集群管理员可在镜像导入所需的 openshift 命名空间中创建包含 Docker config.json 文件内容的额外 secret。

Cluster Samples Operator 配置是一个集群范围的资源,其部署包含在 openshift-cluster-samples-operator 命名空间中。

Cluster Samples Operator 的镜像包含关联的 Red Hat OpenShift Service on AWS 发行版本的镜像流和模板定义。在创建或更新每个示例时,Cluster Samples Operator 包含一个注解,表示 Red Hat OpenShift Service on AWS 的版本。Operator 使用此注解来确保每个示例与发行版本匹配。清单(inventory)以外的示例会与跳过的示例一样被忽略。对任何由 Operator 管理的示例进行的修改(版本注解被修改或删除),都将会被自动恢复。

注意

Jenkins 镜像实际上自安装后便已是镜像有效负载的一部分,并直接标记(tag)到镜像流中。

Cluster Samples Operator 配置资源包含一个终结器(finalizer),它会在删除时清除以下内容:

  • Operator 管理的镜像流。
  • Operator 管理的模板。
  • Operator 生成的配置资源。
  • 集群状态资源。

删除样本资源后,Samples Operator 会使用默认配置重新创建资源。

2.1.1. Cluster Samples Operator 使用管理状态

Cluster Samples Operator 默认配置为 Managed,或者配置了全局代理。在 Managed 状态下,Cluster Samples Operator 会主动管理其资源并保持组件的活跃状态,以便从 registry 中拉取示例镜像流和镜像,并确保安装了必要的示例模板。

在某些情况下,Cluster Samples Operator 会将自身引导为 Removed,包括:

  • 如果 Cluster Samples Operator 在全新安装后初始启动时三分钟后仍无法访问 registry.redhat.io
  • 如果 Cluster Samples Operator 检测到它位于 IPv6 网络中。
注意

对于 Red Hat OpenShift Service on AWS,默认镜像 registry 是 registry.access.redhat.comquay.io

但是,如果 Cluster Samples Operator 检测到它位于 IPv6 网络上,并且配置了 Red Hat OpenShift Service on AWS 全局代理,则 IPv6 检查会取代所有检查。因此,Cluster Samples Operator 会将自身引导为 Removed

重要

registry.redhat.io目前不支持 IPv6 安装。Cluster Samples Operator 从 registry.redhat.io 中提取大多数示例镜像流和镜像。

2.1.1.1. 受限网络安装

当无法访问 registry.redhat.io 时,当网络限制已存在时,Boostrapping 为 Removed 有助于进行受限网络安装。当网络访问受限时,Bootstrapping 为 Removed 可让集群管理员有更多时间决定是否需要样本,因为 Cluster Samples Operator 不提交当管理状态设置为 Removed 时示例镜像流导入失败的警报。当 Cluster Samples Operator 启动为 Managed 并尝试安装示例镜像流时,它会在安装失败时在初始安装后 2 小时启动警报。

2.1.1.2. 使用初始网络访问受限网络安装

当一个集群旨在作为受限网络或断开连接而安装的集群,如果其存在网络连接,则 Cluster Samples Operator 会从 registry.redhat.io 中安装内容,因为可以访问它。如果您希望 Cluster Samples Operator 仍然引导为 Removed,以便延迟样本安装,直到您决定了需要安装哪个样本、如何设置镜像等,请按照有关使用带有备用 registry 以及自定义节点(均在 additional resources 部分中链接)的 Samples Operator 的说明来覆盖 Cluster Samples Operator 默认配置,以便最初以 Removed 的形式出现。

您必须将以下额外 YAML 文件放到由 openshift-install create manifest 创建的 openshift 目录中:

带有 managementState: Removed 的 Cluster Samples Operator YAML 文件示例:

apiVersion: samples.operator.openshift.io/v1
kind: Config
metadata:
  name: cluster
spec:
  architectures:
  - x86_64
  managementState: Removed
Copy to Clipboard Toggle word wrap

在创建或更新示例镜像流后,Cluster Samples Operator 会监控每个镜像流标签镜像导入的进度。

如果导入失败,Cluster Samples Operator 会通过镜像流镜像导入 API(与 oc import-image 命令使用的 API 相同)。重新尝试导入大约每 15 分钟进行一次,直到导入成功,或者 Cluster Samples Operator 的配置已更改为镜像流被添加到 skippedImagestreams 列表中,或者管理状态变为 Removed

其他资源

Cluster Samples Operator 在镜像流中保留已弃用的镜像流标签,因为用户可能有使用已弃用的镜像流标签的部署。

您可以使用 oc tag 命令编辑镜像流标签,从而删除已弃用的镜像流标签。

注意

弃用的镜像流标签,示例供应商从镜像流中删除的标签不包括在初始安装中。

先决条件

  • 已安装 oc CLI。

流程

  • 使用 oc tag 命令编辑镜像流标签,从而删除已弃用的镜像流标签。

    $ oc tag -d <image_stream_name:tag>
    Copy to Clipboard Toggle word wrap

    输出示例

    Deleted tag default/<image_stream_name:tag>.
    Copy to Clipboard Toggle word wrap

其他资源

您可以通过创建镜像 registry 来将 Cluster Samples Operator 与备用 registry 搭配使用。

重要

您必须可以访问互联网来获取所需的容器镜像。在这一流程中,您要将镜像 registry 放在可访问您的网络以及互联网的镜像(mirror)主机上。

3.1. 关于镜像 registry

您可以镜像 Red Hat OpenShift Service on AWS 安装所需的镜像,以及容器镜像 registry 的后续产品更新,如 Red Hat Quay、JFrog Artifactory、Ssonatype Nexus Repository 或 Harbor。如果您无法访问大型容器 registry,可以使用 mirror registry for Red Hat OpenShift,它是包括在 Red Hat OpenShift Service on AWS 订阅中的小型容器 registry。

您可以使用支持 Docker v2-2 的任何容器 registry,如 Red Hat Quay、mirror registry for Red Hat OpenShift、Artifactory、Sonatype Nexus Repository 或 Harbor。无论您所选 registry 是什么,都会将互联网上红帽托管站点的内容镜像到隔离的镜像 registry 相同。镜像内容后,您要将每个集群配置为从镜像 registry 中检索此内容。

重要

OpenShift 镜像 registry 不能用作目标 registry,因为它不支持没有标签的推送,在镜像过程中需要这个推送。

如果选择不是 mirror registry for Red Hat OpenShift 的容器 registry,您必须可以被您置备的集群中的每个机器访问。如果 registry 无法访问,安装、更新或常规操作(如工作负载重新定位)可能会失败。因此,您必须以高可用性方式运行镜像 registry,镜像 registry 至少必须与 Red Hat OpenShift Service on AWS 集群的生产环境可用性匹配。

当使用 Red Hat OpenShift Service on AWS 镜像填充镜像 registry 时,您可以遵循以下两种情况。如果您的主机可以同时访问互联网和您的镜像 registry,而不能访问您的集群节点,您可以直接从该机器中镜像该内容。这个过程被称为 连接的镜像(mirror)。如果没有这样的主机,则必须将该镜像文件镜像到文件系统中,然后将该主机或者可移动介质放入受限环境中。这个过程被称为 断开连接的镜像

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

注意

红帽不会在 Red Hat OpenShift Service on AWS 中测试第三方 registry。

3.1.1. 准备镜像主机

在创建镜像 registry 前,您必须准备镜像(mirror)主机。

3.1.2. 安装 OpenShift CLI

您可以安装 OpenShift CLI (oc)来使用命令行界面与 Red Hat OpenShift Service on AWS 进行交互。您可以在 Linux、Windows 或 macOS 上安装 oc

重要

如果安装了旧版本的 oc,则无法使用 Red Hat OpenShift Service on AWS 4 中的所有命令。下载并安装新版本的 oc

在 Linux 上安装 OpenShift CLI

您可以按照以下流程在 Linux 上安装 OpenShift CLI(oc)二进制文件。

流程

  1. 导航到红帽客户门户网站上的 Red Hat OpenShift Service on AWS 下载页面
  2. 产品变体 下拉列表中选择架构。
  3. 版本 下拉列表中选择适当的版本。
  4. OpenShift v4 Linux Clients 条目旁的 Download Now 来保存文件。
  5. 解包存档:

    $ tar xvf <file>
    Copy to Clipboard Toggle word wrap
  6. oc 二进制文件放到 PATH 中的目录中

    要查看您的 PATH,请执行以下命令:

    $ echo $PATH
    Copy to Clipboard Toggle word wrap

验证

  • 安装 OpenShift CLI 后,可以使用 oc 命令:

    $ oc <command>
    Copy to Clipboard Toggle word wrap
在 Windows 上安装 OpenShift CLI

您可以按照以下流程在 Windows 上安装 OpenShift CLI(oc)二进制文件。

流程

  1. 导航到红帽客户门户网站上的 Red Hat OpenShift Service on AWS 下载页面
  2. 版本 下拉列表中选择适当的版本。
  3. OpenShift v4 Windows Client 条目旁的 Download Now 来保存文件。
  4. 使用 ZIP 程序解压存档。
  5. oc 二进制文件移到 PATH 中的目录中

    要查看您的 PATH,请打开命令提示并执行以下命令:

    C:\> path
    Copy to Clipboard Toggle word wrap

验证

  • 安装 OpenShift CLI 后,可以使用 oc 命令:

    C:\> oc <command>
    Copy to Clipboard Toggle word wrap
在 macOS 上安装 OpenShift CLI

您可以按照以下流程在 macOS 上安装 OpenShift CLI(oc)二进制文件。

流程

  1. 导航到红帽客户门户网站上的 Red Hat OpenShift Service on AWS 下载页面
  2. 版本 下拉列表中选择适当的版本。
  3. OpenShift v4 macOS Clients 条目旁的 Download Now 来保存文件。

    注意

    对于 macOS arm64,请选择 OpenShift v4 macOS arm64 Client 条目。

  4. 解包和解压存档。
  5. oc 二进制文件移到 PATH 的目录中。

    要查看您的 PATH,请打开终端并执行以下命令:

    $ echo $PATH
    Copy to Clipboard Toggle word wrap

验证

  • 使用 oc 命令验证安装:

    $ oc <command>
    Copy to Clipboard Toggle word wrap

3.2. 配置允许对容器镜像进行镜像的凭证

创建容器镜像 registry 凭证文件,可让您将镜像从红帽 mirror 到您的镜像。

先决条件

  • 您已将镜像 registry 配置为在断开连接的环境中使用。

流程

在安装主机上完成以下步骤:

  1. 从 Red Hat OpenShift Cluster Manager 下载 registry.redhat.io pull secret
  2. 运行以下命令,以 JSON 格式生成 pull secret 副本:

    $ cat ./pull-secret | jq . > <path>/<pull_secret_file_in_json> 
    1
    Copy to Clipboard Toggle word wrap
    1
    指定到存储 pull secret 的文件夹的路径,以及您创建的 JSON 文件的名称。

    pull secret 示例

    {
      "auths": {
        "cloud.openshift.com": {
          "auth": "b3BlbnNo...",
          "email": "you@example.com"
        },
        "quay.io": {
          "auth": "b3BlbnNo...",
          "email": "you@example.com"
        },
        "registry.connect.redhat.com": {
          "auth": "NTE3Njg5Nj...",
          "email": "you@example.com"
        },
        "registry.redhat.io": {
          "auth": "NTE3Njg5Nj...",
          "email": "you@example.com"
        }
      }
    }
    Copy to Clipboard Toggle word wrap

  3. 运行以下命令,为您的镜像 registry 生成 base64 编码的用户名和密码或令牌:

    $ echo -n '<user_name>:<password>' | base64 -w0 
    1
    Copy to Clipboard Toggle word wrap
    1
    通过 <user_name><password> 指定 registry 的用户名和密码。

    输出示例

    BGVtbYk3ZHAtqXs=
    Copy to Clipboard Toggle word wrap

  4. 编辑 JSON 文件并添加描述 registry 的部分:

      "auths": {
        "<mirror_registry>": { 
    1
    
          "auth": "<credentials>", 
    2
    
          "email": "you@example.com"
        }
      },
    Copy to Clipboard Toggle word wrap
    1
    指定 registry 域名,以及您的镜像 registry 用来提供内容的可选端口。例如:registry.example.comregistry.example.com:8443
    2
    指定镜像 registry 的 base64 编码用户名和密码。

    修改的 pull secret 示例

    {
      "auths": {
        "registry.example.com": {
          "auth": "BGVtbYk3ZHAtqXs=",
          "email": "you@example.com"
        },
        "cloud.openshift.com": {
          "auth": "b3BlbnNo...",
          "email": "you@example.com"
        },
        "quay.io": {
          "auth": "b3BlbnNo...",
          "email": "you@example.com"
        },
        "registry.connect.redhat.com": {
          "auth": "NTE3Njg5Nj...",
          "email": "you@example.com"
        },
        "registry.redhat.io": {
          "auth": "NTE3Njg5Nj...",
          "email": "you@example.com"
        }
      }
    }
    Copy to Clipboard Toggle word wrap

将 Red Hat OpenShift Service on AWS 镜像存储库镜像到您的 registry,以便在集群安装过程中使用。

先决条件

  • 您的镜像主机可访问互联网。
  • 您已将镜像 registry 配置为在受限网络中使用,并可访问您配置的证书和凭证。
  • 您已从 Red Hat OpenShift Cluster Manager 下载了 pull secret,并已修改为包含镜像存储库的身份验证。
  • 如果您使用自签名证书,已在证书中指定 Subject Alternative Name。

流程

在镜像主机上完成以下步骤:

  1. 查看 Red Hat OpenShift Service on AWS 下载页面,以确定您要在 AWS 上安装的 Red Hat OpenShift Service 版本,并在 Repository Tags 页面中决定对应的标签。
  2. 设置所需的环境变量:

    1. 导出发行版本信息:

      $ OCP_RELEASE=<release_version>
      Copy to Clipboard Toggle word wrap

      对于 <release_version >,请指定与 Red Hat OpenShift Service on AWS 版本对应的标签,用于安装,如 4.5.4

    2. 导出本地 registry 名称和主机端口:

      $ LOCAL_REGISTRY='<local_registry_host_name>:<local_registry_host_port>'
      Copy to Clipboard Toggle word wrap

      对于 <local_registry_host_name>,请指定镜像存储库的 registry 域名;对于 <local_registry_host_port>,请指定用于提供内容的端口。

    3. 导出本地存储库名称:

      $ LOCAL_REPOSITORY='<local_repository_name>'
      Copy to Clipboard Toggle word wrap

      对于 <local_repository_name>,请指定要在 registry 中创建的仓库名称,如 ocp4/openshift4

    4. 导出要进行镜像的存储库名称:

      $ PRODUCT_REPO='openshift-release-dev'
      Copy to Clipboard Toggle word wrap

      对于生产环境版本,必须指定 openshift-release-dev

    5. 导出 registry pull secret 的路径:

      $ LOCAL_SECRET_JSON='<path_to_pull_secret>'
      Copy to Clipboard Toggle word wrap

      对于 <path_to_pull_secret>,请指定您创建的镜像 registry 的 pull secret 的绝对路径和文件名。

    6. 导出发行版本镜像:

      $ RELEASE_NAME="ocp-release"
      Copy to Clipboard Toggle word wrap

      对于生产环境版本,您必须指定 ocp-release

    7. 为您的集群导出构架类型:

      $ ARCHITECTURE=<cluster_architecture> 
      1
      Copy to Clipboard Toggle word wrap
      1
      指定集群的构架,如 x86_64, aarch64, s390x, 获 ppc64le
    8. 导出托管镜像的目录的路径:

      $ REMOVABLE_MEDIA_PATH=<path> 
      1
      Copy to Clipboard Toggle word wrap
      1
      指定完整路径,包括开始的前斜杠(/)字符。
  3. 将版本镜像(mirror)到镜像 registry:

    • 如果您的镜像主机无法访问互联网,请执行以下操作:

      1. 将可移动介质连接到连接到互联网的系统。
      2. 查看要镜像的镜像和配置清单:

        $ oc adm release mirror -a ${LOCAL_SECRET_JSON}  \
             --from=quay.io/${PRODUCT_REPO}/${RELEASE_NAME}:${OCP_RELEASE}-${ARCHITECTURE} \
             --to=${LOCAL_REGISTRY}/${LOCAL_REPOSITORY} \
             --to-release-image=${LOCAL_REGISTRY}/${LOCAL_REPOSITORY}:${OCP_RELEASE}-${ARCHITECTURE} --dry-run
        Copy to Clipboard Toggle word wrap
      3. 记录上一命令输出中的 imageContentSources 部分。您的镜像信息与您的镜像存储库相对应,您必须在安装过程中将 imageContentSources 部分添加到 install-config.yaml 文件中。
      4. 将镜像镜像到可移动介质的目录中:

        $ oc adm release mirror -a ${LOCAL_SECRET_JSON} --to-dir=${REMOVABLE_MEDIA_PATH}/mirror quay.io/${PRODUCT_REPO}/${RELEASE_NAME}:${OCP_RELEASE}-${ARCHITECTURE}
        Copy to Clipboard Toggle word wrap
      5. 将介质上传到受限网络环境中,并将镜像上传到本地容器 registry。

        $ oc image mirror -a ${LOCAL_SECRET_JSON} --from-dir=${REMOVABLE_MEDIA_PATH}/mirror "file://openshift/release:${OCP_RELEASE}*" ${LOCAL_REGISTRY}/${LOCAL_REPOSITORY} 
        1
        Copy to Clipboard Toggle word wrap
        1
        对于 REMOVABLE_MEDIA_PATH,您必须使用与镜像镜像时指定的同一路径。
        重要

        运行 oc image mirror 可能会导致以下错误: error: unable to retrieve source image。当镜像索引包括对镜像 registry 中不再存在的镜像的引用时,会发生此错误。镜像索引可能会保留旧的引用,以便为运行这些镜像的用户在升级图表中显示新的升级路径。作为临时解决方案,您可以使用 --skip-missing 选项绕过错误并继续下载镜像索引。如需更多信息,请参阅 Service Mesh Operator 镜像失败

    • 如果本地容器 registry 连接到镜像主机,请执行以下操作:

      1. 使用以下命令直接将发行版镜像推送到本地 registry:

        $ oc adm release mirror -a ${LOCAL_SECRET_JSON}  \
             --from=quay.io/${PRODUCT_REPO}/${RELEASE_NAME}:${OCP_RELEASE}-${ARCHITECTURE} \
             --to=${LOCAL_REGISTRY}/${LOCAL_REPOSITORY} \
             --to-release-image=${LOCAL_REGISTRY}/${LOCAL_REPOSITORY}:${OCP_RELEASE}-${ARCHITECTURE}
        Copy to Clipboard Toggle word wrap

        该命令将发行信息提取为摘要,其输出包括安装集群时所需的 imageContentSources 数据。

      2. 记录上一命令输出中的 imageContentSources 部分。您的镜像信息与您的镜像存储库相对应,您必须在安装过程中将 imageContentSources 部分添加到 install-config.yaml 文件中。

        注意

        镜像名称在镜像过程中被修补到 Quay.io, podman 镜像将在 bootstrap 虚拟机的 registry 中显示 Quay.io。

  4. 要创建基于您镜像内容的安装程序,请提取内容并将其固定到发行版中:

    • 如果您的镜像主机无法访问互联网,请运行以下命令:

      $ oc adm release extract -a ${LOCAL_SECRET_JSON} --icsp-file=<file> --command=openshift-install "${LOCAL_REGISTRY}/${LOCAL_REPOSITORY}:${OCP_RELEASE}-${ARCHITECTURE}" \
      --insecure=true 
      1
      Copy to Clipboard Toggle word wrap
      1
      可选:如果您不想为目标 registry 配置信任,请添加 --insecure=true 标志。
    • 如果本地容器 registry 连接到镜像主机,请运行以下命令:

      $ oc adm release extract -a ${LOCAL_SECRET_JSON} --command=openshift-install "${LOCAL_REGISTRY}/${LOCAL_REPOSITORY}:${OCP_RELEASE}-${ARCHITECTURE}"
      Copy to Clipboard Toggle word wrap
      重要

      要确保为您选择的 Red Hat OpenShift Service on AWS 版本使用正确的镜像,您必须从镜像内容中提取安装程序。

      您必须在有活跃互联网连接的机器上执行这个步骤。

  5. 对于使用安装程序置备的基础架构的集群,运行以下命令:

    $ openshift-install
    Copy to Clipboard Toggle word wrap

openshift 命名空间中大多数由 Cluster Samples Operator 管理的镜像流指向位于 registry.redhat.io 上红帽容器镜像仓库中的镜像。

注意

cliinstallermust-gathertest 镜像流虽然属于安装有效负载的一部分,但不由 Cluster Samples Operator 管理。此流程中不涉及这些镜像流。

重要

Cluster Samples Operator 必须在断开连接的环境中设置为 Managed。要安装镜像流,您需要有一个镜像的 registry。

先决条件

  • 使用具有 cluster-admin 角色的用户访问集群。
  • 为您的镜像 registry 创建 pull secret。

流程

  1. 访问被镜像(mirror)的特定镜像流的镜像,例如:

    $ oc get is <imagestream> -n openshift -o json | jq .spec.tags[].from.name | grep registry.redhat.io
    Copy to Clipboard Toggle word wrap
  2. 镜像 registry.redhat.io 中与您需要的任何镜像流关联的镜像

    $ oc image mirror registry.redhat.io/rhscl/ruby-25-rhel7:latest ${MIRROR_ADDR}/rhscl/ruby-25-rhel7:latest
    Copy to Clipboard Toggle word wrap
  3. 创建集群的镜像配置对象:

    $ oc create configmap registry-config --from-file=${MIRROR_ADDR_HOSTNAME}..5000=$path/ca.crt -n openshift-config
    Copy to Clipboard Toggle word wrap
  4. 在集群的镜像配置对象中,为镜像添加所需的可信 CA:

    $ oc patch image.config.openshift.io/cluster --patch '{"spec":{"additionalTrustedCA":{"name":"registry-config"}}}' --type=merge
    Copy to Clipboard Toggle word wrap
  5. 更新 Cluster Samples Operator 配置对象中的 samplesRegistry 字段,使其包含镜像配置中定义的镜像位置的 hostname 部分:

    $ oc edit configs.samples.operator.openshift.io -n openshift-cluster-samples-operator
    Copy to Clipboard Toggle word wrap
    注意

    这是必要的,因为镜像流导入过程在此刻不使用镜像(mirro)或搜索机制。

  6. 将所有未镜像的镜像流添加到 Cluster Samples Operator 配置对象的 skippedImagestreams 字段。或者,如果您不想支持任何示例镜像流,在 Cluster Samples Operator 配置对象中将 Cluster Samples Operator 设置为 Removed

    注意

    如果镜像流导入失败,Cluster Samples Operator 会发出警告,但 Cluster Samples Operator 会定期重试,或看起来并没有重试它们。

    openshift 命名空间中的许多模板都引用镜像流。因此,使用 Removed 清除镜像流和模板,将避免在因为缺少镜像流而导致镜像流和模板无法正常工作时使用它们。

3.4.1. 协助镜像的 Cluster Samples Operator

在安装过程中,Red Hat OpenShift Service on AWS 在 openshift-cluster-samples-operator 命名空间中创建一个名为 imagestreamtag-to-image 的配置映射。imagestreamtag-to-image 配置映射包含每个镜像流标签的条目(填充镜像)。

配置映射中 data 字段中每个条目的键格式为 <image_stream_name>_<image_stream_tag_name>

在断开连接的 Red Hat OpenShift Service on AWS 上安装过程中,Cluster Samples Operator 的状态被设置为 Removed。如果您将其改为 Managed,它会安装示例。

注意

在网络限制或断开连接的环境中使用示例可能需要通过网络访问服务。某些示例服务包括:Github、Maven Central、npm、RubyGems、PyPi 等。这可能需要执行额外的步骤,让集群 samples operator 对象能够访问它们所需的服务。

您可以使用此配置映射作为导入镜像流所需的镜像的引用。

  • 在 Cluster Samples Operator 被设置为 Removed 时,您可以创建镜像的 registry,或决定您要使用哪些现有镜像 registry。
  • 使用新的配置映射作为指南来镜像您要镜像的 registry 的示例。
  • 将没有镜像的任何镜像流添加到 Cluster Samples Operator 配置对象的 skippedImagestreams 列表中。
  • 将 Cluster Samples Operator 配置对象的 samplesRegistry 设置为已镜像的 registry。
  • 然后,将 Cluster Samples Operator 设置为 Managed 来安装您已镜像的镜像流。

如需了解详细信息,请参阅使用带有备用或镜像 registry 的 Cluster Samples Operator 镜像流

第 4 章 创建镜像

了解如何基于就绪可用的预构建镜像来创建自己的容器镜像。此过程包括学习编写镜像、定义镜像元数据、测试镜像以及使用自定义构建程序工作流创建用于 Red Hat OpenShift Service on AWS 的镜像的最佳实践。

4.1. 学习容器最佳实践

在创建在 Red Hat OpenShift Service on AWS 上运行的容器镜像时,需要考虑很多最佳实践,以确保这些镜像的用户具有良好的体验。由于镜像旨在不可变且原样使用,所以以下准则有助于确保您的镜像高度可用且易于在 Red Hat OpenShift Service on AWS 上使用。

4.1.1. 常规容器镜像准则

一般情况下,以下指南适用于创建容器镜像,并独立于镜像在 Red Hat OpenShift Service on AWS 上使用。

重复利用镜像

您的镜像尽可能使用 FROM 语句基于适当的上游镜像。这可确保,在上游镜像更新时您的镜像也可轻松从中获取安全修复,而不必再直接更新依赖项。

此外,请使用 FROM 指令中的标签(如 rhel:rhel7),方便用户准确了解您的镜像基于哪个版本的镜像。使用除 latest 以外的标签可确保您的镜像不受 latest 版上游镜像重大更改的影响。

在标签内维持兼任性

在为自己的镜像添加标签时,建议尽量在标签内保持向后兼容性。例如,如果您提供名为 image 的镜像,且当前包含 1.0 版本,您可以提供一个 image:v1 标签。当您更新镜像时,只要它仍然与原始镜像兼容,您可以继续标记新镜像 image:v1,并且此标签的下游用户就可以获得更新,而不会出现问题。

如果后续发布了不兼容的更新,则切换到新标签,如 image:v2。这样,下游用户就可以根据需要选择是否升级到新版本,而不会因为不兼容的新镜像造成问题。下游用户如果使用 image:latest,则可能要承担引入不兼容更改的风险。

避免多进程

不要在同一容器中启动多个服务,如数据库和 SSHD。因为容器是轻量级的,可轻松链接到一起以编排多个进程,所以没有在同一个容器中启动多个服务的必要。Red Hat OpenShift Service on AWS 允许您通过将相关镜像分组到一个 pod 中来轻松并置和共同管理相关镜像。

这种并置可确保容器共享一个网络命名空间和存储进行通信。因为对每个镜像的更新频率较低且可以独立进行,所以更新所可能带来的破坏风险也较小,单一进程的信号处理流程也更加清晰,因为无需管理将信号路由到多个分散进程的操作。

在 wrapper 脚本中使用 exec

很多镜像在启动正在运行的软件的进程前,会先使用 wrapper 脚本进行一些设置。如果您的镜像使用这类脚本,则该脚本应使用 exec,以便使您的软件可以替代脚本的进程。如果不使用 exec,则容器运行时发送的信号将进入 wrapper 脚本,而非软件的进程。这不是您想要的。

如果您有一个为某些服务器启动进程的 wrapper 脚本。您启动了容器(例如使用 podman run -i),该容器运行 wrapper 脚本,继而启动您的进程。如果要使用 CTRL+C 关闭容器。如果您的 wrapper 脚本使用了 exec 来启动服务器进程,则 podman 会将 SIGINT 发送至服务器进程,一切都可以正常工作。如果您没有在 wrapper 脚本中使用 exec,则 podman 会将 SIGINT 发送至 wrapper 脚本的进程,并且您的进程不会象任何情况一样继续运行。

另请注意,您的进程在容器中运行时,将作为 PID 1 运行。这意味着,如果主进程终止,则整个容器都会停止,取消您从 PID 1 进程启动的所有子进程。

清理临时文件

删除构建过程中创建的所有临时文件。这也包括通过 ADD 命令添加的任何文件。例如,在执行 yum install 操作后运行 yum clean 命令。

您可按照如下所示创建 RUN 语句来防止 yum 缓存最终留在镜像层:

RUN yum -y install mypackage && yum -y install myotherpackage && yum clean all -y
Copy to Clipboard Toggle word wrap

请注意,如果您改写为:

RUN yum -y install mypackage
RUN yum -y install myotherpackage && yum clean all -y
Copy to Clipboard Toggle word wrap

则首次 yum 调用会将额外文件留在该层,后续运行 yum clean 操作时无法删除这些文件。最终镜像中看不到这些额外文件,但它们存在于底层中。

如果在较早层中删除了一些内容时,当前容器构建进程不允许在较晚的层中运行一个命令来缩减镜像使用的空间。但是,这个行为可能会在以后的版本中有所改变。这表示,如果在较晚层中执行 rm 命令,虽然被这个命令删除的文件不会出现在镜像中,但它不会使下载的镜像变小。因此,与 yum clean 示例一样,最好尽可能使用创建文件的同一命令删除文件,以免文件最终写入层中。

另外,在单个 RUN 语句中执行多个命令可减少镜像中的层数,缩短下载和提取时间。

按正确顺序放置指令

容器构建程序读取 Dockerfile,并自上而下运行指令。成功执行的每个指令都会创建一个层,可在下次构建该镜像或其他镜像时重复使用。务必要将很少更改的指令放置在 Dockerfile 的顶部。这样做可确保下次构建相同镜像会非常迅速,因为缓存不会因为上层变化而失效。

例如:如果您正在使用 Dockerfile,它包含一个用于安装正在迭代的文件的 ADD 命令,以及一个用于 yum install 软件包的 RUN 命令,则最好将 ADD 命令放在最后:

FROM foo
RUN yum -y install mypackage && yum clean all -y
ADD myfile /test/myfile
Copy to Clipboard Toggle word wrap

这样,您每次编辑 myfile 和重新运行 podman builddocker build 时,系统都可重复利用 yum 命令的缓存层,仅为 ADD 操作生成新层。

如果您将 Dockerfile 改写为:

FROM foo
ADD myfile /test/myfile
RUN yum -y install mypackage && yum clean all -y
Copy to Clipboard Toggle word wrap

则您每次更改 myfile 和重新运行 podman builddocker build 时,ADD 操作都会导致 RUN 层缓存无效,因此 yum 操作也必须要重新运行。

标记重要端口

EXPOSE 指令使主机系统和其它容器可使用容器中的端口。尽管可以指定应当通过 podman run 调用来公开端口,但在 Dockerfile 中使用 EXPOSE 指令可显式声明您的软件需要运行的端口,让用户和软件更易于使用您的镜像:

  • 公开端口显示在 podman ps 下,与从您的镜像创建的容器关联。
  • 公开端口存在于 podman inspect 返回的镜像元数据中。
  • 当将一个容器链接到另一容器时,公开端口也会链接到一起
设置环境变量

设置环境变量的最佳做法是使用 ENV 指令设置环境变量。一个例子是设置项目版本。这让人可以无需通过查看 Dockerfile 便可轻松找到版本。另一示例是在系统上公告可供其他进程使用的路径,如 JAVA_HOME

避免默认密码

避免设置默认密码。许多人扩展镜像时会忘记删除或更改默认密码。如果在生产环境中的用户被分配了众所周知的密码,则这可能引发安全问题。可以使用环境变量来配置密码。

如果您的确要选择设置默认密码,请确保在容器启动时显示适当的警告消息。消息中应告知用户默认密码的值并说明如何修改密码,例如要设置什么环境变量。

避免 sshd

最好避免在您的镜像中运行 sshd。您可使用 podman execdocker exec 命令访问本地主机上运行的容器。另外,您可以使用 oc exec 命令或 oc rsh 命令访问 Red Hat OpenShift Service on AWS 集群上运行的容器。在镜像中安装并运行 sshd 会为安全攻击打开额外通道,因而需要安装安全补丁。

对持久性数据使用卷

镜像应对持久性数据使用。这样,Red Hat OpenShift Service on AWS 将网络存储挂载到运行容器的节点,如果容器移至新节点,则存储会重新附加到该节点。通过使用卷来满足所有持久性存储需求,即使容器重启或移动,其内容也会保留下来。如果您的镜像将数据写入容器中的任意位置,则其内容可能无法保留。

所有在容器销毁后仍需要保留的数据都必须写入卷中。容器引擎支持容器的 readonly 标记,可用于严格执行不将数据写入容器临时存储的良好做法。现在围绕该功能设计您的镜像,将更便于以后利用。

Dockerfile 中显式定义卷可方便镜像用户轻松了解在运行您的镜像时必须要定义的卷。

如需有关如何在 Red Hat OpenShift Service on AWS 中使用卷的更多信息,请参阅 Kubernetes 文档

注意

即使具有持久性卷,您的镜像的每个实例也都有自己的卷,且文件系统不会在实例之间共享。这意味着卷无法用于共享集群中的状态。

4.1.2. Red Hat OpenShift Service on AWS 特定指南

以下是创建专门用于 Red Hat OpenShift Service on AWS 的容器镜像时适用的准则。

4.1.2.1. 启用 Source-to-Image (S2I) 的镜像

对于计划运行由第三方提供的应用程序代码的镜像,例如专为运行由开发人员提供的 Ruby 代码而设计的 Ruby 镜像,您可以让镜像与 Source-to-Image (S2I) 构建工具协同工作。S2I 是一个框架,便于编写以应用程序源代码为输入的镜像和生成以运行汇编应用程序为输出的新镜像。

4.1.2.2. 支持任意用户 id

默认情况下,Red Hat OpenShift Service on AWS 使用任意分配的用户 ID 运行容器。这对因容器引擎漏洞而逸出容器的进程提供了额外的安全防护,从而避免在主机节点上出现未授权的权限升级的问题。

对于支持以任意用户身份运行的镜像,由镜像中进程写入的目录和文件应归 root 组所有,并可由该组读/写。待执行文件还应具有组执行权限。

向 Dockerfile 中添加以下内容可将目录和文件权限设置为允许 root 组中的用户在构建镜像中访问它们:

RUN chgrp -R 0 /some/directory && \
    chmod -R g=u /some/directory
Copy to Clipboard Toggle word wrap

因为容器用户始终是 root 组的成员,所以容器用户可以读写这些文件。

警告

在更改容器敏感区域的目录和文件权限时,需要格外小心。在对敏感区域(如 /etc/passwd)应用更改时,可能会造成这些文件被意料外的用户修改,并可能会导致容器或主机被暴露。CRI-O 支持将任意用户 ID 插入容器的 /etc/passwd 文件中。因此,不需要更改权限。

此外,/etc/passwd 文件不应存在于任何容器镜像中。如果这样做,CRI-O 容器运行时将无法将随机 UID 注入 /etc/passwd 文件。在这种情况下,容器可能会在解决活跃 UID 时面临挑战。无法满足这些要求可能会影响某些容器化应用的功能。

此外,容器中运行的进程不是以特权用户身份运行,因此不得监听特权端口(低于 1024 的端口)。

4.1.2.3. 使用服务进行镜像间通信

对于您的镜像需要与另一个镜像提供的服务通信的情况,如需要访问数据库镜像来存储和检索数据的 web 前端镜像,您的镜像会使用 Red Hat OpenShift Service on AWS 服务。服务为访问提供静态端点,该端点不会随着容器的停止、启动或移动而改变。此外,服务还会为请求提供负载均衡。

4.1.2.4. 提供通用库

对于要运行由第三方提供的应用程序代码的镜像,请确保您的镜像包含适用于您的平台的通用库。特别要为平台使用的通用数据库提供数据库驱动程序。例如,在创建 Java 框架镜像时,要为 MySQL 和 PostgreSQL 提供 JDBC 驱动程序。这样做可避免在应用程序汇编期间下载通用依赖项,从而加快应用程序镜像构建。此外还简化了应用程序开发人员为确保满足所有依赖项而需要做的工作。

4.1.2.5. 使用环境变量进行配置

您的镜像用户应在无需基于您的镜像创建下游镜像的情况下也可进行配置。这意味着运行时配置使用环境变量进行处理。对于简单的配置,运行中的进程可直接使用环境变量。对于更为复杂的配置或对于不支持此操作的运行时,可通过定义启动过程中处理的模板配置文件来配置运行时。在此处理过程中,可将使用环境变量提供的值替换到配置文件中,或用于决定要在配置文件中设置哪些选项。

此外,也可以使用环境变量将证书和密钥等 secret 传递到容器中,这是建议操作。这样可确保 secret 值最终不会提交到镜像中,也不会泄漏到容器镜像 registry 中。

提供环境变量可方便您的镜像用户自定义行为,如数据库设置、密码和性能调优,而无需在镜像顶部引入新层。相反,用户可在定义 pod 时简单定义环境变量值,且无需重新构建镜像也可更改这些设置。

对于极其复杂的场景,还可使用在运行时挂载到容器中的卷来提供配置。但是,如果选择这种配置方式时,您必须确保当不存在必要卷或配置时,您的镜像可在启动时提供清晰的错误消息。

本主题与“使用服务进行镜像间通信”主题之间的相关之处在于,数据源等配置应当根据提供服务端点信息的环境变量来定义。这允许应用程序动态使用 Red Hat OpenShift Service on AWS 环境中定义的数据源服务,而无需修改应用程序镜像。

另外,调整应通过检查容器的 cgroups 设置来实现。这使得镜像可根据可用内存、CPU 和其他资源自行调整。例如,基于 Java 的镜像应根据 cgroup 最大内存参数调整其堆大小,以确保不超过限值且不出现内存不足错误。

4.1.2.6. 设置镜像元数据

定义镜像元数据有助于 Red Hat OpenShift Service on AWS 更好地使用您的容器镜像,允许 Red Hat OpenShift Service on AWS 为使用您的镜像的开发人员创建更好的体验。例如,您可以添加元数据以提供有用的镜像描述,或针对可能也需要的其他镜像提供建议。

4.1.2.7. 集群

您必须充分了解运行镜像的多个实例的意义。在最简单的情况下,服务的负载均衡功能会处理将流量路由到镜像的所有实例。但是,许多框架必须共享信息才能执行领导选举机制或故障转移状态,例如在会话复制中。

考虑您的实例在 Red Hat OpenShift Service on AWS 中运行时如何完成此通信。尽管 pod 之间可直接相互通信,但其 IP 地址会随着 pod 的启动、停止和移动而变化。因此,集群方案必须是动态的。

4.1.2.8. 日志记录

最好将所有日志记录发送至标准输出。Red Hat OpenShift Service on AWS 从容器收集标准输出,并将其发送到可查看的集中式日志记录服务。如果必须将日志内容区分开来,请在输出前添加适当关键字,这样便可过滤消息。

如果您的镜像日志记录到文件,则用户必须通过手动操作进入运行中的容器,并检索或查看日志文件。

4.1.2.9. 存活 (liveness) 和就绪 (readiness) 探针

记录可用于您的镜像的示例存活和就绪探针。有了这些探针,用户便可放心部署您的镜像,确保在容器准备好处理流量之前,流量不会路由到容器,并且如果进程进入不健康状态,容器将重启。

4.1.2.10. 模板

考虑为您的镜像提供一个示例模板。用户借助模板可轻松利用有效的配置快速部署您的镜像。模板应包括与镜像一同记录的存活和就绪探针,以保证完整性。

4.2. 包括镜像中的元数据

定义镜像元数据可帮助 Red Hat OpenShift Service on AWS 更好地使用您的容器镜像,允许 Red Hat OpenShift Service on AWS 为使用您的镜像的开发人员创建更好的体验。例如,您可以添加元数据以提供有用的镜像描述,或针对可能也需要的其他镜像提供建议。

本主题仅定义当前用例集所需的元数据。以后可能还会添加其他元数据或用例。

4.2.1. 定义镜像元数据

您可使用 Dockerfile 中的 LABEL 指令来定义镜像元数据。标签与环境变量的相似之处在于标签是附加到镜像或容器中的键值对。标签与环境变量的不同之处在于标签对运行中的应用程序不可见,可用于快速查找镜像和容器。

有关 LABEL 指令的更多信息,请参阅 Docker 文档

标签名称通常具有命名空间。命名空间会进行相应设置,以反映将要提取和使用标签的项目。对于 Red Hat OpenShift Service on AWS,命名空间被设置为 io.openshift,对于 Kubernetes,命名空间被设置为 io.k8s

有关格式的详细信息,请参阅 Docker 自定义元数据文档。

Expand
表 4.1. 所支持的元数据
变量描述

io.openshift.tags

该标签包含一个标签列表,以逗号分隔的字符串值的列表表示。标签是将容器镜像归类到广泛功能区域的方法。标签有助于 UI 和生成工具在应用程序创建过程中建议相关容器镜像。

LABEL io.openshift.tags   mongodb,mongodb24,nosql
Copy to Clipboard Toggle word wrap

io.openshift.wants

指定标签列表,如果您未向容器镜像附带给定标签,则生成工具和 UI 可使用该列表提供相关建议。例如,如果容器镜像需要 mysqlredis,而您未向容器镜像附带 redis 标签,则 UI 可能会建议您将此镜像添加到部署中。

LABEL io.openshift.wants   mongodb,redis
Copy to Clipboard Toggle word wrap

io.k8s.description

该标签可用于向容器镜像用户提供有关此镜像所提供服务或功能的更详细信息。然后 UI 可结合使用此描述与容器镜像名称,为最终用户提供更人性化的信息。

LABEL io.k8s.description The MySQL 5.5 Server with master-slave replication support
Copy to Clipboard Toggle word wrap

io.openshift.non-scalable

镜像可以使用此变量来表明它不支持扩展。UI 然后将这一信息传达给该镜像的用户。不可扩展表示 replicas 值的最初设置不应超过 1

LABEL io.openshift.non-scalable     true
Copy to Clipboard Toggle word wrap

io.openshift.min-memoryio.openshift.min-cpu

该标签建议容器镜像正常工作可能需要的资源量。UI 可能会警告用户:部署此容器镜像可能会超出其用户配额。值必须与 Kubernetes 数量兼容。

LABEL io.openshift.min-memory 16Gi
LABEL io.openshift.min-cpu     4
Copy to Clipboard Toggle word wrap

4.3. 使用 Source-to-image 从源代码创建镜像

Source-to-Image (S2I) 是一种框架,它可以轻松地将应用程序源代码作为输入,生成可运行编译的应用程序的新镜像。

使用 S2I 构建可重复生成的容器镜像的主要优点是便于开发人员使用。作为构建器镜像作者,您必须理解两个基本概念,构建过程和 S2I 脚本,才能让您的镜像提供最佳的 S2I 性能。

4.3.1. 了解 source-to-image 构建过程

构建过程包含以下三个基本元素,这些元素组合成最终的容器镜像:

  • Source-to-image(S2I)脚本
  • 构建器镜像

S2I 生成带有构建器镜像的 Dockerfile 作为第一个 FROM 指令。然后,由 S2I 生成的 Dockerfile 会被传递给 Buildah。

4.3.2. 如何编写 Source-to-image 脚本

您可以使用任何编程语言编写 S2I 脚本,只要脚本可在构建器镜像中执行。S2I 支持多种提供 assemble/run/save-artifacts 脚本的选项。每次构建时按以下顺序检查所有这些位置:

  1. 构建配置中指定的脚本。
  2. 在应用程序源 .s2i/bin 目录中找到的脚本。
  3. 在默认镜像 URL 中找到的带有 io.openshift.s2i.scripts-url 标签的脚本。

镜像中指定的 io.openshift.s2i.scripts-url 标签和构建配置中指定的脚本都可以采用以下形式之一:

  • image:///path_to_scripts_dir:镜像中 S2I 脚本所处目录的绝对路径
  • file:///path_to_scripts_dir:主机上 S2I 脚本所处目录的相对或绝对路径
  • http(s)://path_to_scripts_dir:S2I 脚本所处目录的 URL
Expand
表 4.2. S2I 脚本
脚本描述

assemble

assemble 用来从源代码构建应用程序工件,并将其放置在镜像内部的适当目录中的脚本。这个脚本是必需的。此脚本的工作流为:

  1. 可选:恢复构建工件。如果要支持增量构建,确保同时定义了 save-artifacts
  2. 将应用程序源放在所需的位置。
  3. 构建应用程序工件。
  4. 将工件安装到适合它们运行的位置。

run

run 脚本将执行您的应用程序。这个脚本是必需的。

save-artifacts

save-artifacts 脚本将收集所有可加快后续构建过程的依赖项。这个脚本是可选的。例如:

  • 对于 Ruby,由 Bundler 安装的 gem
  • 对于 Java,.m2 内容。

这些依赖项会收集到一个 tar 文件中,并传输到标准输出。

usage

借助 usage 脚本,可以告知用户如何正确使用您的镜像。这个脚本是可选的。

test/run

借助 test/run 脚本,可以创建一个进程来检查镜像是否正常工作。这个脚本是可选的。该流程的建议工作流是:

  1. 构建镜像。
  2. 运行镜像以验证 usage 脚本。
  3. 运行 s2i build 以验证 assemble 脚本。
  4. 可选:再次运行 s2i build,以验证 save-artifactsassemble 脚本的保存和恢复工件功能。
  5. 运行镜像,以验证测试应用程序是否正常工作。
注意

建议将 test/run 脚本构建的测试应用程序放置到镜像存储库中的 test/test-app 目录。

S2I 脚本示例

以下示例 S2I 脚本采用 Bash 编写。每个示例都假定其 tar 内容解包到 /tmp/s2i 目录中。

assemble 脚本:

#!/bin/bash

# restore build artifacts
if [ "$(ls /tmp/s2i/artifacts/ 2>/dev/null)" ]; then
    mv /tmp/s2i/artifacts/* $HOME/.
fi

# move the application source
mv /tmp/s2i/src $HOME/src

# build application artifacts
pushd ${HOME}
make all

# install the artifacts
make install
popd
Copy to Clipboard Toggle word wrap

run 脚本:

#!/bin/bash

# run the application
/opt/application/run.sh
Copy to Clipboard Toggle word wrap

save-artifacts 脚本:

#!/bin/bash

pushd ${HOME}
if [ -d deps ]; then
    # all deps contents to tar stream
    tar cf - deps
fi
popd
Copy to Clipboard Toggle word wrap

usage 脚本:

#!/bin/bash

# inform the user how to use the image
cat <<EOF
This is a S2I sample builder image, to use it, install
https://github.com/openshift/source-to-image
EOF
Copy to Clipboard Toggle word wrap

4.4. 关于测试 source-to-image 镜像

作为 Source-to-Image (S2I)构建器镜像作者,您可以在本地测试 S2I 镜像,并使用 Red Hat OpenShift Service on AWS 构建系统进行自动测试和持续集成。

为了成功运行 S2I 构建,S2I 需要存在 assemblerun 脚本。提供 save-artifacts 脚本可重复利用构建工件,而提供 usage 脚本则可确保有人在 S2I 以外运行容器镜像时,使用情况信息能够打印到控制台上。

测试 S2I 镜像的目的在于确保所有这些描述命令均能正常工作,即使基本容器镜像已改变或命令所用工具已更新也不受影响。

4.4.1. 了解测试要求

test 脚本的标准位置为 test/run。此脚本由 Red Hat OpenShift Service on AWS S2I 镜像构建器调用,可以是一个简单的 Bash 脚本或静态 Go 二进制文件。

test/run 脚本会执行 S2I 构建,因此您的 $PATH 中必须有 S2I 二进制文件。必要情况下,请遵循 S2I README 中的安装说明。

S2I 结合了应用程序源代码与构建程序镜像,因此为了对其进行测试,您需要一个示例应用程序源来验证该源是否成功转换成了可运行的容器镜像。示例应用程序应简单,但也应执行 assemblerun 脚本的关键步骤。

4.4.2. 生成脚本和工具

S2I 工具随附功能强大的生成工具,可加快新 S2I 镜像的创建过程。s2i create 命令生成所有必要的 S2I 脚本和测试工具以及 Makefile

$ s2i create <image_name> <destination_directory>
Copy to Clipboard Toggle word wrap

所生成的 test/run 脚本必须经过调整才可使用,但它为开始开发提供了一个良好起点。

注意

s2i create 命令生成的 test/run 脚本要求示例应用程序源位于 test/test-app 目录中。

4.4.3. 本地测试

本地运行 S2I 镜像测试的最简单方法是使用所生成的 Makefile

如果未使用 s2i create 命令,则可复制以下 Makefile 模板,并将 IMAGE_NAME 参数替换为您的镜像名称。

Makefile 示例

IMAGE_NAME = openshift/ruby-20-centos7
CONTAINER_ENGINE := $(shell command -v podman 2> /dev/null | echo docker)

build:
	${CONTAINER_ENGINE} build -t $(IMAGE_NAME) .

.PHONY: test
test:
	${CONTAINER_ENGINE} build -t $(IMAGE_NAME)-candidate .
	IMAGE_NAME=$(IMAGE_NAME)-candidate test/run
Copy to Clipboard Toggle word wrap

4.4.4. 基本测试工作流

test 脚本会假定您已构建要测试的镜像。如果需要,请先构建 S2I 镜像。运行以下任一命令:

  • 如果使用 Podman,请运行以下命令:

    $ podman build -t <builder_image_name>
    Copy to Clipboard Toggle word wrap
  • 如果使用 Docker,请运行以下命令:

    $ docker build -t <builder_image_name>
    Copy to Clipboard Toggle word wrap

以下步骤描述测试 S2I 镜像构建程序的默认工作流:

  1. 验证 usage 脚本是否正在工作:

    • 如果使用 Podman,请运行以下命令:

      $ podman run <builder_image_name> .
      Copy to Clipboard Toggle word wrap
    • 如果使用 Docker,请运行以下命令:

      $ docker run <builder_image_name> .
      Copy to Clipboard Toggle word wrap
  2. 构建镜像:

    $ s2i build file:///path-to-sample-app _<BUILDER_IMAGE_NAME>_ _<OUTPUT_APPLICATION_IMAGE_NAME>_
    Copy to Clipboard Toggle word wrap
  3. 可选:如果支持 save-artifacts,请再次运行第 2 步,验证保存和恢复工件是否正常工作。
  4. 运行容器:

    • 如果使用 Podman,请运行以下命令:

      $ podman run <output_application_image_name>
      Copy to Clipboard Toggle word wrap
    • 如果使用 Docker,请运行以下命令:

      $ docker run <output_application_image_name>
      Copy to Clipboard Toggle word wrap
  5. 验证容器是否正在运行,应用程序是否有所反应。

通常,运行这些步骤便足以说明构建程序镜像是否按预期工作。

4.4.5. 使用 Red Hat OpenShift Service on AWS 构建镜像

您有一个 Dockerfile 和其他组成新 S2I 构建器镜像的工件后,您可以将其放置在 git 存储库中,并使用 Red Hat OpenShift Service on AWS 构建和推送镜像。定义指向您的存储库的 Docker 构建。

如果您的 Red Hat OpenShift Service on AWS 实例托管在一个公共 IP 地址上,则每次推送到 S2I 构建器镜像 GitHub 仓库时都可以触发构建。

您还可使用 ImageChangeTrigger 来基于您所更新的 S2I 构建程序镜像来触发应用程序的重新构建。

第 5 章 管理镜像

5.1. 管理镜像概述

通过 Red Hat OpenShift Service on AWS,您可以与镜像交互并设置镜像流,具体取决于镜像的 registry 所处的位置、这些 registry 的任何身份验证要求以及您预期的构建和部署性能。

5.1.1. 镜像概述

镜像流包含由标签识别的任意数量的容器镜像。提供相关镜像的单一虚拟视图,类似于容器镜存储库。

通过监控镜像流,构建和部署可在添加或修改新镜像时收到通知,并通过分别执行构建或部署来作出反应。

5.2. 标记镜像

以下小节提供了在容器镜像上下文中使用镜像标签的概述和说明,以便使用 Red Hat OpenShift Service on AWS 镜像流及其标签。

5.2.1. 镜像标签

镜像标签(tag)是应用于存储库中容器镜像的标签,用于将特定镜像与镜像流中的其他镜像区分开来。标签通常代表某种版本号。例如,这里 :v3.11.59-2 是标签:

registry.access.redhat.com/openshift3/jenkins-2-rhel7:v3.11.59-2
Copy to Clipboard Toggle word wrap

您可以向镜像添加其他标签。例如,可为镜像分配 :v3.11.59-2:latest 标签。

Red Hat OpenShift Service on AWS 提供了 oc tag 命令,该命令类似于 docker tag 命令,但会在镜像流上运行,而不是直接在镜像上运行。

5.2.2. 镜像标签惯例

镜像随时间不断发展,其标签反应了这一点。一般来说,镜像标签会始终指向最新镜像构建。

如果标签名称中嵌入太多信息,如 v2.0.1- May-2019,则标签仅指向镜像的一个版本,不会更新。使用默认镜像修剪选项,此类镜像不会被删除。

如果标签命名为 v2.0,则镜像修改的可能性更大。这会导致标签历史记录更长,镜像修剪器 (pruner) 也更有可能删除旧的和未使用的镜像。

您可自行决定标签命名惯例,下面提供了一些 <image_name>:<image_tag> 格式的示例:

Expand
表 5.1. 镜像标签命名惯例
描述示例

修订

myimage:v2.0.1

架构

myimage:v2.0-x86_64

基础镜像

myimage:v1.2-centos7

最新(可能不稳定)

myimage:latest

最新稳定

myimage:stable

如果标签名称中需要日期,请定期检查旧的和不受支持的镜像以及 istags,并予以删除。否则,您可能遇到保留的旧镜像导致资源使用量增加的情况。

5.2.3. 向镜像流中添加标签

Red Hat OpenShift Service on AWS 中的镜像流包含 0 个或更多由标签标识的容器镜像。

有各种不同类型的标签可用。默认行为使用 permanent 标签,指向一段时间内的特定镜像。如果正在使用 permanent 标签并且源更改,则目的地的标签不会更改。

tracking 标签表示,在导入源标签期间对目的地标签的元数据进行了更新。

流程

  • 您可使用 oc tag 命令向镜像流中添加标签:

    $ oc tag <source> <destination>
    Copy to Clipboard Toggle word wrap

    例如:要将 ruby 镜像流 static-2.0标签配置为始终引用 ruby镜像流2.0 标签的当前镜像:

    $ oc tag ruby:2.0 ruby:static-2.0
    Copy to Clipboard Toggle word wrap

    这会在 ruby 镜像流中创建名为 static-2.0 的新镜像流标签。运行 oc tag 时,新标签会直接引用 ruby:2.0 镜像流标签所指向的镜像 id,而所指向的镜像不会改变。

  • 为确保目标标签在源标签更改时进行更新,请使用 --alias=true 标志:

    $ oc tag --alias=true <source> <destination>
    Copy to Clipboard Toggle word wrap
注意

使用跟踪标签创建持久别名,如 lateststable。该标签只在单一镜像流中正常工作。试图创建跨镜像流别名会出错。

  • 您还可添加 --scheduled=true 标志来定期刷新或重新导入目的地标签。周期在系统级别进行全局配置。
  • --reference 标志会创建一个非导入的镜像流标签。该标签持久指向源位置。

    如果要指示 Red Hat OpenShift Service on AWS 始终从集成的 registry 中获取标记的镜像,请使用 --reference-policy=local。registry 使用 pull-through 功能为客户端提供镜像。默认情况下,镜像 Blob 由 registry 在本地进行镜像。因此,下次需要时便可更快拉取(pull)。只要镜像流具有不安全的注解,或者标签具有不安全的导入策略,该标志也允许从不安全的 registry 拉取(pull),无需向容器运行时提供 --insecure-registry

5.2.4. 从镜像流中删除标签

您可以从镜像流中删除标签。

流程

  • 要从镜像流运行中完全删除标签:

    $ oc delete istag/ruby:latest
    Copy to Clipboard Toggle word wrap

    或:

    $ oc tag -d ruby:latest
    Copy to Clipboard Toggle word wrap

5.2.5. 引用镜像流中的镜像

您可以通过以下引用类型,使用标签来引用镜像流中的镜像。

Expand
表 5.2. 镜像流引用类型
引用类型描述

ImageStreamTag

ImageStreamTag 用于引用或检索给定镜像流和标签的镜像。

ImageStreamImage

ImageStreamImage 用于引用或检索给定镜像流和镜像 sha ID 的镜像。

DockerImage

DockerImage 用于引用或检索给定外部 registry 的镜像。其名称使用标准 Docker 拉取(pull)规格

查看镜像流定义示例时,您可能会发现它们包含 ImageStreamTag 的定义以及对 DockerImage 的引用,但与 ImageStreamImage 无关。

这是因为当您将镜像导入或标记到镜像流时,Red Hat OpenShift Service on AWS 中会自动创建 ImageStreamImage 对象。您不必在用于创建镜像流的任何镜像流定义中显式定义 ImageStreamImage 对象。

流程

  • 要引用给定镜像流和标签的镜像,请使用 ImageStreamTag

    <image_stream_name>:<tag>
    Copy to Clipboard Toggle word wrap
  • 要引用给定镜像流的镜像和镜像 sha ID,请使用 ImageStreamImage

    <image_stream_name>@<id>
    Copy to Clipboard Toggle word wrap

    <id> 是针对特定镜像的不可变标识符,也称摘要。

  • 要引用或检索给定外部 registry 的镜像,请使用 DockerImage

    openshift/ruby-20-centos7:2.0
    Copy to Clipboard Toggle word wrap
    注意

    如果未指定标签,则会假定使用 latest标签。

    此外,您还可引用第三方 registry:

    registry.redhat.io/rhel7:latest
    Copy to Clipboard Toggle word wrap

    或者带有摘要的镜像:

    centos/ruby-22-centos7@sha256:3a335d7d8a452970c5b4054ad7118ff134b3a6b50a2bb6d0c07c746e8986b28e
    Copy to Clipboard Toggle word wrap

5.3. 镜像拉取(pull)策略

Pod 中的每个容器均有容器镜像。在创建了镜像并将其推送(push)到 registry 后,即可在 Pod 中引用它。

5.3.1. 镜像拉取(pull)策略概述

当 Red Hat OpenShift Service on AWS 创建容器时,会使用容器的 imagePullPolicy 来决定是否应在启动容器前拉取(pull)镜像。imagePullPolicy 有三个可能的值:

Expand
表 5.3. imagePullPolicy 值
描述

Always

始终拉取(pull)镜像。

IfNotPresent

仅拉取(pull)节点上不存在的镜像。

Never

永不拉取(pull)镜像。

如果没有指定容器 imagePullPolicy 参数,Red Hat OpenShift Service on AWS 会根据镜像标签进行设置:

  1. 如果标签 是最新的,Red Hat OpenShift Service on AWS 会将 imagePullPolicy 默认设置为 Always
  2. 否则,Red Hat OpenShift Service on AWS 会将 imagePullPolicy 默认设置为 IfNotPresent

5.4. 使用镜像 pull secret

如果您使用 OpenShift 镜像 registry,并且从位于同一项目中的镜像流拉取 (pull),则您的 Pod 服务帐户应已具备正确的权限,且无需额外操作。

但是,对于其他场景,如在 Red Hat OpenShift Service on AWS 项目或安全 registry 中引用镜像,则需要额外的配置步骤。

您可以从 Red Hat OpenShift Cluster Manager 获取镜像 pull secret。此 pull secret 名为 pullSecret

您可以使用此 pull secret 与所含授权机构 Quay.ioregistry.redhat.io 提供的服务进行身份验证,该服务为 Red Hat OpenShift Service on AWS 组件提供容器镜像。

5.4.1. 允许 pod 在项目间引用镜像

使用 OpenShift 镜像 registry 时,要允许 project-a 中的 pod 引用 project-b 中的镜像,project-a 中的服务帐户必须绑定到 project-b 中的 system:image-puller 角色:

注意

在创建 pod 服务帐户或命名空间时,请等待服务帐户置备了 docker pull secret;如果在其服务帐户被完全置备前创建 pod,则 pod 无法访问 OpenShift 镜像 registry。

流程

  1. 要允许 project-a 中的 pod 引用 project-b 中的镜像,请将 project-a 中的服务帐户绑定到 project-b 中的 system:image-puller 角色。

    $ oc policy add-role-to-user \
        system:image-puller system:serviceaccount:project-a:default \
        --namespace=project-b
    Copy to Clipboard Toggle word wrap

    添加该角色后,project-a 中引用默认服务帐户的 pod 能够从 project-b 拉取(pull)镜像。

  2. 要允许访问 project-a 中的任意服务帐户,请使用组:

    $ oc policy add-role-to-group \
        system:image-puller system:serviceaccounts:project-a \
        --namespace=project-b
    Copy to Clipboard Toggle word wrap

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

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

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

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

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

注意

如果有相同的路径,如 quay.ioquay.io/<example_repository>,Docker 和 Podman 凭证文件和关联的 pull secret 可能会包括到同一 registry 的多个引用。但是,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"
      }
   }
}
Copy to Clipboard Toggle word wrap

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
Copy to Clipboard Toggle word wrap

5.4.2.1. 创建 pull secret

流程

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

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

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

      $ oc create secret generic <pull_secret_name> \
           --from-file=<path/to/.config/containers/auth.json> \
           --type=kubernetes.io/podmanconfigjson
      Copy to Clipboard Toggle word wrap
  • 如果您还没有安全 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>
    Copy to Clipboard Toggle word wrap
5.4.2.2. 在工作负载中使用 pull secret

您可以使用 pull secret 来允许工作负载使用以下方法之一从私有 registry 中拉取镜像:

  • 通过将 secret 链接到 ServiceAccount,它会自动将 secret 应用到使用该服务帐户的所有 pod。
  • 通过在工作负载配置中直接定义 imagePullSecrets,这对 GitOps 或 ArgoCD 等环境很有用。

流程

  • 您可以通过将 secret 添加到服务帐户,来使用 secret 为 pod 拉取镜像。请注意,服务帐户的名称应与 Pod 使用的服务帐户的名称匹配。默认服务帐户是 default

    • 输入以下命令将 pull secret 链接到 ServiceAccount

      $ oc secrets link default <pull_secret_name> --for=pull
      Copy to Clipboard Toggle word wrap
    • 要验证更改,请输入以下命令:

      $ oc get serviceaccount default -o yaml
      Copy to Clipboard Toggle word wrap

      输出示例

      apiVersion: v1
      imagePullSecrets:
      - name: default-dockercfg-123456
      - name: <pull_secret_name>
      kind: ServiceAccount
      metadata:
        annotations:
          openshift.io/internal-registry-pull-secret-ref: <internal_registry_pull_secret>
        creationTimestamp: "2025-03-03T20:07:52Z"
        name: default
        namespace: default
        resourceVersion: "13914"
        uid: 9f62dd88-110d-4879-9e27-1ffe269poe3
      secrets:
      - name: <pull_secret_name>
      Copy to Clipboard Toggle word wrap

  • 您也可以直接在 pod 或工作负载定义中引用它,而不是将 secret 链接到服务帐户。这可用于 GitOps 工作流,如 ArgoCD。例如:

    pod 规格示例

    apiVersion: v1
    kind: Pod
    metadata:
      name: <secure_pod_name>
    spec:
      containers:
      - name: <container_name>
        image: quay.io/my-private-image
      imagePullSecrets:
      - name: <pull_secret_name>
    Copy to Clipboard Toggle word wrap

    ArgoCD 工作流示例

    apiVersion: argoproj.io/v1alpha1
    kind: Workflow
    metadata:
      generateName: <example_workflow>
    spec:
      entrypoint: <main_task>
      imagePullSecrets:
      - name: <pull_secret_name>
    Copy to Clipboard Toggle word wrap

私有 registry 可将身份验证委托给单独服务。这种情况下,必须为身份验证和 registry 端点定义镜像 pull secret。

流程

  1. 为委托的身份验证服务器创建 secret:

    $ oc create secret docker-registry \
        --docker-server=sso.redhat.com \
        --docker-username=developer@example.com \
        --docker-password=******** \
        --docker-email=unused \
        redhat-connect-sso
    
    secret/redhat-connect-sso
    Copy to Clipboard Toggle word wrap
  2. 为私有 registry 创建 secret:

    $ oc create secret docker-registry \
        --docker-server=privateregistry.example.com \
        --docker-username=developer@example.com \
        --docker-password=******** \
        --docker-email=unused \
        private-registry
    
    secret/private-registry
    Copy to Clipboard Toggle word wrap

第 6 章 管理镜像流

镜像流提供了一种方式来持续创建和更新容器镜像。随着镜像改进,标签可用于分配新版本号并跟踪变化。本文档描述了对镜像流的管理方式。

6.1. 为什么使用镜像流

镜像流及其关联的标签提供了一个用于从 Red Hat OpenShift Service on AWS 中引用容器镜像的抽象集。镜像流及其标签用于查看可用镜像,确保您使用所需的特定镜像,即使存储库中的镜像发生变化也是如此。

镜像流不含实际镜像数据,它提供了相关镜像的一个单独的虚拟视图,类似于镜像存储库。

您可配置构建(Build)和部署(Depolyment)来监测一个镜像流的通知。当新的镜像被添加时,执行相应的构建或部署。

例如,如果部署正在使用某个镜像并且创建了该镜像的新版本,则会自动执行部署以获取镜像的新版本。

但是,如果部署或构建所用的 imagestreamtag 没有更新,则即使更新了容器镜像 registry 中的容器镜像,构建或部署仍会继续使用之前的,已知良好的镜像。

源镜像可存储在以下任一位置:

  • Red Hat OpenShift Service on AWS 的集成 registry。
  • 一个外部 registry,如 registry.redhat.io 或 quay.io。
  • Red Hat OpenShift Service on AWS 集群中的其他镜像流。

当您定义引用镜像流标签的对象时,如构建或部署配置,您将指向镜像流标签而不是存储库。构建或部署应用程序时,Red Hat OpenShift Service on AWS 会使用镜像流标签查询存储库,以查找镜像的关联 ID 并使用确切的镜像。

镜像流元数据会与其他集群信息一起存储在 etcd 实例中。

使用镜像流有以下几大优势:

  • 您可以添加标签、回滚标签和快速处理镜像,而无需使用命令行重新执行 push 操作。
  • 当一个新镜像被推送(push)到 registry 时,可触发构建和部署。另外,Red Hat OpenShift Service on AWS 为其他资源(如 Kubernetes 对象)提供了通用触发器。
  • 您可以为定期重新导入标记标签。如果源镜像已更改,则这个更改会被发现并反应在镜像流中。取决于构建或部署的具体配置,这可能会触发构建和/或部署流程。
  • 您可使用细粒度访问控制来共享镜像,快速向整个团队分发镜像。
  • 如果源更改,imagestreamtag 仍将指向已知良好的镜像版本,以确保您的应用程序不会意外中断。
  • 您可以通过镜像流对象的权限配置安全性,以了解谁可以查看和使用镜像。
  • 在集群级别上缺少读取或列出镜像权限的用户仍可使用镜像流来检索项目中标记的镜像。

6.2. 配置镜像流

ImageStream 对象文件包含以下元素。

镜像流对象定义

apiVersion: image.openshift.io/v1
kind: ImageStream
metadata:
  annotations:
    openshift.io/generated-by: OpenShiftNewApp
  labels:
    app: ruby-sample-build
    template: application-template-stibuild
  name: origin-ruby-sample 
1

  namespace: test
spec: {}
status:
  dockerImageRepository: 172.30.56.218:5000/test/origin-ruby-sample 
2

  tags:
  - items:
    - created: 2017-09-02T10:15:09Z
      dockerImageReference: 172.30.56.218:5000/test/origin-ruby-sample@sha256:47463d94eb5c049b2d23b03a9530bf944f8f967a0fe79147dd6b9135bf7dd13d 
3

      generation: 2
      image: sha256:909de62d1f609a717ec433cc25ca5cf00941545c83a01fb31527771e1fab3fc5 
4

    - created: 2017-09-01T13:40:11Z
      dockerImageReference: 172.30.56.218:5000/test/origin-ruby-sample@sha256:909de62d1f609a717ec433cc25ca5cf00941545c83a01fb31527771e1fab3fc5
      generation: 1
      image: sha256:47463d94eb5c049b2d23b03a9530bf944f8f967a0fe79147dd6b9135bf7dd13d
    tag: latest 
5
Copy to Clipboard Toggle word wrap

1
镜像流的名称。
2
Docker 存储库路径,在此处可推送(push)新镜像,以在此镜像流中添加或更新镜像。
3
此镜像流标签当前引用的 SHA 标识符。引用此镜像流标签的资源使用此标识符。
4
此镜像流标签之前引用的 SHA 标识符。可用于回滚至旧镜像。
5
镜像流标签名称。

6.3. 镜像流镜像

从镜像流内部到特定镜像 ID 的镜像流镜像点。

镜像流镜像允许您从标记了镜像的特定镜像流中检索有关镜像的元数据。

每当您将镜像导入或标记到镜像流时,Red Hat OpenShift Service on AWS 中会自动创建镜像流镜像对象。您不必在用于创建镜像流的任何镜像流定义中显式定义镜像流镜像对象。

镜像流镜像包含来自存储库的镜像流名称和镜像 ID,用 @ 符号分隔:

<image-stream-name>@<image-id>
Copy to Clipboard Toggle word wrap

要引用 ImageStream 对象示例中的镜像,镜像流镜像如下所示:

origin-ruby-sample@sha256:47463d94eb5c049b2d23b03a9530bf944f8f967a0fe79147dd6b9135bf7dd13d
Copy to Clipboard Toggle word wrap

6.4. 镜像流标签

镜像流标签是指向镜像流中镜像的命名指针。缩写为 istag。镜像流标签用于引用或检索给定镜像流和标签的镜像。

镜像流标签可引用任何本地管理或外部管理的镜像。它包含镜像历史记录,表示为标签曾指向的所有镜像的堆栈。每当特定镜像流标签下标记新的或现有镜像时,它会被放在历史记录堆栈中的第一个位置。以前,顶层位置位于第二个位置。这样便于回滚,从而让标签再次指向历史镜像。

以下镜像流标签来自 ImageStream 对象:

历史记录中有两个镜像的镜像流标签

kind: ImageStream
apiVersion: image.openshift.io/v1
metadata:
  name: my-image-stream
# ...
  tags:
  - items:
    - created: 2017-09-02T10:15:09Z
      dockerImageReference: 172.30.56.218:5000/test/origin-ruby-sample@sha256:47463d94eb5c049b2d23b03a9530bf944f8f967a0fe79147dd6b9135bf7dd13d
      generation: 2
      image: sha256:909de62d1f609a717ec433cc25ca5cf00941545c83a01fb31527771e1fab3fc5
    - created: 2017-09-01T13:40:11Z
      dockerImageReference: 172.30.56.218:5000/test/origin-ruby-sample@sha256:909de62d1f609a717ec433cc25ca5cf00941545c83a01fb31527771e1fab3fc5
      generation: 1
      image: sha256:47463d94eb5c049b2d23b03a9530bf944f8f967a0fe79147dd6b9135bf7dd13d
    tag: latest
# ...
Copy to Clipboard Toggle word wrap

镜像流标签可以是持久性标签,也可以是跟踪标签。

  • 本文标签是特定于版本的标签,指向镜像的特定版本,如 Python 3.5。
  • 跟踪标签是引用标签,跟随另一个镜像流标签,并可更新以更改它们跟随的镜像,如符号链接。这些新等级无法保证向后兼容。

    例如,Red Hat OpenShift Service on AWS 附带的 最新 镜像流标签是跟踪标签。这意味着,当有新级别可用时,使用 latest 镜像流标签的用户会更新为镜像提供的框架的最新级别。指向 v3.10latest 镜像流标签可以随时更改为 v3.11。请务必注意,这些 latest 镜像流标签的行为与 Docker latest 标签不同。在本例中,latest 镜像流标签不指向 Docker 存储库中的最新镜像。它指向另一个镜像流标签,可能并非镜像的最新版本。例如,如果 latest 镜像流标签指向 v3.10 镜像,则当发布了 3.11 版时,latest 标签不会自动更新至 v3.11,并保持 v3.10,直到手动更新为指向 v3.11 镜像流标签。

    注意

    跟踪标签仅限于单个镜像流,无法引用其他镜像流。

您可以根据自己的需要创建自己的镜像流标签。

镜像流标签由镜像流名称和一个标签组成,用冒号隔开:

<imagestream name>:<tag>
Copy to Clipboard Toggle word wrap

例如:为引用前面 ImageStream 对象示例中的 sha256:47463d94eb5c049b2d23b03a9530bf944f8f967a0fe79147dd6b9135bf7dd13d 镜像,镜像流标签将是:

origin-ruby-sample:latest
Copy to Clipboard Toggle word wrap

6.5. 镜像流更改触发器

当有新版本上游镜像时,镜像流触发器支持自动调用构建和部署。

例如,修改镜像流标签时,构建和部署可以自动启动。实现方法是通过监控特定镜像流标签并在检测到变化时通知构建或部署。

6.6. 使用镜像流

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

重要

不要在默认项目中运行工作负载或共享对默认项目的访问权限。为运行核心集群组件保留默认项目。

以下默认项目被视为具有高度特权:default, kube-public, kube-system, openshift, openshift-infra, openshift-node,其他系统创建的项目的标签 openshift.io/run-level 被设置为 01。依赖于准入插件(如 pod 安全准入、安全性上下文约束、集群资源配额和镜像引用解析)的功能无法在高特权项目中工作。

6.6.1. 获取有关镜像流的信息

您可获取有关镜像流的常规信息及其指向的所有标签的详细信息。

流程

  • 要获取有关镜像流的常规信息及其指向的所有标签的详细信息,请输入以下命令:

    $ oc describe is/<image-name>
    Copy to Clipboard Toggle word wrap

    例如:

    $ oc describe is/python
    Copy to Clipboard Toggle word wrap

    输出示例

    Name:			python
    Namespace:		default
    Created:		About a minute ago
    Labels:			<none>
    Annotations:		openshift.io/image.dockerRepositoryCheck=2017-10-02T17:05:11Z
    Docker Pull Spec:	docker-registry.default.svc:5000/default/python
    Image Lookup:		local=false
    Unique Images:		1
    Tags:			1
    
    3.5
      tagged from centos/python-35-centos7
    
      * centos/python-35-centos7@sha256:49c18358df82f4577386404991c51a9559f243e0b1bdc366df25
          About a minute ago
    Copy to Clipboard Toggle word wrap

  • 要获取有关特定镜像流标签的所有信息,请输入以下命令:

    $ oc describe istag/<image-stream>:<tag-name>
    Copy to Clipboard Toggle word wrap

    例如:

    $ oc describe istag/python:latest
    Copy to Clipboard Toggle word wrap

    输出示例

    Image Name:	sha256:49c18358df82f4577386404991c51a9559f243e0b1bdc366df25
    Docker Image:	centos/python-35-centos7@sha256:49c18358df82f4577386404991c51a9559f243e0b1bdc366df25
    Name:		sha256:49c18358df82f4577386404991c51a9559f243e0b1bdc366df25
    Created:	2 minutes ago
    Image Size:	251.2 MB (first layer 2.898 MB, last binary layer 72.26 MB)
    Image Created:	2 weeks ago
    Author:		<none>
    Arch:		amd64
    Entrypoint:	container-entrypoint
    Command:	/bin/sh -c $STI_SCRIPTS_PATH/usage
    Working Dir:	/opt/app-root/src
    User:		1001
    Exposes Ports:	8080/tcp
    Docker Labels:	build-date=20170801
    Copy to Clipboard Toggle word wrap

    注意

    输出的信息多于显示的信息。

  • 输入以下命令发现镜像流标签支持的构架或操作系统:

    $ oc get istag <image-stream-tag> -ojsonpath="{range .image.dockerImageManifests[*]}{.os}/{.architecture}{'\n'}{end}"
    Copy to Clipboard Toggle word wrap

    例如:

    $ oc get istag busybox:latest -ojsonpath="{range .image.dockerImageManifests[*]}{.os}/{.architecture}{'\n'}{end}"
    Copy to Clipboard Toggle word wrap

    输出示例

    linux/amd64
    linux/arm
    linux/arm64
    linux/386
    linux/mips64le
    linux/ppc64le
    linux/riscv64
    linux/s390x
    Copy to Clipboard Toggle word wrap

6.6.2. 为镜像流添加标签

您可以向镜像流添加其他标签。

流程

  • 使用 `oc tag` 命令添加指向其中一个现有标签的标签:

    $ oc tag <image-name:tag1> <image-name:tag2>
    Copy to Clipboard Toggle word wrap

    例如:

    $ oc tag python:3.5 python:latest
    Copy to Clipboard Toggle word wrap

    输出示例

    Tag python:latest set to python@sha256:49c18358df82f4577386404991c51a9559f243e0b1bdc366df25.
    Copy to Clipboard Toggle word wrap

  • 确认镜像流有两个标签,3.5 指向外部容器镜像,latest 指向同一镜像,因为它基于第一个标签创建而成。

    $ oc describe is/python
    Copy to Clipboard Toggle word wrap

    输出示例

    Name:			python
    Namespace:		default
    Created:		5 minutes ago
    Labels:			<none>
    Annotations:		openshift.io/image.dockerRepositoryCheck=2017-10-02T17:05:11Z
    Docker Pull Spec:	docker-registry.default.svc:5000/default/python
    Image Lookup:		local=false
    Unique Images:		1
    Tags:			2
    
    latest
      tagged from python@sha256:49c18358df82f4577386404991c51a9559f243e0b1bdc366df25
    
      * centos/python-35-centos7@sha256:49c18358df82f4577386404991c51a9559f243e0b1bdc366df25
          About a minute ago
    
    3.5
      tagged from centos/python-35-centos7
    
      * centos/python-35-centos7@sha256:49c18358df82f4577386404991c51a9559f243e0b1bdc366df25
          5 minutes ago
    Copy to Clipboard Toggle word wrap

6.6.3. 为外部镜像添加标签

您可为外部镜像添加标签。

流程

  • 通过使用 oc tag 命令执行所有标签相关操作,添加指向内部或外部镜像的标签:

    $ oc tag <repository/image> <image-name:tag>
    Copy to Clipboard Toggle word wrap

    例如,该命令可将 docker.io/python:3.6.0 镜像映射到 python 镜像流中的 3.6 标签。

    $ oc tag docker.io/python:3.6.0 python:3.6
    Copy to Clipboard Toggle word wrap

    输出示例

    Tag python:3.6 set to docker.io/python:3.6.0.
    Copy to Clipboard Toggle word wrap

    如果外部镜像安全,则您必须创建带有凭证的 secret 以访问该 registry。

6.6.4. 更新镜像流标签

您可以更新标签以反映镜像流中的另一标签。

流程

  • 更新标签:

    $ oc tag <image-name:tag> <image-name:latest>
    Copy to Clipboard Toggle word wrap

    例如,以下命令更新了 latest 标签,以反映镜像流中的 3.6 标签:

    $ oc tag python:3.6 python:latest
    Copy to Clipboard Toggle word wrap

    输出示例

    Tag python:latest set to python@sha256:438208801c4806548460b27bd1fbcb7bb188273d13871ab43f.
    Copy to Clipboard Toggle word wrap

6.6.5. 删除镜像流标签

您可以从镜像流中删除旧标签。

流程

  • 从镜像流中删除旧标签:

    $ oc tag -d <image-name:tag>
    Copy to Clipboard Toggle word wrap

    例如:

    $ oc tag -d python:3.6
    Copy to Clipboard Toggle word wrap

    输出示例

    Deleted tag default/python:3.6
    Copy to Clipboard Toggle word wrap

如需有关 Cluster Samples Operator 如何处理已弃用的镜像流标签的更多信息,请参阅从 Cluster Samples Operator 中删除已弃用的镜像流标签。

6.6.6. 配置定期导入镜像流标签

使用外部容器镜像 registry 时,如需定期重新导入镜像(例如为了获取最新安全更新),可使用 --scheduled 标志。

流程

  1. 调度导入镜像:

    $ oc tag <repository/image> <image-name:tag> --scheduled
    Copy to Clipboard Toggle word wrap

    例如:

    $ oc tag docker.io/python:3.6.0 python:3.6 --scheduled
    Copy to Clipboard Toggle word wrap

    输出示例

    Tag python:3.6 set to import docker.io/python:3.6.0 periodically.
    Copy to Clipboard Toggle word wrap

    此命令会导致 Red Hat OpenShift Service on AWS 定期更新这个特定镜像流标签。此周期是集群范围的设置,默认设为 15 分钟。

  2. 删除定期检查,重新运行上述命令,但忽略 --scheduled 标志。这会将其行为重置为默认值。

    $ oc tag <repositiory/image> <image-name:tag>
    Copy to Clipboard Toggle word wrap

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

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

镜像流可以被配置为从需要身份验证的私有镜像仓库中导入标签和镜像元数据。如果您将 Cluster Samples Operator 用来从 registry.redhat.io 以外的内容拉取内容的 registry 被改为 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
    Copy to Clipboard Toggle word wrap
  2. 配置 secret 后,请创建新镜像流或输入 oc import-image 命令:

    $ oc import-image <imagestreamtag> --from=<image> --confirm
    Copy to Clipboard Toggle word wrap

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

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
    Copy to Clipboard Toggle word wrap

    输出示例

    ---
    Arch:           <none>
    Manifests:      linux/amd64     sha256:6e325b86566fafd3c4683a05a219c30c421fbccbf8d87ab9d20d4ec1131c3451
                    linux/arm64     sha256:d8fad562ffa75b96212c4a6dc81faf327d67714ed85475bf642729703a2b5bf6
                    linux/ppc64le   sha256:7b7e25338e40d8bdeb1b28e37fef5e64f0afd412530b257f5b02b30851f416e1
    ---
    Copy to Clipboard Toggle word wrap

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

    $ oc import-image <multiarch-image-stream-tag>  --from=<registry>/<project_name>/<image-name> \
    --import-mode='Legacy' --confirm
    Copy to Clipboard Toggle word wrap
    注意

    --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
    Copy to Clipboard Toggle word wrap
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
    Copy to Clipboard Toggle word wrap

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

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

流程

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

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

    $ oc import-image <multiarch_image_stream_tag>  --from=<registry>/<project_name>/<image_name> \
    --import-mode='PreserveOriginal'
    Copy to Clipboard Toggle word wrap

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

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

Expand
参数描述

Legacy

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

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

PreserveOriginal

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

第 7 章 Kubernetes 资源使用镜像流

镜像流(作为 Red Hat OpenShift Service on AWS 原生资源)与 Red Hat OpenShift Service on AWS 中提供的所有原生资源(如 BuildDeploymentConfigs 资源)一起工作。也可以将它们用于原生 Kubernetes 资源,如 JobReplicationControllerReplicaSet 或 Kubernetes Deployment 资源。

7.1. 使用 Kubernetes 资源启用镜像流

在 Kubernetes 资源中使用镜像流时,您只能引用位于与资源相同的项目中的镜像流。镜像流引用必须包含单个片段值,如 ruby:2.5,其中 ruby 是镜像流的名称,它具有名为 2.5 的标签,并位于与进行引用的资源相同的项目中。

重要

不要在默认项目中运行工作负载或共享对默认项目的访问权限。为运行核心集群组件保留默认项目。

以下默认项目被视为具有高度特权:default, kube-public, kube-system, openshift, openshift-infra, openshift-node,其他系统创建的项目的标签 openshift.io/run-level 被设置为 01。依赖于准入插件(如 pod 安全准入、安全性上下文约束、集群资源配额和镜像引用解析)的功能无法在高特权项目中工作。

使用 Kubernetes 资源启用镜像流的方法有两种:

  • 启用针对特定资源的镜像流解析。这只允许此资源使用 image 字段中的镜像流名称。
  • 在镜像流上启用镜像流解析。这允许指向此镜像流的所有资源在 image 字段中使用它。

流程

您可以使用 oc set image-lookup 对镜像流上的特定资源或镜像流解析启用镜像流解析功能。

  1. 要允许所有资源引用名为 mysql 的镜像流,请输入以下命令:

    $ oc set image-lookup mysql
    Copy to Clipboard Toggle word wrap

    这会将 Imagestream.spec.lookupPolicy.local 字段设置为 true。

    启用镜像查询的镜像流

    apiVersion: image.openshift.io/v1
    kind: ImageStream
    metadata:
      annotations:
        openshift.io/display-name: mysql
      name: mysql
      namespace: myproject
    spec:
      lookupPolicy:
        local: true
    Copy to Clipboard Toggle word wrap

    启用后,会为镜像流中的所有标签启用此行为。

  2. 然后,您可以查询镜像流并查看是否设置了选项:

    $ oc set image-lookup imagestream --list
    Copy to Clipboard Toggle word wrap

您可以在特定资源上启用镜像查找。

  • 要允许名为 mysql 的 Kubernetes 部署使用镜像流,请运行以下命令:

    $ oc set image-lookup deploy/mysql
    Copy to Clipboard Toggle word wrap

    这会在部署上设置 alpha.image.policy.openshift.io/resolve-names 注解。

    启用镜像查询部署

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mysql
      namespace: myproject
    spec:
      replicas: 1
      template:
        metadata:
          annotations:
            alpha.image.policy.openshift.io/resolve-names: '*'
        spec:
          containers:
          - image: mysql:latest
            imagePullPolicy: Always
            name: mysql
    Copy to Clipboard Toggle word wrap

您可以禁用镜像查找。

  • 要禁用镜像查找,使用 --enabled=false:

    $ oc set image-lookup deploy/mysql --enabled=false
    Copy to Clipboard Toggle word wrap

第 8 章 在镜像流更改时触发更新

当更新镜像流标签以指向新镜像时,Red Hat OpenShift Service on AWS 可以自动采取措施将新镜像部署到使用旧镜像的资源。您可以根据引用镜像流标签的资源类型以不同方式配置此行为。

8.1. Red Hat OpenShift Service on AWS 资源

Red Hat OpenShift Service on AWS 部署配置和构建配置可通过更改镜像流标签自动触发。可使用更新的镜像流标签引用的镜像的新值运行触发的操作。

8.2. 触发 Kubernetes 资源

Kubernetes 资源没有用于触发的字段,这与部署和构建配置不同(在部署和构建配置中包括作为 API 定义的一组控制触发器字段)。您可以使用 Red Hat OpenShift Service on AWS 中的注解来请求触发。

该注解定义如下:

apiVersion: v1
kind: Pod
metadata:
  annotations:
    image.openshift.io/triggers:
      [
       {
         "from": {
           "kind": "ImageStreamTag", 
1

           "name": "example:latest", 
2

           "namespace": "myapp" 
3

         },
         "fieldPath": "spec.template.spec.containers[?(@.name==\"web\")].image", 
4

         "paused": false 
5

       },
      # ...
      ]
# ...
Copy to Clipboard Toggle word wrap
1
必需: kind 是要从中触发的资源,必须是 ImageStreamTag
2
必需: name 必须是镜像流标签的名称。
3
可选: namespace 默认为对象的命名空间。
4
必需: fieldPath 是到更改的 JSON 路径。此字段受限制,仅接受通过 ID 或索引完全匹配容器的 JSON 路径表达式。对于 pod,JSON 路径为 spec.containers[? (@.name='web')].image
5
可选: paused 代表触发器是否暂停,默认值为 false。将 paused 设置为 true 以临时禁用这个触发器。

当其中一个核心 Kubernetes 资源同时包含 pod 模板和此注解时,Red Hat OpenShift Service on AWS 会尝试使用当前与触发器引用的镜像流标签关联的镜像来更新对象。更新针对指定的 fieldPath 进行。

可以包含 pod 模板和注解的核心 Kubernetes 资源示例包括:

  • CronJobs
  • 部署
  • StatefulSets
  • DaemonSets
  • Jobs
  • ReplicationController
  • Pods

8.3. 在 Kubernetes 资源上设置镜像触发器

在部署中添加镜像触发器时,您可以使用 oc set triggers 命令。例如,此流程中的示例命令将镜像更改触发器添加到名为 example 的部署中,以便在更新 example:latest 镜像流标签时,部署中的 web 容器使用新的镜像值。此命令在部署资源上设置正确的 image.openshift.io/triggers 注解。

流程

  • 输入 oc set triggers 命令来触发 Kubernetes 资源:

    $ oc set triggers deploy/example --from-image=example:latest -c web
    Copy to Clipboard Toggle word wrap

    使用触发器注解的部署示例

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      annotations:
        image.openshift.io/triggers: '[{"from":{"kind":"ImageStreamTag","name":"example:latest"},"fieldPath":"spec.template.spec.containers[?(@.name==\"container\")].image"}]'
    # ...
    Copy to Clipboard Toggle word wrap

    除非部署暂停,否则此 pod 模板更新自动导致使用新镜像值进行部署。

第 9 章 使用 HCP 的 ROSA 的镜像配置资源

使用以下流程配置镜像 registry。

9.1. 使用 HCP 的 ROSA 的镜像控制器配置参数

Image.config.openshift.io/cluster 资源包含有关如何处理镜像的集群范围信息。资源存在,但它只读,只能通过 ROSA CLI (rosa)等支持的工具进行更改。规范且唯一有效的名称是 集群。它可以在 Red Hat OpenShift Service on AWS 托管 control plane 中通过 ROSA CLI (rosa)命令进行配置。

注意

参数,如 DisableScheduledImport, MaxImagesBulkImportedPerRepository, MaxScheduledImportsPerMinute, ScheduledImageImportMinimumIntervalSeconds, InternalRegistryHostname 不可配置。

Expand
ROSA CLI 的参数描述

registry-config-allowed-registries

允许镜像拉取(pull)和推送(push)操作的 registry。要指定所有子域,请在域名中添加星号 (*) 通配符字符作为前缀。例如: *.example.com。您可以在 registry 中指定单独的软件仓库。例如: reg1.io/myrepo/myapp:latest。阻止所有其他 registry。格式应为允许的 registry 的逗号分隔列表。例如: allowed.io, allowed.io2

registry-config-insecure-registries

没有有效 TLS 证书或仅支持 HTTP 连接的 registry。要指定所有子域,请在域名中添加星号 (*) 通配符字符作为前缀。例如: *.example.com。您可以在 registry 中指定单独的软件仓库。例如: reg1.io/myrepo/myapp:latest。格式应该是用逗号分开的不安全 registry 列表。例如,insecure.io、insecure.io2

registry-config-blocked-registries

拒绝镜像拉取(pull)和推送(push)操作的 registry。要指定所有子域,请在域名中添加星号 (*) 通配符字符作为前缀。例如: *.example.com。您可以在 registry 中指定单独的软件仓库。例如: reg1.io/myrepo/myapp:latest。允许所有其他 registry。格式应该是以逗号分隔的已阻塞 registry 列表。例如: blocked.io, blocked.io2

registry-config-allowed-registries-for-import

包含用于决定容器运行时在访问构建和 pod 的镜像时应如何处理个别 registry 的配置。例如,是否允许不安全的访问。它不包含内部集群 registry 的配置。限制普通用户可从中导入镜像的容器镜像 registry。格式应该是以逗号分隔的 domainName:insecure 列表。domain name 指定 registry 的域名。insecure 表示 registry 是否安全。

registry-config-additional-trusted-ca

包含 registry 主机名作为键的 JSON 文件,以及 PEM 编码证书作为值,用于每个要信任的额外 registry CA。

警告

当定义 allowedRegistries 参数时,除非明确列出,否则所有 registry 都会被阻断。为防止 pod 失败,会自动将红帽 registry 列表列入白名单,因为环境中有效负载镜像需要它们。当前列表由 image-registry.openshift-image-registry.svc:5000,quay.io,registry.redhat.io 组成,在运行 rosa describe cluster 命令时也可见。

9.2. 为使用 HCP 的 ROSA 配置镜像 registry 设置

您可以在集群创建时配置镜像 registry 设置。集群节点在创建后将使用所需的配置。

流程

  • 运行以下命令,使用镜像 registry 创建带有 HCP 集群的 ROSA:

    $ rosa create cluster —cluster-name=<cluster_name> --sts --mode=auto \
       --hosted-cp --operator-roles-prefix <operator_role_prefix> \
       --oidc-config-id <id_of_oidc_configuration> \
       --subnet-ids=<public_subnet_id>,<private_subnet_id> \
       --registry-config-insecure-registries <insecure_registries> \
       --registry-config-allowed-registries <allowed_registries> \
       --registry-config-allowed-registries-for-import <registry_name:insecure> \
       --registry-config-additional-trusted-ca <additional_trusted_ca_file>
    Copy to Clipboard Toggle word wrap
    注意

    使用 allowedRegistriesblockedRegistriesinsecureRegistries 参数时,您可以在 registry 中指定单独的存储库。例如: reg1.io/myrepo/myapp:latest

    避免不安全的外部 registry,以减少可能的安全风险。allowedRegistries,blockedRegistries 参数是互斥的。

验证

  1. 运行以下命令,运行 rosa describe 命令来验证您的镜像 registry 是否已启用:

    $ rosa describe cluster --cluster=<cluster_name>
    Copy to Clipboard Toggle word wrap

    输出示例

    Name:                       rosa-hcp-test
    Domain Prefix:              rosa-hcp-test
    Display Name:               rosa-hcp-test
    ID:                         <cluster_hcp_id>
    External ID:                <cluster_hcp_id>
    Control Plane:              ROSA Service Hosted
    OpenShift Version:          4.Y.Z
    Channel Group:              stable
    DNS:                        <dns>
    AWS Account:                <aws_id>
    AWS Billing Account:        <aws_id>
    API URL:                    <ocm_api>
    Console URL:
    Region:                     us-east-1
    Availability:
     - Control Plane:           MultiAZ
     - Data Plane:              SingleAZ
    Nodes:
     - Compute (desired):       2
     - Compute (current):       2
    Network:
     - Type:                    OVNKubernetes
     - Service CIDR:            <service_cidr>
     - Machine CIDR:            <machine_cidr>
     - Pod CIDR:                <pod_cidr>
     - Host Prefix:             /23
     - Subnets:                 <subnet_ids>
    EC2 Metadata Http Tokens:   optional
    Role (STS) ARN:             arn:aws:iam::<aws_id>:role/<account_roles_prefix>-HCP-ROSA-Installer-Role
    Support Role ARN:           arn:aws:iam::<aws_id>:role/<account_roles_prefix>-HCP-ROSA-Support-Role
    Instance IAM Roles:
     - Worker:                  arn:aws:iam::<aws_id>:role/<account_roles_prefix>-HCP-ROSA-Worker-Role
    Operator IAM Roles:
     - arn:aws:iam::<aws_id>:role/<operator_roles_prefix>-kube-system-capa-controller-manager
     - arn:aws:iam::<aws_id>:role/<operator_roles_prefix>-kube-system-control-plane-operator
     - arn:aws:iam::<aws_id>:role/<operator_roles_prefix>-kube-system-kms-provider
     - arn:aws:iam::<aws_id>:role/<operator_roles_prefix>-openshift-image-registry-installer-cloud-cred
     - arn:aws:iam::<aws_id>:role/<operator_roles_prefix>-openshift-ingress-operator-cloud-credentials
     - arn:aws:iam::<aws_id>:role/<operator_roles_prefix>-openshift-cluster-csi-drivers-ebs-cloud-credent
     - arn:aws:iam::<aws_id>:role/<operator_roles_prefix>-openshift-cloud-network-config-controller-cloud
    Managed Policies:           Yes
    State:                      ready
    Private:                    No
    Delete Protection:          Disabled
    Created:                    Oct 01 2030 09:48:52 UTC
    User Workload Monitoring:   Enabled
    OIDC Endpoint URL:          https://<endpoint> (Managed)
    Audit Log Forwarding:       Disabled
    External Authentication:    Disabled
    Etcd Encryption:            Disabled
    Registry Configuration:
     - Allowed Registries: <allowed_registry> 
    1
     
    2
    
     - Insecure Registries: <insecure_registry> 
    3
    
     - Allowed Registries for Import: 
    4
    
        - Domain Name: <domain_name> 
    5
    
        - Insecure: true 
    6
    
     - Platform Allowlist: <platform_allowlist_id> 
    7
    
        - Registries:      <list_of_registries> 
    8
    
     - Additional Trusted CA: 
    9
    
        - <registry_name> : REDACTED
    Copy to Clipboard Toggle word wrap

    1
    allowed Registries : 允许镜像拉取 (pull)和推送(push)操作的 registry 的逗号分隔列表。
    2
    blocked Registries:阻止 镜像拉取(pull)和推送(push)操作的 registry 的逗号分隔列表。allowedRegistries,blockedRegistries 参数是互斥的。
    3
    insecure Registries: 以逗号分隔的 registry 列表,它们没有有效的 TLS 证书或只支持 HTTP 连接。
    4
    允许导入 registry :限制普通用户可从中导入镜像的容器镜像 registry。格式应该是以逗号分隔的 domainName:insecure 列表。
    5
    domainname:指定 registry 的域名。
    6
    insecure :指示 registry 是否安全。
    7
    platform Allowlist : 引用需要白名单使 平台 正常工作的 registry 列表中的 id。
    8
    Registry: 需要将平台列入白名单的 registry 列表,以便平台正常工作。
    9
    Additional Trusted CA: 包含 registry 主机名作为键的 JSON 文件,以及 PEM 编码证书作为值,用于每个要信任的额外 registry CA。
  2. 运行以下命令,列出节点以检查应用的更改:

    $ oc get nodes
    Copy to Clipboard Toggle word wrap

    输出示例

    NAME                                         STATUS                     ROLES                  AGE   VERSION
    ip-10-0-137-182.us-east-2.compute.internal   Ready,SchedulingDisabled   worker                 65m   v1.32.3
    ip-10-0-188-96.us-east-2.compute.internal    Ready                      worker                 65m   v1.32.3
    ip-10-0-200-59.us-east-2.compute.internal    Ready                      worker                 63m   v1.32.3
    Copy to Clipboard Toggle word wrap

9.3. 使用 HCP 编辑 ROSA 的镜像 registry 设置

您可以使用 rosa edit 命令更改镜像 registry 配置。

警告

当定义 allowedRegistries 参数时,除非明确列出,否则所有 registry 都会被阻断。为防止 pod 失败,会自动将红帽 registry 列表列入白名单,因为环境中有效负载镜像需要它们。当前列表由 image-registry.openshift-image-registry.svc:5000,quay.io,registry.redhat.io 组成,在运行 rosa describe cluster 命令时也可见。

注意

您可以更改任何与 registry 相关的参数,该参数将在所有机器池中触发推出部署 ; 所有机器池节点都将被重新创建,按照从每个节点排空 pod 后重新创建所有机器池。

流程

  • 运行以下命令,为集群更新或编辑镜像 registry:

    $ rosa edit cluster --registry-config-insecure-registries <insecure_registries> \
       --registry-config-allowed-registries <allowed_registries> \
       --registry-config-allowed-registries-for-import <registry_name:insecure> \
       --registry-config-additional-trusted-ca <additional_trusted_ca_file>
    Copy to Clipboard Toggle word wrap

    输出示例

    ? Changing any registry related parameter will trigger a rollout across all machinepools
    (all machinepool nodes will be recreated, following pod draining from each node).
    Do you want to proceed? Yes
    I: Updated cluster '<cluster_name>'
    Copy to Clipboard Toggle word wrap

验证

  • 再次运行 rosa describe 命令,运行以下命令来查看您对镜像 registry 所做的更改是否更新:

    $ rosa describe cluster --cluster=<cluster_name>
    Copy to Clipboard Toggle word wrap

    输出示例

    Name:                       rosa-hcp-test
    Domain Prefix:              rosa-hcp-test
    Display Name:               rosa-hcp-test
    ID:                         <cluster_hcp_id>
    External ID:                <cluster_hcp_id>
    Control Plane:              ROSA Service Hosted
    OpenShift Version:          4.Y.Z
    Channel Group:              stable
    DNS:                        <dns>
    AWS Account:                <aws_id>
    AWS Billing Account:        <aws_id>
    API URL:                    <ocm_api>
    Console URL:
    Region:                     us-east-1
    Availability:
     - Control Plane:           MultiAZ
     - Data Plane:              SingleAZ
    
    Nodes:
     - Compute (desired):       2
     - Compute (current):       2
    Network:
     - Type:                    OVNKubernetes
     - Service CIDR:            <service_cidr>
     - Machine CIDR:            <machine_cidr>
     - Pod CIDR:                <pod_cidr>
     - Host Prefix:             /23
     - Subnets:                 <subnet_ids>
    EC2 Metadata Http Tokens:   optional
    Role (STS) ARN:             arn:aws:iam::<aws_id>:role/<account_roles_prefix>-HCP-ROSA-Installer-Role
    Support Role ARN:           arn:aws:iam::<aws_id>:role/<account_roles_prefix>-HCP-ROSA-Support-Role
    Instance IAM Roles:
     - Worker:                  arn:aws:iam::<aws_id>:role/<account_roles_prefix>-HCP-ROSA-Worker-Role
    Operator IAM Roles:
     - arn:aws:iam::<aws_id>:role/<operator_roles_prefix>-kube-system-capa-controller-manager
     - arn:aws:iam::<aws_id>:role/<operator_roles_prefix>-kube-system-control-plane-operator
     - arn:aws:iam::<aws_id>:role/<operator_roles_prefix>-kube-system-kms-provider
     - arn:aws:iam::<aws_id>:role/<operator_roles_prefix>-openshift-image-registry-installer-cloud-cred
     - arn:aws:iam::<aws_id>:role/<operator_roles_prefix>-openshift-ingress-operator-cloud-credentials
     - arn:aws:iam::<aws_id>:role/<operator_roles_prefix>-openshift-cluster-csi-drivers-ebs-cloud-credent
     - arn:aws:iam::<aws_id>:role/<operator_roles_prefix>-openshift-cloud-network-config-controller-cloud
    Managed Policies:           Yes
    State:                      ready
    Private:                    No
    Delete Protection:          Disabled
    Created:                    Oct 01 2030 09:48:52 UTC
    User Workload Monitoring:   Enabled
    OIDC Endpoint URL:          https://<endpoint> (Managed)
    Audit Log Forwarding:       Disabled
    External Authentication:    Disabled
    Etcd Encryption:            Disabled
    Registry Configuration:
     - Allowed Registries: <allowed_registry> 
    1
     
    2
    
     - Insecure Registries: <insecure_registry> 
    3
    
     - Allowed Registries for Import: 
    4
    
        - Domain Name: <domain_name> 
    5
    
        - Insecure: true 
    6
    
     - Platform Allowlist: <platform_allowlist_id> 
    7
    
        - Registries:      <list_of_registries> 
    8
    
     - Additional Trusted CA: 
    9
    
        - <registry_name> : REDACTED
    Copy to Clipboard Toggle word wrap

    1
    allowed Registries : 允许镜像拉取 (pull)和推送(push)操作的 registry 的逗号分隔列表。
    2
    blocked Registries:阻止 镜像拉取(pull)和推送(push)操作的 registry 的逗号分隔列表。allowedRegistries,blockedRegistries 参数是互斥的。
    3
    insecure Registries: 以逗号分隔的 registry 列表,它们没有有效的 TLS 证书或只支持 HTTP 连接。
    4
    允许导入 registry :限制普通用户可从中导入镜像的容器镜像 registry。格式应该是以逗号分隔的 domainName:insecure 列表。
    5
    domainname:指定 registry 的域名。
    6
    insecure :指示 registry 是否安全。
    7
    platform Allowlist : 引用需要白名单使 平台 正常工作的 registry 列表中的 id。
    8
    Registry: 需要将平台列入白名单的 registry 列表,以便平台正常工作。
    9
    Additional Trusted CA: 包含 registry 主机名作为键的 JSON 文件,以及 PEM 编码证书作为值,用于每个要信任的额外 registry CA。

9.3.1. 为使用 HCP 的 ROSA 更新平台允许列表

允许红帽 registry 列表,并在运行 rosa describe 集群时可见。此列表可以定期更新,以确保可以正确处理平台。受影响的集群将收到带有新允许列表 ID 的通知。在这种情况下,用户必须使用此参数从之前预期的 ID 更新至新预期的 ID。运行以下命令,为集群更新或编辑镜像 registry:

$ rosa edit cluster --registry-config-platform-allowlist <newID>
Copy to Clipboard Toggle word wrap

第 10 章 使用镜像

10.1. 使用镜像概述

使用以下主题发现不同的 Source-to-Image (S2I)、数据库和其他可供 Red Hat OpenShift Service on AWS 用户使用的容器镜像。

红帽官方容器镜像在 registry.redhat.io 上的 Red Hat Registry 中提供。Red Hat OpenShift Service on AWS 支持的 S2I、数据库和 Jenkins 镜像在 Red Hat Quay Registry 的 openshift4 存储库中提供。例如:quay.io/openshift-release-dev/ocp-v4.0-<address> 是 OpenShift Application Platform 镜像的名称。

xPaaS 中间件镜像在 Red Hat Registry 上的相应产品存储库中提供,后缀为 -openshift。例如:registry.redhat.io/jboss-eap-6/eap64-openshift 是 JBoss EAP 镜像的名称。

本节涵盖的红帽支持的所有镜像均在红帽生态系统目录的容器镜像部分进行描述。如需了解每个镜像的各种版本,请查看其内容和使用方法详情。浏览或搜索您感兴趣的镜像。

重要

较新版本的容器镜像与早期版本的 Red Hat OpenShift Service on AWS 不兼容。根据您的 Red Hat OpenShift Service on AWS 版本验证并使用正确版本的容器镜像。

10.2. Source-to-image

您可以将 Red Hat Software Collections 镜像用作依赖特定运行时环境(如 Node.js、Perl 或 Python)的应用程序的基础。您可以使用 Red Hat Java Source-to-Image for OpenShift 文档作为使用 Java 的运行时环境的参考。其中一些运行时基础镜像的特殊版本称为 Source-to-Image (S2I) 镜像。使用 S2I 镜像时,您可以将代码插入到可随时运行该代码的基础镜像环境中。

S2I 镜像包括:

  • .NET
  • Java
  • Go
  • Node.js
  • Perl
  • PHP
  • Python
  • Ruby

您可以按照以下流程直接从 Red Hat OpenShift Service on AWS Web 控制台使用 S2I 镜像:

  1. 使用您的登录凭证登录到 Red Hat OpenShift Service on AWS Web 控制台。Red Hat OpenShift Service on AWS Web 控制台的默认视图是 Administrator 视角。
  2. 使用视角切换功能把它切换到 Developer 视角。
  3. +Add 视图中,使用 Project 下拉列表选择现有项目或创建新项目。
  4. Developer Catalog 标题中的 All services
  5. Type 下的 Builder Images 以查看可用的 S2I 镜像。

S2I 镜像也可以通过 Cluster Samples Operator 获得。

10.2.1. Source-to-image 构建过程概述

Source-to-Image(S2I)通过将源代码注入准备要运行的源代码的容器来生成可随时运行的镜像。它执行以下步骤:

  1. 运行 FROM <builder image> 命令
  2. 将源代码复制到构建器镜像中定义的位置
  3. 在构建器镜像中运行 assemble 脚本
  4. 将构建器镜像中的 run 脚本设置为默认命令

然后,Buildah 会创建容器镜像。

10.3. 自定义 source-to-image 镜像

Source-to-Image(S2I)构建器镜像包含 assemble 和 run 脚本,但这些脚本的默认行为并不适用于所有用户。您可以自定义包含默认脚本的 S2I 构建器的行为。

10.3.1. 调用嵌入在镜像中的脚本

构建器镜像提供自己的 Source-to-image(S2I)脚本版本,它适用于最常用的用例。如果这些脚本无法满足您的需要,S2I 提供了在 .s2i/bin 目录中添加自定义脚本覆盖它们的方法。但是,这样做代表完全替换了标准脚本。在某些情况下,替换脚本是可以接受的,但在其他情况下,您可以在脚本之前或之后运行一些命令,同时保留镜像中提供的脚本逻辑。要重复使用标准脚本,您可以创建一个运行自定义逻辑的 wrapper 脚本,并将它进一步分配给镜像中的默认脚本。

流程

  1. 查看 io.openshift.s2i.scripts-url 标签的值,以确定构建器镜像中的脚本位置:

    $ podman inspect --format='{{ index .Config.Labels "io.openshift.s2i.scripts-url" }}' wildfly/wildfly-centos7
    Copy to Clipboard Toggle word wrap

    输出示例

    image:///usr/libexec/s2i
    Copy to Clipboard Toggle word wrap

    您检查了 wildfly/wildfly-centos7 构建器镜像,并发现脚本位于 /usr/libexec/s2i 目录中。

  2. 创建一个包含其它命令中嵌套的标准脚本之一的脚本:

    .s2i/bin/assemble 脚本

    #!/bin/bash
    echo "Before assembling"
    
    /usr/libexec/s2i/assemble
    rc=$?
    
    if [ $rc -eq 0 ]; then
        echo "After successful assembling"
    else
        echo "After failed assembling"
    fi
    
    exit $rc
    Copy to Clipboard Toggle word wrap

    这个示例显示了一个自定义 assemble 脚本,它输出信息,从镜像中运行标准 assemble 脚本,并根据 assemble 脚本的退出代码输出另一个信息。

    重要

    当嵌套 run 脚本时,您必须使用 exec 来调用它来确保正确处理信号。使用 exec 也无法在调用默认镜像运行脚本后运行附加命令。

    .s2i/bin/run 脚本

    #!/bin/bash
    echo "Before running application"
    exec /usr/libexec/s2i/run
    Copy to Clipboard Toggle word wrap

Legal Notice

Copyright © 2025 Red Hat

OpenShift documentation is licensed under the Apache License 2.0 (https://www.apache.org/licenses/LICENSE-2.0).

Modified versions must remove all Red Hat trademarks.

Portions adapted from https://github.com/kubernetes-incubator/service-catalog/ with modifications by Red Hat.

Red Hat, Red Hat Enterprise Linux, the Red Hat logo, the Shadowman logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.

Linux® is the registered trademark of Linus Torvalds in the United States and other countries.

Java® is a registered trademark of Oracle and/or its affiliates.

XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.

MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.

Node.js® is an official trademark of Joyent. Red Hat Software Collections is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.

The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation’s permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.

All other trademarks are the property of their respective owners.

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat