Red Hat Training
A Red Hat training course is available for Red Hat OpenStack Platform
第 3 章 director 安装准备
3.1. 准备 undercloud
安装 director 需要准备好以下几项:
- 一个用来执行命令的非 root 用户。
- 用于组织镜像和模板的目录。
- 一个可解析的主机名
- 一个红帽订阅
- 用于准备镜像和安装 director 的命令行工具
步骤
-
以
root
用户身份登录 undercloud。 创建
stack
用户:[root@director ~]# useradd stack
为该用户设置密码:
[root@director ~]# passwd stack
进行以下操作,以使用户在使用
sudo
时无需输入密码:[root@director ~]# echo "stack ALL=(root) NOPASSWD:ALL" | tee -a /etc/sudoers.d/stack [root@director ~]# chmod 0440 /etc/sudoers.d/stack
切换到新的
stack
用户:[root@director ~]# su - stack [stack@director ~]$
director 使用系统镜像和 Heat 模板来创建 overcloud 环境。要让这些文件保持井然有序,建议您创建一些目录来存放镜像和模板:
[stack@director ~]$ mkdir ~/images [stack@director ~]$ mkdir ~/templates
检查 undercloud 的基础和完整主机名:
[stack@director ~]$ hostname [stack@director ~]$ hostname -f
如果上面的任何一个命令报错或没有输出正确的主机名,则请使用
hostnamectl
设置主机名:[stack@director ~]$ sudo hostnamectl set-hostname manager.example.com [stack@director ~]$ sudo hostnamectl set-hostname --transient manager.example.com
另外,director 还需要在
/etc/hosts
中包括一个带有系统主机名和基础名称的条目。/etc/hosts
中的 IP 地址必须与您计划用于 undercloud 公共 API 的地址匹配。例如,如果系统名是manager.example.com
,其使用的 IP 地址是10.0.0.1
,/etc/hosts
则需要包括一个与以下内容类似的条目:10.0.0.1 manager.example.com manager
在红帽 Content Delivery Network 或 Red Hat Satellite 注册您的系统。例如,在出现提示时,使用您的客户门户网站用户名和密码来注册 Content Delivery Network:
[stack@director ~]$ sudo subscription-manager register
查找 Red Hat OpenStack Platform director 的权利池 ID。例如:
[stack@director ~]$ sudo subscription-manager list --available --all --matches="Red Hat OpenStack" Subscription Name: Name of SKU Provides: Red Hat Single Sign-On Red Hat Enterprise Linux Workstation Red Hat CloudForms Red Hat OpenStack Red Hat Software Collections (for RHEL Workstation) Red Hat Virtualization SKU: SKU-Number Contract: Contract-Number Pool ID: Valid-Pool-Number-123456 Provides Management: Yes Available: 1 Suggested: 1 Service Level: Support-level Service Type: Service-Type Subscription Type: Sub-type Ends: End-date System Type: Physical
查找
Pool ID
的值并附加 Red Hat OpenStack Platform 14 的权利:[stack@director ~]$ sudo subscription-manager attach --pool=Valid-Pool-Number-123456
禁用所有默认的仓库,然后启用 Red Hat Enterprise Linux 仓库:
[stack@director ~]$ sudo subscription-manager repos --disable=* [stack@director ~]$ sudo subscription-manager repos --enable=rhel-7-server-rpms --enable=rhel-7-server-extras-rpms --enable=rhel-7-server-rh-common-rpms --enable=rhel-ha-for-rhel-7-server-rpms --enable=rhel-7-server-openstack-14-rpms
这些仓库包括了安装 director 所需的软件包。
对系统上的软件进行一个更新来确保使用了最新的基本系统软件包:
[stack@director ~]$ sudo yum update -y [stack@director ~]$ sudo reboot
安装用于安装和配置 director 的命令行工具:
[stack@director ~]$ sudo yum install -y python-tripleoclient
如果要创建包含 Ceph Storage 节点的 overcloud,需要额外安装
ceph-ansible
软件包:[stack@director ~]$ sudo yum install -y ceph-ansible
3.2. 准备容器镜像
undercloud 配置需要一些初始注册表配置来确定从何处获取镜像以及如何存储它们。以下过程演示了如何生成并定制准备容器镜像所需的环境文件。
步骤
- 以 stack 用户身份登录 undercloud。
生成默认的容器镜像准备文件:
$ openstack tripleo container image prepare default \ --local-push-destination \ --output-env-file containers-prepare-parameter.yaml
这个命令使用以下额外选项:
-
--local-push-destination
,设置 undercloud 上的注册表作为存储容器镜像的位置。这意味着,director 将从红帽 Container Catalog 拉取所需的镜像,并将它们推送到 undercloud 上的注册表。在安装 undercloud 时,director 会使用这个注册表作为镜像来源。如果直接从红帽 Container Catalog 目录拉取镜像,请忽略这个选项。 --output-env-file
是环境文件名称。此文件的内容包括用于为 undercloud 准备容器镜像的参数。在本例中,文件的名称是containers-prepare-parameter.yaml
。注意也可以使用
containers-prepare-parameter.yaml
文件来定义部署 overcloud 时的容器镜像来源。
-
-
编辑
containers-prepare-parameter.yaml
,然后根据自己的需要进行修改。
3.3. 容器镜像准备参数
这个用于准备容器的默认文件 (containers-prepare-parameter.yaml
) 中含有 ContainerImagePrepare
Heat 参数。此参数定义一个用于准备一系列镜像的策略列表:
parameter_defaults: ContainerImagePrepare: - (strategy one) - (strategy two) - (strategy three) ...
每一策略接受一组子参数,它们定义要使用哪些镜像以及如何对待它们。下表中列出了用于各项 ContainerImagePrepare
策略的子参数:
参数 | 描述 |
---|---|
|
要附加到目标镜像标签的字符串。 |
|
用于排除过滤器的镜像名称子字符串列表 |
|
镜像名称字符串列表。必须至少匹配其中一项。如果指定了 includes,则所有 excludes 会被忽略。 |
|
ansible 角色名称字符串,在上传过程中、推送到目的地之前运行。 |
|
要传递到 |
|
用于过滤要修改的镜像的镜像标签字典。如果镜像与定义的标签匹配,则 director 将该镜像包括在修改过程中。 |
|
用于在上传过程中推送镜像的注册表的命名空间。如果您指定这个参数的命名空间,则所有镜像参数也会使用此命名空间。如果设为 |
|
要从中拉取原始镜像容器的源注册表。 |
|
用于定义从何处获取初始镜像的 |
|
定义要标记生成的镜像的标签模式。通常设为 |
set
参数接受一组 key: value
定义。下表列出了这些键:
键 | 描述 |
---|---|
|
Ceph Storage 容器镜像的名称。 |
|
Ceph Storage 容器镜像的命名空间。 |
|
Ceph Storage 容器镜像的标签。 |
|
各个 OpenStack 服务镜像的前缀。 |
|
各个 OpenStack 服务镜像的后缀。 |
|
各个 OpenStack 服务镜像的命名空间。 |
|
用于确定要使用的 OpenStack Networking (neutron) 容器的驱动程序。null 值代表使用标准的 |
|
用于标识要拉取的镜像的标签。 |
set
部分中可以包含多个以 openshift_
开头的参数,它们用于各种涉及 OpenShift-on-OpenStack 的场景。
3.4. 分层镜像准备条目
ContainerImagePrepare 的值是一个 YAML 列表。这意味着您可以指定多个条目。下例中包括了两个条目;在这个示例中,director 使用所有镜像的最新版本,但 nova-api
镜像除外,它使用标记为 14.0-44
的版本:
ContainerImagePrepare: - tag_from_label: "{version}-{release}" push_destination: true excludes: - nova-api set: namespace: registry.access.redhat.com/rhosp14 name_prefix: openstack- name_suffix: '' tag: latest - push_destination: true includes: - nova-api set: namespace: registry.access.redhat.com/rhosp14 tag: 14.0-44
includes
和 excludes
条目控制如何过滤各个条目的镜像。匹配 includes
策略的镜像的优先级高于 excludes
匹配项。镜像名称中必须包含相应的值,才能被视为匹配项。
3.5. 准备期间修改镜像
执行 prepare 期间,可以修改镜像来进行必要的更改,然后立即使用这些更改进行部署。修改镜像的用例包括:
- 作为连续集成管道的一个部分,在部署之前使用要测试的更改修改镜像。
- 作为开发工作流的一个部分,需要部署本地更改以进行测试和开发。
- 当更改需要部署但不能通过镜像构建管道(专用附加项、应急修补程序)提供时。
通过对各个需要修改的镜像调用 Ansible 角色来完成修改。角色会提取源镜像,进行请求的更改,然后标记结果。然后,prepare 命令会推送镜像,并设置指示已修改镜像的 heat 参数。
Ansible 角色 tripleo-modify-image
遵守必要的角色接口,为 modify 用例提供所需的行为。通过 ContainerImagePrepare
参数中的 modify 相关键来控制修改:
-
modify_role
指定为各个要修改的镜像调用哪一个 ansible 角色。 -
modify_append_tag
用于附加到源镜像标签的末尾。这可以标明生成的镜像已被修改过。在 push_destination 注册表已包含指定镜像时,也可用它来跳过修改。因此,任何时候必须修改镜像时,都建议您更改 modify_append_tag。 -
modify_vars
是要传递给角色的 ansible 变量的字典。
由 tripleo-modify-image
角色处理的不同用例通过将 tasks_from
变量设置为角色中所需的文件来选定。
在开发和测试用于修改镜像的 ContainerImagePrepare
条目时,建议您单独运行 prepare 以确认它的修改是否与预期相符:
sudo openstack tripleo container image prepare \ -e ~/containers-prepare-parameter.yaml
3.6. 更新容器镜像的现有软件包
以下条目将生成要在镜像中更新的所有软件包,但使用 undercloud 主机的 yum 软件仓库配置:
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 ...
3.7. 将额外的 RPM 文件安装到容器镜像中
可以安装一系列的 RPM 文件,这些文件可用于安装热修复补丁、本地软件包构建,或无法通过软件包仓库提供的软件包。例如,以下代码仅在 centos-binary-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 ...
3.8. 通过自定义 Dockerfile 修改容器镜像
为获得最大的灵活性,可以指定一个含有 Dockerfile 的目录来进行所需的修改。当角色被调用时,会生成 Dockerfile.modified,它将更改 FROM 指令并添加额外的 LABEL 指令。以下示例对 centos-binary-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 root 指令后,需要重新切换到原先镜像默认用户:
FROM docker.io/tripleomaster/centos-binary-nova-compute:latest USER root COPY customize.sh /tmp/ RUN /tmp/customize.sh USER "nova"
3.9. 为容器镜像准备 Satellite 服务器
Red Hat Satellite 6 提供了注册表同步功能。通过该功能可将多个镜像提取到 Satellite 服务器中,作为应用程序生命周期的一部分加以管理。Satellite 也可以作为注册表供其他启用容器功能的系统使用。如需了解更多有关管理容器镜像的详细信息,请参阅 Red Hat Satellite 6 Content Management Guide 中的 "Managing Container Images"。
以下操作过程示例中使用了 Red Hat Satellite 6 的 hammer
命令行工具和一个名为 ACME
的示例组织。请将该组织替换为您自己 Satellite 6 中的组织。
步骤
创建可供默认 overcloud 和 undercloud 使用的所有容器镜像的列表:
$ openstack overcloud container image prepare \ -r /usr/share/openstack-tripleo-heat-templates/roles_data.yaml \ --output-images-file /home/stack/satellite_images_overcloud $ openstack overcloud container image prepare \ -r /usr/share/openstack-tripleo-heat-templates/roles_data_undercloud.yaml \ --output-images-file /home/stack/satellite_images_undercloud
- 这将创建两个包含您的容器镜像信息的文件。您将使用这些文件将容器镜像同步到 Satellite 6 服务器。
从文件中删除与 YAML 相关的信息,然后将它们合并到一个仅含唯一镜像列表的平面文件。下列命令可实现这一目的:
$ awk -F ':' '{if (NR!=1) {gsub("[[:space:]]", ""); print $2}}' ~/satellite_images_overcloud | sed "s/registry.access.redhat.com\///g" > ~/satellite_images_overcloud_names $ awk -F ':' '{if (NR!=1) {gsub("[[:space:]]", ""); print $2}}' ~/satellite_images_undercloud | sed "s/registry.access.redhat.com\///g" > ~/satellite_images_undercloud_names $ cat ~/satellite_images_overcloud_names ~/satellite_images_undercloud_names | sort | uniq > ~/satellite_images_names
这样就得到了要提取到 Satellite 服务器中的镜像列表。
-
将
satellite_images_names
文件复制到包含 Satellite 6hammer
工具的系统中。或者按照 Hammer CLI Guide 中的说明将hammer
工具安装到 undercloud。 运行以下
hammer
命令,为您的 Satellite 组织创建新产品 (OSP14 Containers
):$ hammer product create \ --organization "ACME" \ --name "OSP14 Containers"
该定制产品将会包含我们的镜像。
为产品添加基本容器镜像:
$ hammer repository create \ --organization "ACME" \ --product "OSP14 Containers" \ --content-type docker \ --url https://registry.access.redhat.com \ --docker-upstream-name rhosp14/openstack-base \ --name base
添加
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 "OSP14 Containers" \ --content-type docker \ --url https://registry.access.redhat.com \ --docker-upstream-name $IMAGE \ --name $IMAGENAME ; done < satellite_images_names
同步容器镜像:
$ hammer product synchronize \ --organization "ACME" \ --name "OSP14 Containers"
等待 Satellite 服务器完成同步。
注意根据具体配置情况,
hammer
可能会询问您的 Satellite 服务器用户名和密码。您可以使用配置文件将hammer
配置为自动登录。请参阅 Hammer CLI Guide 中的“Authentication”部分。-
如果您的 Satellite 6 服务器使用内容视图,请创建一个用于纳入镜像的新内容视图版本,并在应用生命周期的不同环境之间推进这个视图。这很大程度上取决于您的应用生命周期构造方式。例如,如果在生命周期中使用称为
production
的环境,并且您希望容器镜像可在这个环境中使用,那么请创建一个包含这些容器镜像的内容视图,并将该内容视图推进到production
环境。如需更多信息,请参阅 "Managing Container Images with Content Views"。 检查
base
镜像中的标签:$ hammer docker tag list --repository "base" \ --organization "ACME" \ --environment "production" \ --content-view "myosp14" \ --product "OSP14 Containers"
这会在特定环境的内容视图中显示 OpenStack 平台容器镜像的标签。
返回到 undercloud,并生成默认的环境文件(将您的 Satellite 服务器用作源来准备镜像)。以下是用于生成环境文件的命令示例:
(undercloud) $ 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
文件,然后修改以下内容:-
namespace
- Satellite 服务器上注册表的 URL 和端口。Red Hat Satellite 上的默认注册表端口是 5000。 name_prefix
- 该前缀基于 Satellite 6 规范。它的值根据您是否使用了内容视图而不同:-
如果您使用了内容视图,则前缀的结构为
[组织]-[环境]-[内容视图]-[产品]-
。例如:acme-production-myosp14-osp14_containers-
。 -
如果不使用内容视图,则前缀的结构为
[组织]-[产品]-
。例如:acme-osp14_containers-
。
-
如果您使用了内容视图,则前缀的结构为
-
ceph_namespace
、ceph_image
、ceph_tag
- 如果正在使用 Ceph Storage,请额外纳入这些参数以定义 Ceph Storage 容器镜像的位置。请注意,ceph_image
现包含特定于 Satellite 的前缀。这个前缀与name_prefix
选项的值相同。
-
以下是含有特定于 Satellite 的参数的示例环境文件:
parameter_defaults: ContainerImagePrepare: - push_destination: true set: ceph_image: acme-production-myosp14-osp14_containers-rhceph-3-rhel7 ceph_namespace: satellite.example.com:5000 ceph_tag: latest name_prefix: acme-production-myosp14-osp14_containers- name_suffix: '' namespace: satellite.example.com:5000 neutron_driver: null tag: latest ... tag_from_label: '{version}-{release}'
在创建 undercloud 和 overcloud 时使用此环境文件。