第 7 章 自定义容器镜像
Red Hat OpenStack Platform (RHOSP)服务在容器中运行,因此要部署必须获取容器镜像的 RHOSP 服务。您可以生成和自定义为 RHOSP 部署准备容器镜像的环境文件。
7.1. 为 director 安装准备容器镜像
红帽支持使用以下方式为您的 overcloud 管理容器镜像:
-
将容器镜像从 Red Hat Container Catalog 拉取到 undercloud 上的
image-serve
registry,然后从image-serve
registry 拉取镜像。当您首先将镜像拉取到 undercloud 时,要避免多个 overcloud 节点同时通过外部连接拉取容器镜像。 - 从 Satellite 6 服务器拉取容器镜像。您可以直接从 Satellite 拉取这些镜像,因为网络流量是内部流量。
undercloud 安装需要一个环境文件来确定从何处获取容器镜像以及如何存储它们。准备 director 安装时,您可以生成默认的容器镜像准备文件。您可以自定义默认容器镜像准备文件。
7.1.1. 容器镜像准备参数
用于准备您的容器的默认文件 (containers-prepare-parameter.yaml
) 包含 ContainerImagePrepare
heat 参数。此参数定义一个用于准备一系列镜像的策略列表:
parameter_defaults: ContainerImagePrepare: - (strategy one) - (strategy two) - (strategy three) ...
每一策略接受一组子参数,它们定义要使用哪些镜像以及对这些镜像执行哪些操作。下表包含有关您可与每个 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. 容器镜像标记准则
Red Hat Container Registry 使用特定的版本格式来标记所有 Red Hat OpenStack Platform 容器镜像。此格式遵循每个容器的标签元数据,即 version-release
。
- version
- 对应于 Red Hat OpenStack Platform 的主要和次要版本。这些版本充当包含一个或多个发行版本的流。
- release
- 对应于版本流中特定容器镜像版本的发行版本。
例如,如果 Red Hat OpenStack Platform 的最新版本为 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 流中 的最新发行版本
。
ContainerImagePrepare
参数包含两个子参数,可用于确定要下载的容器镜像。这些子参数是 set
字典中的 tag
参数,以及 tag_from_label
参数。使用以下准则来确定要使用 tag
还是 tag_from_label
。
tag
的默认值是您的 OpenStack Platform 版本的主要版本。对于这个版本,它是 17.1。这始终对应于最新的次要版本和发行版本。parameter_defaults: ContainerImagePrepare: - set: ... tag: 17.1 ...
要更改为 OpenStack Platform 容器镜像的特定次要版本,请将标签设置为次要版本。例如,若要更改为 17.1.2,请将
tag
设置为 17.1.2。parameter_defaults: ContainerImagePrepare: - set: ... tag: 17.1.2 ...
-
在设置
tag
时,director 始终会在安装和更新期间下载tag
中设置的版本的最新容器镜像release
。 如果没有设置
tag
,则 director 会结合使用tag_from_label
的值和最新的主要版本。parameter_defaults: ContainerImagePrepare: - set: ... # tag: 17.1 ... tag_from_label: '{version}-{release}'
tag_from_label
参数根据其从 Red Hat Container Registry 中检查到的最新容器镜像发行版本的标签元数据生成标签。例如,特定容器的标签可能会使用以下version
和release
元数据:"Labels": { "release": "5.161", "version": "17.1.0", ... }
-
tag_from_label
的默认值为{version}-{release}
,对应于每个容器镜像的版本和发行版本元数据标签。例如,如果容器镜像为版本
设置了 17.1.0,并且为发行版本
设置了 5.161,则生成的容器镜像标签为 17.1.0-5.161。 -
tag
参数始终优先于tag_from_label
参数。要使用tag_from_label
,在容器准备配置中省略tag
参数。 -
tag
和tag_from_label
之间的一个关键区别是:director 仅基于主要或次要版本标签使用tag
拉取镜像,Red Hat Container Registry 将这些标签链接到版本流中的最新镜像发行版本,而 director 使用tag_from_label
对每个容器镜像执行元数据检查,以便 director 生成标签并拉取对应的镜像。
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
参数。以下是该文件的示例,参数粗体显示:
parameter_defaults: ContainerImagePrepare: - tag_from_label: {version}-{release} set: name_prefix: rhosp17-openstack- name_suffix: '' tag: 17.1_20231214.1 rhel_containers: false neutron_driver: ovn ceph_images: false push_destination: true
-
保存
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_destination
registry 已包含修改的镜像,则使用此参数跳过修改。在每次修改镜像时都更改modify_append_tag
。 -
modify_vars
是要传递给角色的 Ansible 变量的字典。
要选择 tripleo-modify-image
角色处理的用例,将 tasks_from
变量设置为该角色中所需的文件。
在开发和测试修改镜像的 ContainerImagePrepare
条目时,运行镜像准备命令(无需任何其他选项),以确认镜像已如期修改:
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
文件,以更新容器镜像上的所有软件包:ContainerImagePrepare: - push_destination: true ... modify_role: tripleo-modify-image modify_append_tag: "-updated" modify_vars: tasks_from: yum_update.yml compare_host_packages: true yum_repos_dir_path: /etc/yum.repos.d ...
-
保存
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
镜像上安装一些热修复软件包:ContainerImagePrepare: - push_destination: true ... includes: - nova-compute modify_role: tripleo-modify-image modify_append_tag: "-hotfix" modify_vars: tasks_from: rpm_install.yml rpms_path: /home/stack/nova-hotfix-pkgs ...
7.1.7. 通过自定义 Dockerfile 修改容器镜像
您可以指定包含 Dockerfile 的目录,以进行必要的更改。调用 tripleo-modify-image
角色时,该角色生成 Dockerfile.modified
文件,而该文件更改 FROM
指令并添加额外的 LABEL
指令。
Red Hat OpenStack Platform (RHOSP) Director 支持使用 RHOSP 容器(而非 Ceph 容器)的自定义 Dockerfile 修改容器镜像。
步骤
以下示例在
nova-compute
镜像上运行自定义 Dockerfile:ContainerImagePrepare: - push_destination: true ... includes: - nova-compute modify_role: tripleo-modify-image modify_append_tag: "-hotfix" modify_vars: tasks_from: modify_image.yml modify_dir_path: /home/stack/nova-custom ...
以下示例显示了
/home/stack/nova-custom/Dockerfile
文件。运行任何USER
根指令后,必须切换回原始镜像默认用户:FROM registry.redhat.io/rhosp-rhel9/openstack-nova-compute:latest USER "root" COPY customize.sh /tmp/ RUN /tmp/customize.sh USER "nova"
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
将
<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
-
将
satellite_images
文件复制到包含 Satellite 6hammer
工具的系统中。或者,根据 Hammer CLI 指南中的说明将hammer
工具安装到 undercloud 中。 运行以下
hammer
命令以在 Satellite 机构中创建新产品(OSP 容器
):$ hammer product create \ --organization "ACME" \ --name "OSP Containers"
该定制产品将会包含您的镜像。
添加
satellite_images
文件中的 overcloud 容器镜像:$ while read IMAGE; do \ IMAGE_NAME=$(echo $IMAGE | cut -d"/" -f3 | sed "s/openstack-//g") ; \ IMAGE_NOURL=$(echo $IMAGE | sed "s/registry.redhat.io\///g") ; \ hammer repository create \ --organization "ACME" \ --product "OSP Containers" \ --content-type docker \ --url https://registry.redhat.io \ --docker-upstream-name $IMAGE_NOURL \ --upstream-username USERNAME \ --upstream-password PASSWORD \ --name $IMAGE_NAME ; done < satellite_images
添加 Ceph Storage 容器镜像:
$ hammer repository create \ --organization "ACME" \ --product "OSP Containers" \ --content-type docker \ --url https://registry.redhat.io \ --docker-upstream-name rhceph/<ceph_image_name> \ --upstream-username USERNAME \ --upstream-password PASSWORD \ --name <ceph_image_name>
将
<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
> :$ hammer repository create \ --organization "ACME" \ --product "OSP Containers" \ --content-type docker \ --url https://registry.redhat.io \ --docker-upstream-name rhceph/<ceph_dashboard_image_name> \ --upstream-username USERNAME \ --upstream-password PASSWORD \ --name <ceph_dashboard_image_name>
将
<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"
等待 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"
此命令显示内容视图中特定环境的 OpenStack Platform 容器镜像的标签。
返回到 undercloud,并生成默认的环境文件,它将您的 Satellite 服务器用作源来准备镜像。运行以下示例命令以生成环境文件:
$ sudo openstack tripleo container image prepare default \ --output-env-file containers-prepare-parameter.yaml
-
--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 的参数:
parameter_defaults: ContainerImagePrepare: - push_destination: false set: ceph_image: acme-production-myosp17_1-osp_containers-rhceph-6 ceph_namespace: satellite.example.com:443 ceph_tag: latest name_prefix: acme-production-myosp17_1-osp_containers- name_suffix: '' namespace: satellite.example.com:5000 neutron_driver: null tag: '17.1' ...
要使用存储在 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
7.1.9. 部署供应商插件
要将一些第三方硬件用作块存储后端,您必须部署供应商插件。以下示例演示了如何部署厂商插件以使用 Dell EMC 硬件作为块存储后端。
流程
为您的 overcloud 创建新的容器镜像文件:
$ sudo openstack tripleo container image prepare default \ --local-push-destination \ --output-env-file containers-prepare-parameter-dellemc.yaml
-
编辑
containers-prepare-parameter-dellemc.yaml
文件。 在主 Red Hat OpenStack Platform 容器镜像的策略中添加一个
exclude
参数。使用此参数排除厂商容器镜像将替换的容器镜像。在示例中,容器镜像是cinder-volume
镜像:parameter_defaults: ContainerImagePrepare: - push_destination: true excludes: - cinder-volume set: namespace: registry.redhat.io/rhosp-rhel9 name_prefix: openstack- name_suffix: '' tag: 17.1 ... tag_from_label: "{version}-{release}"
在
ContainerImagePrepare
参数中添加新策略,其中包含厂商插件的替代容器镜像:parameter_defaults: ContainerImagePrepare: ... - push_destination: true includes: - cinder-volume set: namespace: registry.connect.redhat.com/dellemc name_prefix: openstack- name_suffix: -dellemc-rhosp16 tag: 16.2-2 ...
将 registry.connect.redhat.com registry 的身份验证详情添加到
ContainerImageRegistryCredentials
参数中:parameter_defaults: ContainerImageRegistryCredentials: registry.redhat.io: [service account username]: [service account password] registry.connect.redhat.com: [service account username]: [service account password]
-
保存
containers-prepare-parameter-dellemc.yaml
文件。 包含
containers-prepare-parameter-dellemc.yaml
文件以及任何部署命令,如openstack overcloud deploy
:$ openstack overcloud deploy --templates ... -e containers-prepare-parameter-dellemc.yaml ...
当 director 部署 overcloud 时,overcloud 将使用厂商容器镜像,而不是标准容器镜像。
- 重要
-
containers-prepare-parameter-dellemc.yaml
文件取代了 overcloud 部署中的标准containers-prepare-parameter.yaml
文件。不要在 overcloud 部署中包含标准containers-prepare-parameter.yaml
文件。为您的 undercloud 安装和更新保留标准containers-prepare-parameter.yaml
文件。