Red Hat Training

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

第 3 章 director 安装准备

3.1. 准备 undercloud

安装 director 需要准备好以下几项:

  • 一个用来执行命令的非 root 用户。
  • 用于组织镜像和模板的目录。
  • 一个可解析的主机名
  • 一个红帽订阅
  • 用于准备镜像和安装 director 的命令行工具

步骤

  1. root 用户身份登录 undercloud。
  2. 创建 stack 用户:

    [root@director ~]# useradd stack
  3. 为该用户设置密码:

    [root@director ~]# passwd stack
  4. 进行以下操作,以使用户在使用 sudo 时无需输入密码:

    [root@director ~]# echo "stack ALL=(root) NOPASSWD:ALL" | tee -a /etc/sudoers.d/stack
    [root@director ~]# chmod 0440 /etc/sudoers.d/stack
  5. 切换到新的 stack 用户:

    [root@director ~]# su - stack
    [stack@director ~]$
  6. director 使用系统镜像和 Heat 模板来创建 overcloud 环境。要让这些文件保持井然有序,建议您创建一些目录来存放镜像和模板:

    [stack@director ~]$ mkdir ~/images
    [stack@director ~]$ mkdir ~/templates
  7. 检查 undercloud 的基础和完整主机名:

    [stack@director ~]$ hostname
    [stack@director ~]$ hostname -f
  8. 如果上面的任何一个命令报错或没有输出正确的主机名,则请使用 hostnamectl 设置主机名:

    [stack@director ~]$ sudo hostnamectl set-hostname manager.example.com
    [stack@director ~]$ sudo hostnamectl set-hostname --transient manager.example.com
  9. 另外,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
  10. 在红帽 Content Delivery Network 或 Red Hat Satellite 注册您的系统。例如,在出现提示时,使用您的客户门户网站用户名和密码来注册 Content Delivery Network:

    [stack@director ~]$ sudo subscription-manager register
  11. 查找 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
  12. 查找 Pool ID 的值并附加 Red Hat OpenStack Platform 14 的权利:

    [stack@director ~]$ sudo subscription-manager attach --pool=Valid-Pool-Number-123456
  13. 禁用所有默认的仓库,然后启用 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 所需的软件包。

  14. 对系统上的软件进行一个更新来确保使用了最新的基本系统软件包:

    [stack@director ~]$ sudo yum update -y
    [stack@director ~]$ sudo reboot
  15. 安装用于安装和配置 director 的命令行工具:

    [stack@director ~]$ sudo yum install -y python-tripleoclient
  16. 如果要创建包含 Ceph Storage 节点的 overcloud,需要额外安装 ceph-ansible 软件包:

    [stack@director ~]$ sudo yum install -y ceph-ansible

3.2. 准备容器镜像

undercloud 配置需要一些初始注册表配置来确定从何处获取镜像以及如何存储它们。以下过程演示了如何生成并定制准备容器镜像所需的环境文件。

步骤

  1. 以 stack 用户身份登录 undercloud。
  2. 生成默认的容器镜像准备文件:

    $ 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 时的容器镜像来源。

  3. 编辑 containers-prepare-parameter.yaml,然后根据自己的需要进行修改。

3.3. 容器镜像准备参数

这个用于准备容器的默认文件 (containers-prepare-parameter.yaml) 中含有 ContainerImagePrepare Heat 参数。此参数定义一个用于准备一系列镜像的策略列表:

parameter_defaults:
  ContainerImagePrepare:
  - (strategy one)
  - (strategy two)
  - (strategy three)
  ...

每一策略接受一组子参数,它们定义要使用哪些镜像以及如何对待它们。下表中列出了用于各项 ContainerImagePrepare 策略的子参数:

参数描述

append_tag

要附加到目标镜像标签的字符串。

excludes

用于排除过滤器的镜像名称子字符串列表

includes

镜像名称字符串列表。必须至少匹配其中一项。如果指定了 includes,则所有 excludes 会被忽略。

modify_role

ansible 角色名称字符串,在上传过程中、推送到目的地之前运行。

modify_vars

要传递到 modify_role 的变量字典

modify_only_with_labels

用于过滤要修改的镜像的镜像标签字典。如果镜像与定义的标签匹配,则 director 将该镜像包括在修改过程中。

push_destination

用于在上传过程中推送镜像的注册表的命名空间。如果您指定这个参数的命名空间,则所有镜像参数也会使用此命名空间。如果设为 true,则 push_destination 设为 undercloud 注册表命名空间。

pull_source

要从中拉取原始镜像容器的源注册表。

set

用于定义从何处获取初始镜像的 key: value 定义的字典。

tag_from_label

定义要标记生成的镜像的标签模式。通常设为 \{version}-\{release}

set 参数接受一组 key: value 定义。下表列出了这些键:

描述

ceph_image

Ceph Storage 容器镜像的名称。

ceph_namespace

Ceph Storage 容器镜像的命名空间。

ceph_tag

Ceph Storage 容器镜像的标签。

name_prefix

各个 OpenStack 服务镜像的前缀。

name_suffix

各个 OpenStack 服务镜像的后缀。

namespace

各个 OpenStack 服务镜像的命名空间。

neutron_driver

用于确定要使用的 OpenStack Networking (neutron) 容器的驱动程序。null 值代表使用标准的 neutron-server 容器。设为 ovn 可使用基于 OVN 的容器。设为 odl 可使用基于 OpenDaylight 的容器。

tag

用于标识要拉取的镜像的标签。

注意

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

includesexcludes 条目控制如何过滤各个条目的镜像。匹配 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 中的组织。

步骤

  1. 创建可供默认 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
  2. 这将创建两个包含您的容器镜像信息的文件。您将使用这些文件将容器镜像同步到 Satellite 6 服务器。
  3. 从文件中删除与 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 服务器中的镜像列表。

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

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

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

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

    $ 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
  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 "OSP14 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 "OSP14 Containers"

    等待 Satellite 服务器完成同步。

    注意

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

  9. 如果您的 Satellite 6 服务器使用内容视图,请创建一个用于纳入镜像的新内容视图版本,并在应用生命周期的不同环境之间推进这个视图。这很大程度上取决于您的应用生命周期构造方式。例如,如果在生命周期中使用称为 production 的环境,并且您希望容器镜像可在这个环境中使用,那么请创建一个包含这些容器镜像的内容视图,并将该内容视图推进到 production 环境。如需更多信息,请参阅 "Managing Container Images with Content Views"
  10. 检查 base 镜像中的标签:

    $ hammer docker tag list --repository "base" \
      --organization "ACME" \
      --environment "production" \
      --content-view "myosp14" \
      --product "OSP14 Containers"

    这会在特定环境的内容视图中显示 OpenStack 平台容器镜像的标签。

  11. 返回到 undercloud,并生成默认的环境文件(将您的 Satellite 服务器用作源来准备镜像)。以下是用于生成环境文件的命令示例:

    (undercloud) $ openstack tripleo container image prepare default \
      --output-env-file containers-prepare-parameter.yaml
    • --output-env-file 是环境文件名称。此文件的内容包括用于为 undercloud 准备容器镜像的参数。在本例中,文件的名称是 containers-prepare-parameter.yaml
  12. 编辑 containers-prepare-parameter.yaml 文件,然后修改以下内容:

    • namespace - Satellite 服务器上注册表的 URL 和端口。Red Hat Satellite 上的默认注册表端口是 5000。
    • name_prefix - 该前缀基于 Satellite 6 规范。它的值根据您是否使用了内容视图而不同:

      • 如果您使用了内容视图,则前缀的结构为 [组织]-[环境]-[内容视图]-[产品]-。例如:acme-production-myosp14-osp14_containers-
      • 如果不使用内容视图,则前缀的结构为 [组织]-[产品]-。例如:acme-osp14_containers-
    • ceph_namespaceceph_imageceph_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 时使用此环境文件。