Red Hat Training

A Red Hat training course is available for Red Hat OpenStack Platform

第 5 章 配置容器镜像源

容器化 overcloud 需要访问含有所需容器镜像的 registry。本章将介绍如何配置 register 和 overcloud 来为 Red Hat OpenStack Platform 提供容器镜像。

5.1. Registry

Red Hat OpenStack Platform 支持以下 register 类型:

远程注册表
overcloud 会直接从 registry.access.redhat.com 中提取容器镜像。这是最简单的一种初始配置生成方法。但是,每个 overcloud 节点都会直接从 Red Hat Container Catalog 中提取所有的镜像,这可能会导致网络拥塞并影响部署速度。此外,所有 overcloud 节点都需要通过互联网来访问 Red Hat Container Catalog。
本地注册表
您可以在 undercloud 上创建本地 register,并从 registry.access.redhat.com 同步镜像;overcloud 则会从 undercloud 提取容器镜像。此方法允许您在内部存储 register,这样可以加快部署速度并缓解网络拥塞。但是,undercloud 只能用作基础 register,而且只能为容器镜像提供有限的生命周期管理。
Satellite 服务器
通过 Red Hat Satellite 6 服务器,可管理容器镜像的整个应用生命周期并发布镜像。overcloud 会从 Satellite 服务器提取镜像。此方法提供了一个可用于存储、管理和部署 Red Hat OpenStack Platform 容器的企业级解决方案。

从列表中选择一种方法并继续配置注册表详细信息。

5.2. 容器镜像准备命令的使用

本节介绍了 openstack overcloud container image prepare 命令的使用方法,包括该命令的各个选项的相关概念信息。

为 Overcloud 生成容器镜像环境文件

openstack overcloud container image prepare 命令的主要用途之一就是创建列有 overcloud 所用镜像的环境文件。您可以将这个文件用于 overcloud 部署命令,如 openstack overcloud deployopenstack overcloud container image prepare 命令会使用以下选项来实现这一功能:

--output-env-file
定义所生成的环境文件的名称。

以下片段是该文件所含内容的示例:

parameter_defaults:
  DockerAodhApiImage: registry.access.redhat.com/rhosp13/openstack-aodh-api:latest
  DockerAodhConfigImage: registry.access.redhat.com/rhosp13/openstack-aodh-api:latest
...

为导入方法生成容器镜像列表

如果想将 OpenStack Platform 容器镜像导入到其他 registry 源中,您可以生成一个镜像列表。列表的语法主要用于将容器镜像导入到 undercloud 上的容器 registry 中,但是您可以修改该列表的格式,以使其适用于其他导入方法,如 Red Hat Satellite 6。

openstack overcloud container image prepare 命令会使用以下选项来实现这一功能:

--output-images-file
为导入列表定义所生成文件的名称。

下面是该文件所含内容的示例:

container_images:
- imagename: registry.access.redhat.com/rhosp13/openstack-aodh-api:latest
- imagename: registry.access.redhat.com/rhosp13/openstack-aodh-evaluator:latest
...

为容器镜像设置命名空间

--output-env-file--output-images-file 选项都需要一个命名空间,才能生成所得到的镜像位置。openstack overcloud container image prepare 命令会使用以下选项来设置要提取的容器镜像的源位置:

--namespace
定义容器镜像的命名空间。它的值通常是一个包含目录的主机名或 IP 地址。
--prefix
定义要加在镜像名称前面的前缀。

所以,director 会按照以下格式来生成镜像名称:

  • [命名空间]/[前缀][镜像名称]

设置容器镜像标签

默认情况下,openstack overcloud container image prepare 命令会为每一个容器镜像都使用 latest 标签。但是,您可以使用以下任一选项为镜像版本选择特定的标签:

--tag-from-label
使用指定容器镜像标签的值来为每一个镜像查找带有版本的标签。
--tag
为所有镜像设置特定标签。所有 OpenStack Platform 容器镜像会使用同一个标签来实现版本同步。当与 --tag-from-label 搭配使用时,即可从这个标签入手,以查找带有版本的标签。

5.3. 适用于其他服务的容器镜像

director 只会为核心 OpenStack Platform 服务准备容器镜像。某些其他功能所用的服务需要额外的容器镜像。这些服务可以通过环境文件来启用。openstack overcloud container image prepare 命令会使用以下选项来纳入环境文件和相应的容器镜像:

-e
纳入环境文件以启用额额外的容器镜像。

下表提供了一个示例列表,其中列有需要使用容器镜像的其他服务以及相应的环境文件在 /usr/share/openstack-tripleo-heat-templates 目录中所处的位置。

服务环境文件

Ceph 存储

environments/ceph-ansible/ceph-ansible.yaml

Collectd

environments/services-docker/collectd.yaml

Congress

environments/services-docker/congress.yaml

Fluentd

environments/services-docker/fluentd-client.yaml

OpenStack Bare Metal(ironic)

environments/services-docker/ironic.yaml

OpenStack Data Processing (sahara)

environments/services-docker/sahara.yaml

OpenStack EC2-API

environments/services-docker/ec2-api.yaml

OpenStack Key Manager (barbican)

environments/services-docker/barbican.yaml

OpenStack Load Balancing-as-a-Service (octavia)

environments/services-docker/octavia.yaml

OpenStack Shared File System Storage (manila)

environments/services-docker/manila.yaml

Sensu

environments/services-docker/sensu-client.yaml

后面的几个章节会就如何纳入额外服务提供一些示例。

Ceph 存储

如果要使用 overcloud 来部署 Red Hat Ceph Storage 集群,则需纳入 /usr/share/openstack-tripleo-heat-templates/environments/ceph-ansible/ceph-ansible.yaml 环境文件。这个文件可在 overcloud 中启用可组合的容器化服务;但是,director 需要确认这些服务都已启用,才会开始准备相关的镜像。

除了这个环境文件之外,您还需要定义 Ceph Storage 容器的位置,这个位置有别于 OpenStack Platform 服务所在的位置。请使用 --set 选项来设置特定于 Ceph Storage 的以下参数:

--set ceph_namespace
定义 Ceph Storage 容器镜像的命名空间。它的功能与 --namespace 选项类似。
--set ceph_image
定义 Ceph Storage 容器镜像的名称。通常,它的值为 rhceph-3-rhel7
--set ceph_tag
定义用于 Ceph Storage 容器镜像的标签。它的功能与 --tag 选项类似。如果指定了 --tag-from-label,则可从这个标签入手,以查找带有版本的标签。

以下片段是一个有关如何在容器镜像文件中纳入 Ceph Storage 的示例:

$ openstack overcloud container image prepare \
  ...
  -e /usr/share/openstack-tripleo-heat-templates/environments/ceph-ansible/ceph-ansible.yaml \
  --set ceph_namespace=registry.access.redhat.com/rhceph \
  --set ceph_image=rhceph-3-rhel7 \
  --tag-from-label {version}-{release} \
  ...

OpenStack Bare Metal(ironic)

如果要在 overcloud 中部署 OpenStack Bare Metal (ironic),只需纳入 /usr/share/openstack-tripleo-heat-templates/environments/services-docker/ironic.yaml 环境文件,以便 director 准备相应的镜像。以下片段是一个有关如何纳入这个环境文件的示例:

$ openstack overcloud container image prepare \
  ...
  -e /usr/share/openstack-tripleo-heat-templates/environments/services-docker/ironic.yaml \
  ...

OpenStack Data Processing (sahara)

如果要在 overcloud 中部署 OpenStack Data Processing (sahara),则需纳入 /usr/share/openstack-tripleo-heat-templates/environments/services-docker/sahara.yaml 环境文件,以便 director 准备相应的镜像。以下片段是一个有关如何纳入这个环境文件的示例:

$ openstack overcloud container image prepare \
  ...
  -e /usr/share/openstack-tripleo-heat-templates/environments/services-docker/sahara.yaml \
  ...

5.4. 使用 Red Hat registry 作为远程 registry 源

红帽将 overcloud 容器镜像托管在 registry.access.redhat.com 中。从远程注册表提取镜像是最简单的方法,因为注册表已经建好,您只需知道要提取的镜像的 URL 和命名空间即可。但是在 overcloud 创建过程中,overcloud 节点都要从远程软件仓库提取镜像,这会堵塞外部连接。如果这造成问题,可采用以下方法之一:

  • 设置本地 registry
  • 将镜像托管在 Red Hat Satellite 6 上

步骤

  1. 要在 overcloud 部署中直接从 registry.access.redhat.com 提取镜像,则需使用环境文件来指定镜像参数。以下命令可自动创建此类环境文件:

    (undercloud) $ openstack overcloud container image prepare \
      --namespace=registry.access.redhat.com/rhosp13 \
      --prefix=openstack- \
      --tag-from-label {version}-{release} \
      --output-env-file=/home/stack/templates/overcloud_images.yaml
    • 使用 -e 选项可为可选服务纳入任意环境文件。
    • 如果正在使用 Ceph Storage,请额外纳入以下参数,以定义 Ceph Storage 容器镜像的位置:--set ceph_namespace--set ceph_image--set ceph_tag
  2. 这将创建 overcloud_images.yaml 环境文件,其中包含 undercloud 上的镜像位置。需要将该文件包括在部署中。

5.5. 使用 undercloud 作为本地 registry

您可以在 undercloud 上配置本地 registry,以存储 overcloud 容器镜像。此方法会涉及以下操作:

  • director 会从 registry.access.redhat.com 中逐一提取每个镜像。
  • director 会创建 overcloud。
  • 在 overcloud 的创建过程中,节点会从 undercloud 中提取相关镜像。

这会使容器镜像产生的网络流量保持在内部网络中,不会堵塞外部网络连接,从而加速部署过程。

步骤

  1. 查找本地 undercloud registry 的地址。该地址的模式如下所示:

    <REGISTRY IP ADDRESS>:8787

    请使用您先前在 undercloud.conf 文件中通过 local_ip 参数所设置的 undercloud IP 地址。以下命令假设该地址为 192.168.24.1:8787

  2. 创建模板以将镜像上传到本地 registry,并创建环境文件以引用这些镜像:

    (undercloud) $ openstack overcloud container image prepare \
      --namespace=registry.access.redhat.com/rhosp13 \
      --push-destination=192.168.24.1:8787 \
      --prefix=openstack- \
      --tag-from-label {version}-{release} \
      --output-env-file=/home/stack/templates/overcloud_images.yaml \
      --output-images-file /home/stack/local_registry_images.yaml
    • 使用 -e 选项可为可选服务纳入任意环境文件。
    • 如果正在使用 Ceph Storage,请额外纳入以下参数,以定义 Ceph Storage 容器镜像的位置:--set ceph_namespace--set ceph_image--set ceph_tag
  3. 这样会创建两个文件:

    • local_registry_images.yaml,包含来自远程来源的容器镜像信息。请使用这个文件将 Red Hat Container Registry (registry.access.redhat.com) 中的镜像提取到 undercloud。
    • overcloud_images.yaml,包含镜像文件在 undercloud 上所处的最终位置。需将该文件纳入到您的部署中。

      请检查这两个文件是否都存在。

  4. registry.access.redhat.com 中的容器镜像提取到 undercloud。

    (undercloud) $ sudo openstack overcloud container image upload \
      --config-file  /home/stack/local_registry_images.yaml \
      --verbose

    提取所需镜像需要花费一定时间,具体取决于网络速度及 undercloud 磁盘情况。

    注意

    容器镜像大约占用 10 GB 磁盘空间。

registry 配置现在已经完成。

5.6. 使用 Satellite 服务器作为 registry

Red Hat Satellite 6 提供了注册表同步功能。通过该功能可将多个镜像提取到 Satellite 服务器中,作为应用程序生命周期的一部分加以管理。Satellite 也可以作为注册表供其他启用容器功能的系统使用。如需了解更多有关管理容器镜像的详细信息,请参阅 Red Hat Satellite 6 Content Management Guide 中的 "Managing Container Images"

以下操作过程示例中使用了 Red Hat Satellite 6 的 hammer 命令行工具和一个名为 ACME 的示例组织。请将该组织替换为您自己 Satellite 6 中的组织。

步骤

  1. 创建模板以便将镜像提取到本地注册表:

    $ source ~/stackrc
    (undercloud) $ openstack overcloud container image prepare \
      --namespace=rhosp13 \
      --prefix=openstack- \
      --output-images-file /home/stack/satellite_images \
    • 使用 -e 选项可为可选服务纳入任意环境文件。
    • 如果正在使用 Ceph Storage,请额外纳入以下参数,以定义 Ceph Storage 容器镜像的位置:--set ceph_namespace--set ceph_image--set ceph_tag
    注意

    此版本的 openstack overcloud container image prepare 命令针对 registry.access.redhat.com 上的 registry 来生成镜像列表。命令中使用的值不同于后面步骤中的 openstack overcloud container image prepare 命令。

  2. 这将创建名为 satellite_images 的文件,其中包含容器镜像信息。您将使用此文件将容器镜像同步至 Satellite 6 服务器。
  3. satellite_images 文件中移除特定于 YAML 的信息,然后将其转换为仅包含镜像列表的平面文件。以下 sed 命令可以实现上述操作:

    (undercloud) $ awk -F ':' '{if (NR!=1) {gsub("[[:space:]]", ""); print $2}}' ~/satellite_images > ~/satellite_images_names

    这样就得到了要提取到 Satellite 服务器中的镜像列表。

  4. satellite_images_names 文件复制到包含 Satellite 6 hammer 工具的系统中。或者按照 Hammer CLI Guide 中的说明将 hammer 工具安装到 undercloud。
  5. 运行以下 hammer 命令,为您的 Satellite 组织创建新产品 (OSP13 Containers):

    $ hammer product create \
      --organization "ACME" \
      --name "OSP13 Containers"

    该定制产品将会包含我们的镜像。

  6. 为产品添加基本容器镜像:

    $ hammer repository create \
      --organization "ACME" \
      --product "OSP13 Containers" \
      --content-type docker \
      --url https://registry.access.redhat.com \
      --docker-upstream-name rhosp13/openstack-base \
      --name base
  7. 添加 satellite_images 文件中的 overcloud 容器镜像。

    $ while read IMAGE; do \
      IMAGENAME=$(echo $IMAGE | cut -d"/" -f2 | sed "s/openstack-//g" | sed "s/:.*//g") ; \
      hammer repository create \
      --organization "ACME" \
      --product "OSP13 Containers" \
      --content-type docker \
      --url https://registry.access.redhat.com \
      --docker-upstream-name $IMAGE \
      --name $IMAGENAME ; done < satellite_images_names
  8. 同步容器镜像:

    $ hammer product synchronize \
      --organization "ACME" \
      --name "OSP13 Containers"

    等待 Satellite 服务器完成同步。

    注意

    根据具体配置情况,hammer 可能会询问您的 Satellite 服务器用户名和密码。您可以使用配置文件将 hammer 配置为自动登录。请参阅 Hammer CLI Guide 中的“Authentication”部分。

  9. 如果 Satellite 6 服务器使用了内容视图,请创建新的内容视图版本以纳入这些镜像。
  10. 检查 base 镜像中的标签:

    $ hammer docker tag list --repository "base" \
      --organization "ACME" \
      --product "OSP13 Containers"

    这会显示 OpenStack Platform 容器镜像的标签。

  11. 返回到 undercloud 并为 Satellite 服务器上的镜像生成环境文件。以下是用于生成环境文件的命令示例:

    (undercloud) $ openstack overcloud container image prepare \
      --namespace=satellite6.example.com:5000 \
      --prefix=acme-osp13_containers- \
      --tag-from-label {version}-{release} \
      --output-env-file=/home/stack/templates/overcloud_images.yaml
    注意

    此版本的 openstack overcloud container image prepare 命令针对 Satellite 服务器。命令中使用的值不同于上一步骤中的 openstack overcloud container image prepare 命令。

    在运行这个命令时,请纳入以下数据:

    • --namespace - Satellite 服务器上注册表的 URL 和端口。Red Hat Satellite 上的默认注册表端口是 5000。例如,--namespace=satellite6.example.com:5000
    • --prefix= - 前缀基于 Satellite 6 规范。它的值取决于您是否使用了内容视图:

      • 如果您使用了内容视图,则前缀的结构为 [组织]-[环境]-[内容视图]-[产品]-。例如:acme-production-myosp13-osp13_containers-
      • 如果不使用内容视图,则前缀的结构为 [组织]-[产品]-。例如:acme-osp13_containers-
    • --tag-from-label {version}-{release} - 识别各个镜像的最新标签。
    • -e - 为可选服务纳入任意环境文件。
    • --set ceph_namespace--set ceph_image--set ceph_tag - 如果正在使用 Ceph Storage,请额外纳入这些参数以定义 Ceph Storage 容器镜像的位置。请注意,ceph_image 现包含特定于 Satellite 的前缀。这个前缀与 --prefix 选项的值相同。例如:

      --set ceph_image=acme-osp13_containers-rhceph-3-rhel7

      这可确保 overcloud 使用符合 Satellite 命名规范的 Ceph 容器镜像。

  12. 这将创建 overcloud_images.yaml 环境文件,其中包含 Satellite 服务器上的镜像位置。需要将该文件包括在您的部署中。

registry 配置现在已经完成。

5.7. 后续步骤

现在,您已经拥有一个包含容器镜像来源列表的 overcloud_images.yaml 环境文件。请将该文件纳入到日后的所有部署操作中。