第 7 章 自定义容器镜像
Red Hat OpenStack Platform (RHOSP)服务在容器中运行,因此要部署必须获取容器镜像的 RHOSP 服务。您可以生成和自定义为 RHOSP 部署准备容器镜像的环境文件。
7.1. 为 director 安装准备容器镜像 复制链接链接已复制到粘贴板!
红帽支持使用以下方式为您的 overcloud 管理容器镜像:
-
将容器镜像从 Red Hat Container Catalog 拉取到 undercloud 上的
image-serveregistry,然后从image-serveregistry 拉取镜像。当您首先将镜像拉取到 undercloud 时,要避免多个 overcloud 节点同时通过外部连接拉取容器镜像。 - 从 Satellite 6 服务器拉取容器镜像。您可以直接从 Satellite 拉取这些镜像,因为网络流量是内部流量。
undercloud 安装需要一个环境文件来确定从何处获取容器镜像以及如何存储它们。准备 director 安装时,您可以生成默认的容器镜像准备文件。您可以自定义默认容器镜像准备文件。
7.1.1. 容器镜像准备参数 复制链接链接已复制到粘贴板!
用于准备您的容器的默认文件 (containers-prepare-parameter.yaml) 包含 ContainerImagePrepare heat 参数。此参数定义一个用于准备一系列镜像的策略列表:
每一策略接受一组子参数,它们定义要使用哪些镜像以及对这些镜像执行哪些操作。下表包含有关您可与每个 ContainerImagePrepare 策略配合使用的子参数的信息:
| 参数 | 描述 |
|---|---|
|
| 用于从策略中排除镜像名称的正则表达式列表。 |
|
|
用于在策略中包含的正则表达式列表。至少一个镜像名称必须与现有镜像匹配。如果指定了 |
|
|
要附加到目标镜像标签的字符串。例如,如果您使用标签 17.1.0-5.161 拉取镜像并将 |
|
| 过滤想要修改的镜像的镜像标签字典。如果镜像与定义的标签匹配,则 director 将该镜像包括在修改过程中。 |
|
| 在上传期间但在将镜像推送到目标 registry 之前运行的 ansible 角色名称字符串。 |
|
|
要传递给 |
|
| 定义用于在上传过程中要将镜像推送到的 registry 的命名空间。
当直接从 Red Hat Container Catalog 拉取镜像时,如果在生产环境中将此参数设置为
如果 |
|
| 从中拉取原始容器镜像的源 registry 。 |
|
|
用于定义从何处获取初始镜像的 |
|
|
使用指定容器镜像元数据标签的值为每个镜像创建标签,并拉取该标记的镜像。例如,如果设置了 |
将镜像推送到 undercloud 时,请使用 push_destination: true 而不是 push_destination: UNDERCLOUD_IP:PORT。push_destination: true 方法在 IPv4 和 IPv6 地址之间提供了一定程度的一致性。
set 参数接受一组 key: value 定义:
| 键 | 描述 |
|---|---|
|
| Ceph Storage 容器镜像的名称。 |
|
| Ceph Storage 容器镜像的命名空间。 |
|
| Ceph Storage 容器镜像的标签。 |
|
| Ceph Storage Alert Manager 容器镜像的名称、命名空间和标签。 |
|
| Ceph Storage Grafana 容器镜像的名称、命名空间和标签。 |
|
| Ceph Storage Node Exporter 容器镜像的名称、命名空间和标签。 |
|
| Ceph Storage Prometheus 容器镜像的名称、命名空间和标签。 |
|
| 各个 OpenStack 服务镜像的前缀。 |
|
| 各个 OpenStack 服务镜像的后缀。 |
|
| 各个 OpenStack 服务镜像的命名空间。 |
|
|
用于确定要使用的 OpenStack Networking (neutron) 容器的驱动程序。null 值代表使用标准的 |
|
|
为来自源的所有镜像设置特定的标签。如果没有定义,director 将 Red Hat OpenStack Platform 版本号用作默认值。此参数优先于 |
容器镜像使用基于 Red Hat OpenStack Platform 版本的多流标签。这意味着不再有 latest 标签。
7.1.2. 容器镜像标记准则 复制链接链接已复制到粘贴板!
在 containers-prepare-parameter.yaml 文件中准备镜像容器时,您可以使用参数来确定在更新环境时拉取哪些容器镜像 director,如 容器镜像准备参数 中所述。Red Hat Container Registry 使用特定的版本格式来标记所有 Red Hat OpenStack Platform 容器镜像。这个格式遵循每个容器的标签元数据,即 version-release :
- version
- 对应于 RHOSP 的主版本和次版本。这些版本充当包含一个或多个发行版本的流。
- release
- 对应于版本流中特定容器镜像版本的发行版本。
例如,如果最新版本的 RHOSP 是 17.1.0,容器镜像的发行版本为 5.161,则生成的容器镜像标签为 17.1.0-5.161。
主版本和次版本 标签
Red Hat Container Registry 还使用一组主要和次要 version 标签,链接到该容器镜像版本的最新发行版本。例如,17.1 和 17.1.0 链接到 17.1.0 容器流中的最新 版本。如果出现 17.1 的新次要发行版本,17.1 标签链接到新次要发行版本流 的最新版本,而 17.1.0 标签则继续链接到 17.1.0 流中 的最新版本。
设置 tag 和 tag_from_label 参数
在 containers-prepare-parameter.yaml 文件中,ContainerImagePrepare 参数包含 tag 和 tag_from_label 子参数。您可以使用 tag 或 tag_from_label 来决定要下载的容器镜像:
tag-
director 使用标签来仅基于主版本或次版本标签拉取镜像,Red Hat Container Registry 链接到版本流中最新镜像发行版本。
tag_from_label-
director 使用
tag_from_label对每个容器镜像执行元数据检查,并生成标签来拉取对应的镜像。
tag 参数始终优先于 tag_from_label 参数。要使用 tag_from_label,在容器准备配置中省略 tag 参数。
设置 标签 参数
tag 的默认值为 RHOSP 版本的主要版本,如 17.1。这个值始终对应于最新的次版本和发行版本。
要更改为 RHOSP 容器镜像的特定次要版本,请将标签设置为次版本。例如,若要更改为 17.1.2,请将 tag 设置为 17.1.2。
设置 标签 时,director 始终会在安装和更新期间下载 标签 中设置的版本的最新容器镜像版本,包括堆栈更新。
如果要进行堆栈更新,您可能不希望最新的容器镜像,而是与您的环境匹配的容器镜像。在本例中,省略容器准备配置中的 tag 参数,并只指定 tag_from_label。tag_from_label 参数使用安装的 RHOSP 版本来确定要用作更新过程一部分的标签值。
设置 tag_from_label 参数
如果没有设置 tag,则 director 会结合使用 tag_from_label 的值和最新的主要版本。
tag_from_label 参数根据其从 Red Hat Container Registry 中检查到的最新容器镜像发行版本的标签元数据生成标签。例如,特定容器的标签可能会使用以下 version 和 release 元数据:
"Labels": {
"release": "5.161",
"version": "17.1.0",
...
}
"Labels": {
"release": "5.161",
"version": "17.1.0",
...
}
tag_from_label 的默认值为 {version}-{release},对应于每个容器镜像的版本和发行版本元数据标签。例如,如果容器镜像为 版本 设置了 17.1.0,并且为 发行版本 设置了 5.161,则生成的容器镜像标签为 17.1.0-5.161。
7.1.3. 排除 Ceph Storage 容器镜像 复制链接链接已复制到粘贴板!
默认的 overcloud 角色配置使用默认的 Controller、Compute 和 Ceph Storage 角色。但是,如果使用默认角色配置来部署不含 Ceph Storage 节点的 overcloud,director 仍然会从 Red Hat Container Registry 拉取 Ceph Storage 容器镜像,因为这些镜像是作为默认配置的一部分包含在其中。
如果您的 overcloud 不需要 Ceph Storage 容器,则可以将 director 配置为不从 Red Hat Container Registry 拉取 Ceph Storage 容器镜像。
流程
编辑
containers-prepare-parameter.yaml文件并添加ceph_images: false参数。以下是该文件的示例,参数粗体显示:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
保存
containers-prepare-parameter.yaml文件。 创建新的容器镜像文件,以用于 overcloud 部署:
sudo openstack tripleo container image prepare -e containers-prepare-parameter.yaml --output-env-file <new_container_images_file>-
将
<new_container_images_file> 替换为包含新参数的输出文件。
-
将
- 将新容器镜像文件添加到 overcloud 部署环境文件列表中。
7.1.4. 准备期间修改镜像 复制链接链接已复制到粘贴板!
可在准备镜像期间修改镜像,然后立即使用修改的镜像部署 overcloud。
Red Hat OpenStack Platform (RHOSP) Director 支持在准备 RHOSP 容器(而非 Ceph 容器)期间修改镜像。
修改镜像的情况包括:
- 作为连续集成管道的一个部分,在部署之前使用要测试的更改修改镜像。
- 作为开发工作流的一个部分,必须部署本地更改以进行测试和开发。
- 必须部署更改,但更改没有通过镜像构建管道提供。例如,添加专有附加组件或紧急修复。
要在准备期间修改镜像,可在您要修改的每个镜像上调用 Ansible 角色。该角色提取源镜像,进行请求的更改,并标记结果。准备命令可将镜像推送到目标 registry,并设置 heat 参数以引用修改的镜像。
Ansible 角色 tripleo-modify-image 与所需的角色接口相一致,并提供修改用例必需的行为。使用 ContainerImagePrepare 参数中与修改相关的键控制修改:
-
modify_role指定要为每个镜像调用的 Ansible 角色进行修改。 -
modify_append_tag将字符串附加到源镜像标签的末尾。这可以标明生成的镜像已被修改过。如果push_destinationregistry 已包含修改的镜像,则使用此参数跳过修改。在每次修改镜像时都更改modify_append_tag。 -
modify_vars是要传递给角色的 Ansible 变量的字典。
要选择 tripleo-modify-image 角色处理的用例,将 tasks_from 变量设置为该角色中所需的文件。
在开发和测试修改镜像的 ContainerImagePrepare 条目时,运行镜像准备命令(无需任何其他选项),以确认镜像已如期修改:
sudo openstack tripleo container image prepare \ -e ~/containers-prepare-parameter.yaml
sudo openstack tripleo container image prepare \
-e ~/containers-prepare-parameter.yaml
要使用 openstack tripleo container image prepare 命令,您的 undercloud 必须包含一个正在运行的 image-serve registry。这样,在新的 undercloud 安装之前您将无法运行此命令,因为 image-serve registry 将不会被安装。您可以在成功安装 undercloud 后运行此命令。
7.1.5. 更新容器镜像的现有软件包 复制链接链接已复制到粘贴板!
您可以为 Red Hat OpenStack Platform (RHOSP)容器更新容器镜像中的现有软件包。
Red Hat OpenStack Platform (RHOSP) director 支持更新 RHOSP 容器的容器镜像上的现有软件包,不适用于 Ceph 容器。
流程
- 下载 RPM 软件包以安装到容器镜像上。
编辑
containers-prepare-parameter.yaml文件,以更新容器镜像上的所有软件包:Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
保存
containers-prepare-parameter.yaml文件。 -
运行
openstack overcloud deploy命令时,包含containers-prepare-parameter.yaml文件。
7.1.6. 将额外的 RPM 文件安装到容器镜像中 复制链接链接已复制到粘贴板!
您可以在容器镜像中安装 RPM 文件的目录。这对安装修补程序、本地软件包内部版本或任何通过软件包仓库无法获取的软件包都非常有用。
Red Hat OpenStack Platform (RHOSP) Director 支持将额外的 RPM 文件安装到 RHOSP 容器的容器镜像,而不是 Ceph 容器。
在现有部署中修改容器镜像时,您必须执行次要更新,以将更改应用到 overcloud。如需更多信息,请参阅 执行 Red Hat OpenStack Platform 的次要更新。
流程
以下示例
ContainerImagePrepare条目仅在nova-compute镜像上安装一些热修复软件包:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.1.7. 通过自定义 Dockerfile 修改容器镜像 复制链接链接已复制到粘贴板!
您可以指定包含 Dockerfile 的目录,以进行必要的更改。调用 tripleo-modify-image 角色时,该角色生成 Dockerfile.modified 文件,而该文件更改 FROM 指令并添加额外的 LABEL 指令。
Red Hat OpenStack Platform (RHOSP) Director 支持使用 RHOSP 容器(而非 Ceph 容器)的自定义 Dockerfile 修改容器镜像。
步骤
以下示例在
nova-compute镜像上运行自定义 Dockerfile:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下示例显示了
/home/stack/nova-custom/Dockerfile文件。运行任何USER根指令后,必须切换回原始镜像默认用户:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.1.8. 为容器镜像准备 Satellite 服务器 复制链接链接已复制到粘贴板!
Red Hat Satellite 6 提供了注册表同步功能。通过该功能可将多个镜像提取到 Satellite 服务器中,作为应用程序生命周期的一部分加以管理。Satellite 也可以作为 registry 供其他启用容器功能的系统使用。有关管理容器镜像的更多信息,请参阅 Red Hat Satellite 6 内容管理指南中的管理容器镜像。
以下操作过程示例中使用了 Red Hat Satellite 6 的 hammer 命令行工具和一个名为 ACME 的示例组织。请将该组织替换为您自己 Satellite 6 中的组织。
此过程需要身份验证凭据以从 registry.redhat.io 访问容器镜像。红帽建议创建一个 registry 服务帐户并使用这些凭据访问 registry.redhat.io 内容,而不使用您的个人用户凭据。有关更多信息,请参阅“红帽容器 registry 身份验证”。
步骤
创建所有容器镜像的列表:
sudo podman search --limit 1000 "registry.redhat.io/rhosp-rhel9" --format="{{ .Name }}" | sort > satellite_images sudo podman search --limit 1000 "registry.redhat.io/rhceph" | grep <ceph_dashboard_image_file> sudo podman search --limit 1000 "registry.redhat.io/rhceph" | grep <ceph_image_file> sudo podman search --limit 1000 "registry.redhat.io/openshift4" | grep ose-prometheus$ sudo podman search --limit 1000 "registry.redhat.io/rhosp-rhel9" --format="{{ .Name }}" | sort > satellite_images $ sudo podman search --limit 1000 "registry.redhat.io/rhceph" | grep <ceph_dashboard_image_file> $ sudo podman search --limit 1000 "registry.redhat.io/rhceph" | grep <ceph_image_file> $ sudo podman search --limit 1000 "registry.redhat.io/openshift4" | grep ose-prometheusCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将
<ceph_dashboard_image_file> 替换为部署使用的 Red Hat Ceph Storage 版本的镜像文件的名称:-
Red Hat Ceph Storage 5:
rhceph-5-dashboard-rhel8 -
Red Hat Ceph Storage 6:
rhceph-6-dashboard-rhel9
-
Red Hat Ceph Storage 5:
将
<ceph_image_file> 替换为部署使用的 Red Hat Ceph Storage 版本的镜像文件的名称:-
Red Hat Ceph Storage 5:
rhceph-5-rhel8 Red Hat Ceph Storage 6:
rhceph-6-rhel9注意openstack-ovn-bgp-agent镜像位于registry.redhat.io/rhosp-rhel9/openstack-ovn-bgp-agent-rhel9:17.1。
-
Red Hat Ceph Storage 5:
如果您计划安装 Ceph 并启用 Ceph 仪表板,则需要以下 ose-prometheus 容器:
registry.redhat.io/openshift4/ose-prometheus-node-exporter:v4.12 registry.redhat.io/openshift4/ose-prometheus:v4.12 registry.redhat.io/openshift4/ose-prometheus-alertmanager:v4.12
registry.redhat.io/openshift4/ose-prometheus-node-exporter:v4.12 registry.redhat.io/openshift4/ose-prometheus:v4.12 registry.redhat.io/openshift4/ose-prometheus-alertmanager:v4.12Copy to Clipboard Copied! Toggle word wrap Toggle overflow
-
将
satellite_images文件复制到包含 Satellite 6hammer工具的系统中。或者,根据 Hammer CLI 指南中的说明将hammer工具安装到 undercloud 中。 运行以下
hammer命令以在 Satellite 机构中创建新产品(OSP 容器):hammer product create \ --organization "ACME" \ --name "OSP Containers"
$ hammer product create \ --organization "ACME" \ --name "OSP Containers"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 该定制产品将会包含您的镜像。
添加
satellite_images文件中的 overcloud 容器镜像:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 添加 Ceph Storage 容器镜像:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
<ceph_image_file> 替换为部署使用的 Red Hat Ceph Storage 版本的镜像文件的名称:-
Red Hat Ceph Storage 5:
rhceph-5-rhel8 Red Hat Ceph Storage 6:
rhceph-6-rhel9注意如果要安装 Ceph 仪表板,请在
hammer repository create命令中包含--name <ceph_dashboard_image_name> :Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
<ceph_dashboard_image_file> 替换为部署使用的 Red Hat Ceph Storage 版本的镜像文件的名称:-
Red Hat Ceph Storage 5:
rhceph-5-dashboard-rhel8 -
Red Hat Ceph Storage 6:
rhceph-6-dashboard-rhel9
-
Red Hat Ceph Storage 5:
-
Red Hat Ceph Storage 5:
同步容器镜像:
hammer product synchronize \ --organization "ACME" \ --name "OSP Containers"
$ hammer product synchronize \ --organization "ACME" \ --name "OSP Containers"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 等待 Satellite 服务器完成同步。
注意根据具体配置情况,
hammer可能会询问您的 Satellite 服务器用户名和密码。您可以使用配置文件将hammer配置为自动登录。有关更多信息,请参阅 Hammer CLI 指南中的身份验证章节。-
如果您的 Satellite 6 服务器使用内容视图,请创建一个用于纳入镜像的新内容视图版本,并在应用生命周期的不同环境之间推进这个视图。这在很大程度上取决于您如何构建应用程序的生命周期。例如,如果您的生命周期中有一个称为
production的环境,并且希望容器镜像在该环境中可用,则创建一个包含容器镜像的内容视图,并将该内容视图推进到production环境中。有关更多信息,请参阅管理内容视图。 检查
base镜像的可用标签:hammer docker tag list --repository "base" \ --organization "ACME" \ --lifecycle-environment "production" \ --product "OSP Containers"
$ hammer docker tag list --repository "base" \ --organization "ACME" \ --lifecycle-environment "production" \ --product "OSP Containers"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 此命令显示内容视图中特定环境的 OpenStack Platform 容器镜像的标签。
返回到 undercloud,并生成默认的环境文件,它将您的 Satellite 服务器用作源来准备镜像。运行以下示例命令以生成环境文件:
sudo openstack tripleo container image prepare default \ --output-env-file containers-prepare-parameter.yaml
$ sudo openstack tripleo container image prepare default \ --output-env-file containers-prepare-parameter.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
--output-env-file是环境文件名称。此文件的内容包括用于为 undercloud 准备容器镜像的参数。在本例中,文件的名称是containers-prepare-parameter.yaml。
-
编辑
containers-prepare-parameter.yaml文件并修改以下参数:-
push_destination- 根据您选择的容器镜像管理策略,将此参数设置为true或false。如果将此参数设置为false,则 overcloud 节点直接从 Satellite 拉取镜像。如果将此参数设置为true,则 director 将镜像从 Satellite 拉取到 undercloud registry,overcloud 从 undercloud registry 拉取镜像。 -
namespace- Satellite 服务器上 registry 的 URL。 name_prefix- 该前缀基于 Satellite 6 规范。它的值根据您是否使用了内容视图而不同:-
如果您使用了内容视图,则前缀的结构为
[组织]-[环境]-[内容视图]-[产品]-。例如:acme-production-myosp17-osp_containers-。 -
如果不使用内容视图,则前缀的结构为
[组织]-[产品]-。例如:acme-osp_containers-。
-
如果您使用了内容视图,则前缀的结构为
-
ceph_namespace、ceph_image、ceph_tag- 如果使用 Ceph Storage,请额外纳入这些参数以定义 Ceph Storage 容器镜像的位置。请注意,ceph_image现包含特定于 Satellite 的前缀。这个前缀与name_prefix选项的值相同。
-
以下示例环境文件包含特定于 Satellite 的参数:
要使用存储在 Red Hat Satellite Server 上的特定容器镜像版本,请将 标签 键值对 设置为集合 字典中的特定版本。例如,要使用 17.1.2 镜像流,请在 set 字典中设置 tag: 17.1.2。
您必须在 undercloud.conf 配置文件中定义 containers-prepare-parameter.yaml 环境文件,否则 undercloud 将使用默认值:
container_images_file = /home/stack/containers-prepare-parameter.yaml
container_images_file = /home/stack/containers-prepare-parameter.yaml
7.1.9. 部署供应商插件 复制链接链接已复制到粘贴板!
要将一些第三方硬件用作块存储后端,您必须部署供应商插件。以下示例演示了如何部署厂商插件以使用 Dell EMC 硬件作为块存储后端。
流程
为您的 overcloud 创建新的容器镜像文件:
sudo openstack tripleo container image prepare default \ --local-push-destination \ --output-env-file containers-prepare-parameter-dellemc.yaml$ sudo openstack tripleo container image prepare default \ --local-push-destination \ --output-env-file containers-prepare-parameter-dellemc.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
编辑
containers-prepare-parameter-dellemc.yaml文件。 在主 Red Hat OpenStack Platform 容器镜像的策略中添加一个
exclude参数。使用此参数排除厂商容器镜像将替换的容器镜像。在示例中,容器镜像是cinder-volume镜像:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在
ContainerImagePrepare参数中添加新策略,其中包含厂商插件的替代容器镜像:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将 registry.connect.redhat.com registry 的身份验证详情添加到
ContainerImageRegistryCredentials参数中:Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
保存
containers-prepare-parameter-dellemc.yaml文件。 包含
containers-prepare-parameter-dellemc.yaml文件以及任何部署命令,如openstack overcloud deploy:openstack overcloud deploy --templates
$ openstack overcloud deploy --templates ... -e containers-prepare-parameter-dellemc.yaml ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow 当 director 部署 overcloud 时,overcloud 将使用厂商容器镜像,而不是标准容器镜像。
- 重要
-
containers-prepare-parameter-dellemc.yaml文件取代了 overcloud 部署中的标准containers-prepare-parameter.yaml文件。不要在 overcloud 部署中包含标准containers-prepare-parameter.yaml文件。为您的 undercloud 安装和更新保留标准containers-prepare-parameter.yaml文件。