1.3. 在您自己的基础架构的 OpenStack 上安装集群


在 OpenShift Container Platform 版本 4.4 中,您可以在运行于用户置备的基础架构上的 Red Hat OpenStack Platform(RHOSP)上安装集群。

通过利用您自己的基础架构,您可以将集群与现有的基础架构进行集成。和安装程序置备的安装方式相比,这个过程需要用户进行更多操作,因为您必须创建所有 RHOSP 资源,如 Nova 服务器、Neutron 端口和安全组。红帽提供了 Ansible playbook 来帮助您完成部署过程。

1.3.1. 先决条件

  • 查看有关 OpenShift Container Platform 安装和更新流程的详细信息。

  • 验证您的网络配置不依赖于供应商网络。不支持提供商网络。
  • 具有要安装 OpenShift Container Platform 的 RHOSP 帐户
  • 在您运行安装程序的机器中,有:

    • 用来保存在安装过程中创建的文件的一个单一目录
    • Python 3

1.3.2. OpenShift Container Platform 对互联网和 Telemetry 的访问

在 OpenShift Container Platform 4.4 中,您需要访问互联网来安装集群。默认运行的 Telemetry 服务提供有关集群健康状况和成功更新的指标,这也需要访问互联网。如果您的集群连接到互联网,Telemetry 会自动运行,而且集群会注册到 Red Hat OpenShift Cluster Manager(OCM)。

确认 Red Hat OpenShift Cluster Manager 清单正确后,可以由 Telemetry 自动维护,也可以使用 OCM 手动维护,使用订阅监控 来跟踪帐户或多集群级别的 OpenShift Container Platform 订阅。

您必须具有以下互联网访问权限:

  • 访问 Red Hat OpenShift Cluster Manager 页面,以下载安装程序并执行订阅管理。如果集群可以访问互联网,并且没有禁用 Telemetry,该服务会自动授权您的集群。
  • 访问 Quay.io,以获取安装集群所需的软件包。
  • 获取执行集群更新所需的软件包。
重要

如果您的集群无法直接访问互联网,则可以在置备的某些类基础架构上执行受限网络安装。在此过程中,您要下载所需的内容,并使用它在镜像 registry(mirror registry) 中填充安装集群并生成安装程序所需的软件包。对于某些安装类型,集群要安装到的环境不需要访问互联网。在更新集群之前,要更新 registry 镜像系统中的内容。

1.3.3. 在 RHOSP 上安装 OpenShift Container Platform 的资源指南

您的 Red Hat OpenStack Platform(RHOSP)配额需要满足以下条件才支持 OpenShift Container Platform 安装:

表 1.11. RHOSP 上默认 OpenShift Container Platform 集群的建议资源
资源

浮动 IP 地址

3

端口

15

路由器

1

子网

1

RAM

112 GB

vCPUs

28

卷存储

275 GB

实例

7

安全组

3

安全组规则

60

集群或许能使用少于推荐数量的资源来运作,但其性能无法保证。

重要

如果 RHOSP 对象存储(Swift)可用,并由具有 swiftoperator 角色的用户帐户执行,它会作为 OpenShift Container Platform 镜像 registry 的默认后端。在这种情况下,卷存储需要有 175GB。根据镜像 registry 的大小,Swift 空间要求会有所不同。

注意

默认情况下,您的安全组和安全组规则配额可能较低。如果遇到问题,请以 admin 的身份运行 openstack quota set --secgroups 3 --secgroup-rules 60 <project> 来提高配额。

OpenShift Container Platform 部署由 control plane 机器、计算机器和 bootstrap 机器组成。

1.3.3.1. control plane 和计算机器

默认情况下,OpenShift Container Platform 安装进程支持三台 control plane 和三台计算机器。

每台机器都需要:

  • 来自 RHOSP 配额的实例
  • 来自 RHOSP 配额的端口
  • 其类别至少有 16 GB 内存、4 个 vCPU 和 25GB 存储空间
提示

计算机器托管您在 OpenShift Container Platform 上运行的应用程序;运行数量应尽可能多。

1.3.3.2. bootstrap 机器

在安装时,会临时置备 bootstrap 机器来支持 control plane。生产控制平面就绪后,bootstrap 机器会被取消置备。

bootstrap 机器需要:

  • 来自 RHOSP 配额的实例
  • 来自 RHOSP 配额的端口
  • 其类别至少有 16 GB 内存、4 个 vCPU 和 25GB 存储空间

1.3.4. 下载 playbook 的依赖项

简化用户置备基础架构安装过程的 Ansible playbook 需要几个 Python 模块。在您要运行安装程序的机器上添加模块的仓库,然后下载它们。

注意

这些说明假设您使用 Red Hat Enterprise Linux(RHEL)8。

先决条件

  • Python 3 已在您的机器上安装

流程

  1. 在命令行中添加软件仓库:

    $ sudo subscription-manager register # If not done already
    $ sudo subscription-manager attach --pool=$YOUR_POOLID # If not done already
    $ sudo subscription-manager repos --disable=* # If not done already
    
    $ sudo subscription-manager repos \
      --enable=rhel-8-for-x86_64-baseos-rpms \
      --enable=openstack-16-tools-for-rhel-8-x86_64-rpms \
      --enable=ansible-2.9-for-rhel-8-x86_64-rpms \
      --enable=rhel-8-for-x86_64-appstream-rpms
  2. 安装模块:

    $ sudo yum install python3-openstackclient ansible python3-openstacksdk python3-netaddr
  3. 确保 python 命令指向 python3:

    $ sudo alternatives --set python /usr/bin/python3

1.3.5. 获取安装程序

在安装 OpenShift Container Platform 之前,将安装文件下载到本地计算机上。

先决条件

  • 必须从使用 Linux 或 macOS 的计算机安装集群。
  • 需要 500 MB 本地磁盘空间来下载安装程序。

流程

  1. 访问 Red Hat OpenShift Cluster Manager 网站的 Infrastructure Provider 页面。如果您有红帽帐号,请使用自己的凭证登录。如果没有,请创建一个帐户。
  2. 进入适用于您的安装类型的页面,下载您的操作系统的安装程序,并将文件放在要保存安装配置文件的目录中。。

    重要

    安装程序会在用来安装集群的计算机上创建若干文件。在完成集群安装后,您必须保留安装程序和安装程序所创建的文件。

    重要

    删除安装程序创建的文件不会删除您的集群,即使集群在安装过程中失败也是如此。您必须完成针对特定云供应商的 OpenShift Container Platform 卸载流程,才能完全删除您的集群。

  3. 提取安装程序。例如,在使用 Linux 操作系统的计算机上运行以下命令:

    $ tar xvf <installation_program>.tar.gz
  4. 在 Red Hat OpenShift Cluster Manager 站点的 Pull Secret 页面中,下载您的安装 pull secret 的 .txt 文件。通过此 pull secret,您可以进行所含授权机构提供的服务的身份验证,这些服务包括为 OpenShift Container Platform 组件提供容器镜像的 Quay.io。

1.3.6. 生成 SSH 私钥并将其添加到代理中

如果要在集群上执行安装调试或灾难恢复,则必须为 ssh-agent 和安装程序提供 SSH 密钥。您可以使用此密钥访问公共集群中的 bootstrap 机器来排除安装问题。

注意

在生产环境中,您需要进行灾难恢复和调试。

您可以使用此密钥以 core 用户身份通过 SSH 连接到 master 节点。在部署集群时,此密钥会添加到 core 用户的 ~/.ssh/authorized_keys 列表中。

注意

您必须使用一个本地密钥,而不要使用在特定平台上配置的密钥,如 AWS 密钥对

流程

  1. 如果还没有为计算机上免密码身份验证而配置的 SSH 密钥,请创建一个。例如,在使用 Linux 操作系统的计算机上运行以下命令:

    $ ssh-keygen -t ed25519 -N '' \
        -f <path>/<file_name> 1
    1
    指定 SSH 密钥的路径和文件名,如 ~/.ssh/id_rsa。不要指定已存在的 SSH 密钥,因为它会被覆盖。

    运行此命令会在指定的位置生成不需要密码的 SSH 密钥。

  2. 作为后台任务启动 ssh-agent 进程:

    $ eval "$(ssh-agent -s)"
    
    Agent pid 31874
  3. 将 SSH 私钥添加到 ssh-agent

    $ ssh-add <path>/<file_name> 1
    
    Identity added: /home/<you>/<path>/<file_name> (<computer_name>)
    1
    指定 SSH 私钥的路径和文件名,如 ~/.ssh/id_rsa

后续步骤

  • 在安装 OpenShift Container Platform 时,为安装程序提供 SSH 公钥。

1.3.7. 创建 Red Hat Enterprise Linux CoreOS (RHCOS) 镜像

OpenShift Container Platform 安装程序要求 Red Hat OpenStack Platform (RHOSP) 集群中有 Red Hat Enterprise Linux CoreOS (RHCOS) 镜像。检索最新的 RHCOS 镜像,然后使用 RHOSP CLI 上传该镜像。

先决条件

  • 已安装了 RHOSP CLI。

流程

  1. 登录到红帽客户门户网站的产品下载页
  2. Version 下,为 Red Hat Enterprise Linux(RHEL)8 选择 OpenShift Container Platform 4.4 的最新发行版本。

    重要

    RHCOS 镜像可能不会随着 OpenShift Container Platform 的每一发行版本都有改变。您必须下载最高版本的镜像,其版本号应小于或等于您安装的 OpenShift Container Platform 版本。如果可用,请使用与 OpenShift Container Platform 版本匹配的镜像版本。

  3. 下载 Red Hat Enterprise Linux CoreOS - OpenStack Image (QCOW)
  4. 解压镜像。

    注意

    您必须解压 RHOSP 镜像,然后集群才能使用它。下载的文件名可能不包含压缩扩展名,如 .gz.tgz。要找出是否或者如何压缩文件,请在命令行中输入:

    $ file <name_of_downloaded_file>
  5. 从您下载的镜像,使用 RHOSP CLI 在集群中创建名为 rhcos 的镜像:

    $ openstack image create --container-format=bare --disk-format=qcow2 --file rhcos-${RHCOS_VERSION}-openstack.qcow2 rhcos
    重要

    根据您的 RHOSP 环境,可能需要使用 .raw.qcow2 格式下载镜像。如果使用 Ceph,则必须使用 .raw 格式。

    警告

    如果安装程序发现多个同名的镜像,它会随机选择其中之一。为避免这种行为,请在 RHOSP 中为资源创建唯一名称。

将镜像上传到 RHOSP 后,就可以被安装程序使用。

1.3.8. 验证外部网络访问

OpenShift Container Platform 安装进程需要外部网络访问权限。您必须为其提供外部网络值,否则部署会失败。在运行安装进程前,请验证 Red Hat OpenStack Platform (RHOSP) 中是否存在具有外部路由器类型的网络。

流程

  1. 使用 RHOSP CLI 验证“外部”网络的名称和 ID:

    $ openstack network list --long -c ID -c Name -c "Router Type"
    
    +--------------------------------------+----------------+-------------+
    | ID                                   | Name           | Router Type |
    +--------------------------------------+----------------+-------------+
    | 148a8023-62a7-4672-b018-003462f8d7dc | public_network | External    |
    +--------------------------------------+----------------+-------------+

网络列表中会显示具有外部路由器类型的网络。如果最少有一个没有,请参阅 创建默认浮动 IP 网络创建默认供应商网络

注意

如果启用了 Neutron 中继服务插件,则默认创建中继端口。如需更多信息,请参阅 Neutron 中继端口

1.3.9. 启用对环境的访问

在部署时,所有 OpenShift Container Platform 机器都是在 Red Hat OpenStack Platform (RHOSP) 租户网络中创建的。因此,大多数 RHOSP 部署中都无法直接访问它们。

您可以配置 OpenShift Container Platform API 和在集群中运行的应用程序,以便使用浮动 IP 地址访问它们。

1.3.9.1. 启用通过浮动 IP 地址进行访问

创建两个浮动 IP (FIP) 地址:一个用于外部到 OpenShift Container Platform API 的访问(API FIP),另一个用于 OpenShift Container Platform 应用程序(apps FIP)。

重要

install-config.yaml 文件中也会使用 API FIP。

流程

  1. 使用 Red Hat OpenStack Platform (RHOSP) CLI,创建 API FIP:

    $ openstack floating ip create --description "API <cluster_name>.<base_domain>" <external network>
  2. 使用 Red Hat OpenStack Platform (RHOSP) CLI,创建应用程序或 Ingress,FIP:

    $ openstack floating ip create --description "Ingress <cluster_name>.<base_domain>" <external network>
  3. 要反映新的 FIPS,请将符合这些特征的记录添加到 DNS 服务器中:

    api.<cluster_name>.<base_domain>.  IN  A  <API_FIP>
    *.apps.<cluster_name>.<base_domain>. IN  A <apps_FIP>
    注意

    如果您不控制 DNS 服务器,可以改为将记录添加到 /etc/hosts 文件中。此操作使 API 可供您自己访问,不适合于生产部署。这可用于进行开发和测试的安装。

提示

您可以通过分配浮动 IP 地址并更新防火墙配置,使 OpenShift Container Platform 资源在集群之外可用。

1.3.10. 为安装程序定义参数

OpenShift Container Platform 安装程序依赖于一个名为 clouds.yaml 的文件。该文件描述了 Red Hat OpenStack Platform (RHOSP) 配置参数,包括项目名称、登录信息和授权服务 URL。

流程

  1. 创建 clouds.yaml 文件:

    • 如果您的 RHOSP 发行版包含 Horizon web UI,请在该 UI 中生成 clouds.yaml 文件。

      重要

      请记住在 auth 字段中添加密码。您也可以把 secret 保存在 clouds.yaml 以外的一个独立的文件中。

    • 如果您的 RHOSP 发行版不包含 Horizon Web UI,或者您不想使用 Horizon,请自行创建该文件。如需有关 clouds.yaml 的详细信息,请参阅 RHOSP 文档中的配置文件

      clouds:
        shiftstack:
          auth:
            auth_url: http://10.10.14.42:5000/v3
            project_name: shiftstack
            username: shiftstack_user
            password: XXX
            user_domain_name: Default
            project_domain_name: Default
        dev-env:
          region_name: RegionOne
          auth:
            username: 'devuser'
            password: XXX
            project_name: 'devonly'
            auth_url: 'https://10.10.14.22:5001/v2.0'
  2. 如果您的 RHOSP 安装使用自签名证书颁发机构 (CA) 证书进行端点身份验证:

    1. 将 CA 文件复制到您的机器中。
    2. 在命令行中,运行以下命令将机器添加到 CA 信任捆绑包中:

      $ sudo cp ca.crt.pem /etc/pki/ca-trust/source/anchors/
      $ sudo update-ca-trust extract
    3. cacerts 键添加到 clouds.yaml 文件。该值必须是到 CA 证书的绝对路径,则其可以被非根用户访问:

      clouds:
        shiftstack:
          ...
          cacert: "/etc/pki/ca-trust/source/anchors/ca.crt.pem"
      提示

      使用自定义 CA 证书运行安装程序后,您可以通过编辑 cloud-provider-config keymap 中的ca-cert.pem 键的值来更新证书。在命令行中运行:

      $ oc edit configmap -n openshift-config cloud-provider-config
  3. clouds.yaml 文件放在以下位置之一:

    1. OS_CLIENT_CONFIG_FILE 环境变量的值
    2. 当前目录
    3. 特定于 Unix 的用户配置目录,如 ~/.config/openstack/clouds.yaml
    4. 特定于 Unix 的站点配置目录,如 /etc/openstack/clouds.yaml

      安装程序会按照以上顺序搜索 clouds.yaml

1.3.11. 创建安装配置文件

您可以自定义在 Red Hat OpenStack Platform(RHOSP)上安装的 OpenShift Container Platform 集群。

先决条件

  • 获取 OpenShift Container Platform 安装程序以及集群的 pull secret。

流程

  1. 创建 install-config.yaml 文件。

    1. 运行以下命令:

      $ ./openshift-install create install-config --dir=<installation_directory> 1
      1
      对于 <installation_directory>,请指定用于保存安装程序所创建的文件的目录名称。
      重要

      指定一个空目录。一些安装信息,如 bootstrap X.509 证书,有较短的过期间隔,因此不要重复使用安装目录。如果要重复使用另一个集群安装中的个别文件,可以将其复制到您的目录中。但是,一些安装数据的文件名可能会在发行版本之间有所改变。从 OpenShift Container Platform 老版本中复制安装文件时要格外小心。

    2. 在提示符处,提供您的云的配置详情:

      1. 可选:选择用来访问集群机器的 SSH 密钥。

        注意

        对于您要在其上执行安装调试或灾难恢复的生产环境 OpenShift Container Platform 集群,请指定 ssh-agent 进程使用的 SSH 密钥。

      2. 选择 openstack 作为目标平台。
      3. 指定用于安装集群的 Red Hat OpenStack Platform (RHOSP) 外部网络名称。
      4. 指定用于从外部访问 OpenShift API 的浮动 IP 地址。
      5. 指定至少有 16 GB RAM 用于 control plane 和计算节点的 RHOSP 类别。
      6. 选择集群要部署到的基域。所有 DNS 记录都将是这个基域的子域,并包含集群名称。
      7. 为集群输入一个名称。名称不能多于 14 个字符。
      8. 粘贴从 Red Hat OpenShift Cluster Manager 站点的 Pull Secret 页面中获取的 pull secret。
  2. 修改 install-config.yaml 文件。您可以在安装配置参数部分中找到有关可用参数的更多信息。
  3. 备份 install-config.yaml 文件,以便用于安装多个集群。

    重要

    install-config.yaml 文件会在安装过程中消耗掉。如果要重复使用此文件,必须现在备份。

现在,文件 install-config.yaml 位于您指定的目录中。

1.3.12. 安装配置参数

在部署 OpenShift Container Platform 集群前,您可以提供参数值,以描述托管集群的云平台的帐户并选择性地自定义集群平台。在创建 install-config.yaml 安装配置文件时,您可以通过命令行来提供所需的参数的值。如果要自定义集群,可以修改 install-config.yaml 文件来提供关于平台的更多信息。

注意

安装之后,您无法修改 install-config.yaml 文件中的这些参数。

表 1.12. 所需的参数
参数描述

baseDomain

云供应商的基域。此值用于创建到 OpenShift Container Platform 集群组件的路由。集群的完整 DNS 名称是 baseDomainmetadata.name 参数值的组合,其格式为 <metadata.name>.<baseDomain>

完全限定域名或子域名,如 example.com

controlPlane.platform

托管 control plane 机器的云供应商。此参数值必须与 compute.platform 参数值匹配。

awsazuregcpopenstack{}

compute.platform

托管 worker 机器的云供应商。此参数值必须与 controlPlane.platform 参数值匹配。

awsazuregcpopenstack{}

metadata.name

集群的名称。

包含大写字母或小写字母的字符串,如 dev。该字符串长度必须为 14 个字符或更少。

platform.<platform>.region

集群要部署到的区域。

云的有效区域,如 AWS 的 us-east-1、Azure 的 centralus。Red Hat OpenStack Platform (RHOSP) 不使用这个参数

pullSecret

从 Red Hat OpenShift Cluster Manager 站点的 Pull Secret 页面中获取的 pull secret。您可以使用此 pull secret 来进行所含授权机构提供的服务的身份验证,这些服务包括为 OpenShift Container Platform 组件提供容器镜像的 Quay.io。

{
   "auths":{
      "cloud.openshift.com":{
         "auth":"b3Blb=",
         "email":"you@example.com"
      },
      "quay.io":{
         "auth":"b3Blb=",
         "email":"you@example.com"
      }
   }
}
表 1.13. 可选参数
参数描述

sshKey

用于访问集群机器的 SSH 密钥。

注意

对于您要在其上执行安装调试或灾难恢复的生产环境 OpenShift Container Platform 集群,请指定 ssh-agent 进程使用的 SSH 密钥。

添加到 ssh-agent 进程的有效本地公共 SSH 密钥。

fips

是否启用或禁用 FIPS 模式。默认情况下不启用 FIPS 模式。如果启用了 FIPS 模式,运行 OpenShift Container Platform 的 Red Hat Enterprise Linux CoreOS (RHCOS) 机器会绕过默认的 Kubernetes 加密套件,并使用由 RHCOS 提供的加密模块。

falsetrue

publish

如何发布集群的面向用户的端点。

InternalExternal。把 publish 设置为 Internal 以部署一个私有集群,它不能被互联网访问。默认值为 External

compute.hyperthreading

是否在计算机器上启用或禁用并发多线程或超线程。默认情况下,启用并发多线程以提高机器内核的性能。

重要

如果禁用并发多线程,请确保在容量规划时考虑到机器性能可能会显著降低的问题。

EnabledDisabled

compute.replicas

要置备的计算机器数量,也称为 worker 机器。

大于或等于 2 的正整数。默认值为 3

controlPlane.hyperthreading

是否在 control plane 机器上启用或禁用并发多线程或超线程。默认情况下,启用并发多线程以提高机器内核的性能。

重要

如果禁用并发多线程,请确保在容量规划时考虑到机器性能可能会显著降低的问题。

EnabledDisabled

controlPlane.replicas

要置备的 control plane 机器数量。

唯一支持的值是 3,它是默认值。

表 1.14. 其他 Red Hat OpenStack Platform (RHOSP) 参数
参数描述

compute.platform.openstack.rootVolume.size

对于计算机器,以 GB 为单位表示的根卷大小。如果您不设置这个值,机器将使用临时存储。

整数,如 30

compute.platform.openstack.rootVolume.type

对于计算机器,根卷的类型。

字符串,如 performance

controlPlane.platform.openstack.rootVolume.size

对于 control plane 机器,以 GB 为单位表示的根卷大小。如果您不设置这个值,机器将使用临时存储。

整数,如 30

controlPlane.platform.openstack.rootVolume.type

对于 control plane 机器,根卷的类型。

字符串,如 performance

platform.openstack.cloud

要使用的 RHOSP 云的名称,来自于 clouds.yaml 文件中的云列表。

字符串,如 MyCloud

platform.openstack.computeFlavor

用于 control plane 和计算机器的 RHOSP 类别。

字符串,如 m1.xlarge

platform.openstack.externalNetwork

用于安装的 RHOSP 外部网络名称。

字符串,如 external

platform.openstack.lbFloatingIP

与负载均衡器 API 关联的现有浮动 IP 地址。

IP 地址,如 128.0.0.1

表 1.15. 可选的 Red Hat OpenStack Platform(RHOSP)参数
参数描述

platform.openstack.clusterOSImage

安装程序从中下载 RHCOS 镜像的位置。

您必须设置此参数以便在受限网络中执行安装。

HTTP 或 HTTPS URL,可选使用 SHA-256 checksum。

例如: http://mirror.example.com/images/rhcos-43.81.201912131630.0-openstack.x86_64.qcow2.gz?sha256=ffebbd68e8a1f2a245ca19522c16c86f67f9ac8e4e0c1f0a812b068b16f7265d

该值也可以是现有 Glance 镜像的名称,如 my-rhcos

platform.openstack.defaultMachinePlatform

默认机器池平台配置。

{
   "type": "ml.large",
   "rootVolume": {
      "size": 30,
      "type": "performance"
   }
}

platform.openstack.externalDNS

集群实例用于进行 DNS 解析的外部 DNS 服务器的 IP 地址。

包括 IP 地址列表的字符串,如 ["8.8.8.8", "192.168.1.12"]

1.3.12.1. RHOSP 的自定义 install-config.yaml 文件示例

此示例 install-config.yaml 展示了所有可能的 Red Hat OpenStack Platform (RHOSP) 自定义选项。

重要

此示例文件仅供参考。您必须使用安装程序来获取 install-config.yaml 文件。

apiVersion: v1
baseDomain: example.com
clusterID: os-test
controlPlane:
  name: master
  platform: {}
  replicas: 3
compute:
- name: worker
  platform:
    openstack:
      type: ml.large
  replicas: 3
metadata:
  name: example
networking:
  clusterNetwork:
  - cidr: 10.128.0.0/14
    hostPrefix: 23
  machineNetwork:
  - cidr: 10.0.0.0/16
  serviceNetwork:
  - 172.30.0.0/16
  networkType: OpenShiftSDN
platform:
  openstack:
    cloud: mycloud
    externalNetwork: external
    computeFlavor: m1.xlarge
    lbFloatingIP: 128.0.0.1
fips: false
pullSecret: '{"auths": ...}'
sshKey: ssh-ed25519 AAAA...

1.3.12.2. 为机器设置自定义子网

安装程序默认使用的 IP 范围可能与您在安装 OpenShift Container Platform 时创建的 Neutron 子网不匹配。如有必要,通过编辑安装配置文件来更新新机器的 CIDR 值。

先决条件

  • 有 OpenShift Container Platform 安装程序生成的 install-config.yaml 文件。

流程

  1. 在命令行中进入包含 install-config.yaml 的目录。
  2. 在该目录中,运行脚本来编辑 install-config.yaml 文件或手动更新该文件:

    • 要使用脚本设置值,请运行:

      python -c '
      import yaml;
      path = "install-config.yaml";
      data = yaml.safe_load(open(path));
      data["networking"]["machineNetwork"] = [{"cidr": "192.168.0.0/18"}]; 1
      open(path, "w").write(yaml.dump(data, default_flow_style=False))'
      1
      插入一个与您指定的 Neutron 子网匹配的值,如 192.0.2.0/24
    • 要手动设置这个值,请打开该文件并将 networking.machineCIDR 的值设置为与您预期的 Neutron 子网匹配的内容。

1.3.12.3. 清空计算机器池

要进行使用您自己的基础架构的安装,请将安装配置文件中的计算机器数量设置为零。之后,您可以手动创建这些机器。

先决条件

  • 有 OpenShift Container Platform 安装程序生成的 install-config.yaml 文件。

流程

  1. 在命令行中进入包含 install-config.yaml 的目录。
  2. 在该目录中,运行脚本来编辑 install-config.yaml 文件或手动更新该文件:

    • 要使用脚本设置值,请运行:

      $ python -c '
      import yaml;
      path = "install-config.yaml";
      data = yaml.safe_load(open(path));
      data["compute"][0]["replicas"] = 0;
      open(path, "w").write(yaml.dump(data, default_flow_style=False))'
    • 要手动设置值,打开文件并将 compute.<first entry>.replicas 的值设置为 0

1.3.13. 创建 Kubernetes 清单和 Ignition 配置文件

由于您必须修改一些集群定义文件并要手动启动集群机器,因此您必须生成 Kubernetes 清单和 Ignition 配置文件,集群需要这两项来创建其机器。

重要

安装程序生成的 Ignition 配置文件包含在 24 小时后过期的证书,然后在过期时进行续订。如果在更新证书前关闭集群,且集群在 24 小时后重启,集群会自动恢复过期的证书。一个例外情况是,您需要手动批准待处理的 node-bootstrapper 证书签名请求(CSR)来恢复 kubelet 证书。如需更多信息,请参阅从过期的 control plane 证书中恢复的文档。

先决条件

  • 获取 OpenShift Container Platform 安装程序。
  • 创建 install-config.yaml 安装配置文件。

流程

  1. 为集群生成 Kubernetes 清单:

    $ ./openshift-install create manifests --dir=<installation_directory> 1
    
    INFO Consuming Install Config from target directory
    WARNING Making control-plane schedulable by setting MastersSchedulable to true for Scheduler cluster settings
    1
    对于 <installation_directory>,请指定含有您创建的 install-config.yaml 文件的安装目录。

    由于您稍后会在安装过程中自行创建计算机器,因此可以忽略这个警告。

  2. 删除定义 control plane 机器的 Kubernetes 清单文件以及计算机器集:

    $ rm -f openshift/99_openshift-cluster-api_master-machines-*.yaml openshift/99_openshift-cluster-api_worker-machineset-*.yaml

    由于您要自行创建和管理这些资源,因此不必初始化这些资源。

    • 您可以使用机器 API 来保留机器集文件来创建计算机器,但您必须更新对其的引用,以匹配您的环境。
  3. 修改 <installation_directory>/manifests/cluster-scheduler-02-config.yml Kubernetes 清单文件,以防止在 control plane 机器上调度 Ppd:

    1. 打开 <installation_directory>/manifests/cluster-scheduler-02-config.yml 文件。
    2. 找到 mastersSchedulable 参数,并将其值设为 False
    3. 保存并退出文件。
    注意

    目前,由于 Kubernetes 限制,入口负载均衡器将无法访问在 control plane 机器上运行的路由器 Pod。以后的 OpenShift Container Platform 次要版本中可能不需要这一步骤。

  4. 获取 Ignition 配置文件:

    $ ./openshift-install create ignition-configs --dir=<installation_directory> 1
    1
    对于 <installation_directory>,请指定相同的安装目录。

    该目录中将生成以下文件:

    .
    ├── auth
    │   ├── kubeadmin-password
    │   └── kubeconfig
    ├── bootstrap.ign
    ├── master.ign
    ├── metadata.json
    └── worker.ign
  5. 将元数据文件的 infraID 键导出为环境变量:

    $ export INFRA_ID=$(jq -r .infraID metadata.json)
提示

metadata.json 中提取 infraID 键,并将其用作您创建的所有 RHOSP 资源的前缀。通过这样做,您可以避免在同一项目中进行多个部署时的名称冲突。endif::osp[]

1.3.14. 准备 bootstrap Ignition 文件

OpenShift Container Platform 安装过程依赖于从 bootstrap Ignition 配置文件创建的 bootstrap 机器。

编辑该文件并上传该文件。然后,创建 Red Hat OpenStack Platform(RHOSP)用来下载主文件的辅助 bootstrap Ignition 配置文件。

先决条件

  • 您有安装程序生成的 bootstrap Ignition 文件,即 bootstrap.ign
  • 安装程序元数据文件中的基础架构 ID 被设置为环境变量($INFRA_ID)。

    • 如果未设置变量,请参阅 创建 Kubernetes 清单和 Ignition 配置文件
  • 可以使用 HTTP(S) 来存储 bootstrap ignition 文件。

    • 所记录的步骤使用 RHOSP 镜像服务(Glance),但也可以使用 RHOSP Storage 服务(Swift)、Amazon S3、内部 HTTP 服务器或临时 Nova 服务器。

流程

  1. 运行以下 Python 脚本。该脚本修改 bootstrap Ignition 文件,以设置主机名,并在运行时设置 CA 证书文件:

    import base64
    import json
    import os
    
    with open('bootstrap.ign', 'r') as f:
        ignition = json.load(f)
    
    files = ignition['storage'].get('files', [])
    
    infra_id = os.environ.get('INFRA_ID', 'openshift').encode()
    hostname_b64 = base64.standard_b64encode(infra_id + b'-bootstrap\n').decode().strip()
    files.append(
    {
        'path': '/etc/hostname',
        'mode': 420,
        'contents': {
            'source': 'data:text/plain;charset=utf-8;base64,' + hostname_b64,
            'verification': {}
        },
        'filesystem': 'root',
    })
    
    ca_cert_path = os.environ.get('OS_CACERT', '')
    if ca_cert_path:
        with open(ca_cert_path, 'r') as f:
            ca_cert = f.read().encode()
            ca_cert_b64 = base64.standard_b64encode(ca_cert).decode().strip()
    
        files.append(
        {
            'path': '/opt/openshift/tls/cloud-ca-cert.pem',
            'mode': 420,
            'contents': {
                'source': 'data:text/plain;charset=utf-8;base64,' + ca_cert_b64,
                'verification': {}
            },
            'filesystem': 'root',
        })
    
    ignition['storage']['files'] = files;
    
    with open('bootstrap.ign', 'w') as f:
        json.dump(ignition, f)
  2. 使用 RHOSP CLI,创建使用 bootstrap Ignition 文件的镜像:

    $ openstack image create --disk-format=raw --container-format=bare --file bootstrap.ign <image_name>
  3. 获取镜像的详情:

    $ openstack image show <image_name>

    请记录 file 值 ; 它需要遵循 v2/images/<image_ID>/file 格式。

    注意

    验证您创建的镜像是否活跃。

  4. 检索镜像服务的公共地址:

    $ openstack catalog show image
  5. 将公共地址与镜像的 file 值合并,并在存储位置保存结果。位置遵循 <image_service_public_URL>/v2/images/<image_ID>/file 格式。
  6. 生成身份验证令牌并保存令牌 ID:

    $ openstack token issue -c id -f value
  7. 将以下内容插入到名为 $INFRA_ID-bootstrap-ignition.json 的文件中,并编辑位置拥有者以匹配您自己的值:

    {
      "ignition": {
        "config": {
          "append": [{
            "source": "<storage_url>", 1
            "verification": {},
            "httpHeaders": [{
              "name": "X-Auth-Token", 2
              "value": "<token_ID>" 3
            }]
          }]
        },
        "security": {
          "tls": {
            "certificateAuthorities": [{
              "source": "data:text/plain;charset=utf-8;base64,<base64_encoded_certificate>", 4
              "verification": {}
            }]
          }
        },
        "timeouts": {},
        "version": "2.4.0"
      },
      "networkd": {},
      "passwd": {},
      "storage": {},
      "systemd": {}
    }
    1
    ignition.config.append.source 值替换为 bootstrap Ignition 文件存储 URL。
    2
    httpHeaders 中将 name 设置为 "X-Auth-Token"
    3
    httpHeaders 中将 value 设为您的令牌 ID。
    4
    如果 bootstrap Ignition 文件服务器使用自签名证书,请包括以 base64 编码的证书。
  8. 保存二级 Ignition 配置文件。

bootstrap Ignition 数据将在安装过程中传递给 RHOSP。

警告

bootstrap Ignition 文件包含敏感信息,如 clouds.yaml 凭证。确定您将其保存在安全的地方,并在完成安装后将其删除。

1.3.15. 创建 control plane Ignition 配置文件

在您自己的基础架构的 Red Hat OpenStack Platform(RHOSP)上安装 OpenShift Container Platform 需要 control plane Ignition 配置文件。您必须创建多个配置文件。

注意

与 bootstrap Ignition 配置一样,您必须明确为每个 control plane 机器定义主机名。

先决条件

  • 来自安装程序元数据文件中的基础架构 ID 被设置为环境变量($INFRA_ID)。

    • 如果未设置变量,请参阅 创建 Kubernetes 清单和 Ignition 配置文件

流程

  • 在命令行中运行以下 Python 脚本:

    $ for index in $(seq 0 2); do
        MASTER_HOSTNAME="$INFRA_ID-master-$index\n"
        python -c "import base64, json, sys;
    ignition = json.load(sys.stdin);
    files = ignition['storage'].get('files', []);
    files.append({'path': '/etc/hostname', 'mode': 420, 'contents': {'source': 'data:text/plain;charset=utf-8;base64,' + base64.standard_b64encode(b'$MASTER_HOSTNAME').decode().strip(), 'verification': {}}, 'filesystem': 'root'});
    ignition['storage']['files'] = files;
    json.dump(ignition, sys.stdout)" <master.ign >"$INFRA_ID-master-$index-ignition.json"
    done

    您现在有三个 control plane Ignition 文件: <INFRA_ID>-master-0-ignition.json<INFRA_ID>-master-1-ignition.json<INFRA_ID>-master-2-ignition.json

1.3.16. 创建网络资源

在您自己的基础架构的 Red Hat OpenStack Platform(RHOSP)安装上创建 OpenShift Container Platform 所需的网络资源。为节省时间,可以运行提供的 Ansible playbook 来生成安全组、网络、子网、路由器和端口。

流程

  1. 将以下内容插入到名为 common.yaml 的本地文件中:

    例 1.1. common.yaml Ansible playbook

    - hosts: localhost
      gather_facts: no
    
      vars_files:
      - metadata.json
    
      tasks:
      - name: 'Compute resource names'
        set_fact:
          cluster_id_tag: "openshiftClusterID={{ infraID }}"
          os_network: "{{ infraID }}-network"
          os_subnet: "{{ infraID }}-nodes"
          os_router: "{{ infraID }}-external-router"
          # Port names
          os_port_api: "{{ infraID }}-api-port"
          os_port_ingress: "{{ infraID }}-ingress-port"
          os_port_bootstrap: "{{ infraID }}-bootstrap-port"
          os_port_master: "{{ infraID }}-master-port"
          os_port_worker: "{{ infraID }}-worker-port"
          # Security groups names
          os_sg_master: "{{ infraID }}-master"
          os_sg_worker: "{{ infraID }}-worker"
          # Server names
          os_bootstrap_server_name: "{{ infraID }}-bootstrap"
          os_cp_server_name: "{{ infraID }}-master"
          os_compute_server_name: "{{ infraID }}-worker"
          # Trunk names
          os_cp_trunk_name: "{{ infraID }}-master-trunk"
          os_compute_trunk_name: "{{ infraID }}-worker-trunk"
          # Subnet pool name
          subnet_pool: "{{ infraID }}-kuryr-pod-subnetpool"
          # Service network name
          os_svc_network: "{{ infraID }}-kuryr-service-network"
          # Service subnet name
          os_svc_subnet: "{{ infraID }}-kuryr-service-subnet"
          # Ignition files
          os_bootstrap_ignition: "{{ infraID }}-bootstrap-ignition.json"
  2. 将以下内容插入到名为 inventory.yaml 的本地文件中:

    例 1.2. inventory.yaml Ansible playbook

    all:
      hosts:
        localhost:
          ansible_connection: local
          ansible_python_interpreter: "{{ansible_playbook_python}}"
    
          # User-provided values
          os_subnet_range: '10.0.0.0/16'
          os_flavor_master: 'm1.xlarge'
          os_flavor_worker: 'm1.large'
          os_image_rhcos: 'rhcos'
          os_external_network: 'external'
          # OpenShift API floating IP address
          os_api_fip: '203.0.113.23'
          # OpenShift Ingress floating IP address
          os_ingress_fip: '203.0.113.19'
          # Service subnet cidr
          svc_subnet_range: '172.30.0.0/16'
          os_svc_network_range: '172.30.0.0/15'
          # Subnet pool prefixes
          cluster_network_cidrs: '10.128.0.0/14'
          # Subnet pool prefix length
          host_prefix: '23'
          # Name of the SDN.
          # Possible values are OpenshiftSDN or Kuryr.
          os_networking_type: 'OpenshiftSDN'
    
          # Number of provisioned Control Plane nodes
          # 3 is the minimum number for a fully-functional cluster.
          os_cp_nodes_number: 3
    
          # Number of provisioned Compute nodes.
          # 3 is the minimum number for a fully-functional cluster.
          os_compute_nodes_number: 3
  3. 将以下内容插入到名为 01_security-groups.yaml 的本地文件中

    例 1.3. 01_security-groups.yaml

    # Required Python packages:
    #
    # ansible
    # openstackclient
    # openstacksdk
    
    - import_playbook: common.yaml
    
    - hosts: all
      gather_facts: no
    
      tasks:
      - name: 'Create the master security group'
        os_security_group:
          name: "{{ os_sg_master }}"
    
      - name: 'Set master security group tag'
        command:
          cmd: "openstack security group set --tag {{ cluster_id_tag }} {{ os_sg_master }} "
    
      - name: 'Create the worker security group'
        os_security_group:
          name: "{{ os_sg_worker }}"
    
      - name: 'Set worker security group tag'
        command:
          cmd: "openstack security group set --tag {{ cluster_id_tag }} {{ os_sg_worker }} "
    
      - name: 'Create master-sg rule "ICMP"'
        os_security_group_rule:
          security_group: "{{ os_sg_master }}"
          protocol: icmp
    
      - name: 'Create master-sg rule "machine config server"'
        os_security_group_rule:
          security_group: "{{ os_sg_master }}"
          protocol: tcp
          remote_ip_prefix: "{{ os_subnet_range }}"
          port_range_min: 22623
          port_range_max: 22623
    
      - name: 'Create master-sg rule "SSH"'
        os_security_group_rule:
          security_group: "{{ os_sg_master }}"
          protocol: tcp
          port_range_min: 22
          port_range_max: 22
    
      - name: 'Create master-sg rule "DNS (TCP)"'
        os_security_group_rule:
          security_group: "{{ os_sg_master }}"
          remote_ip_prefix: "{{ os_subnet_range }}"
          protocol: tcp
          port_range_min: 53
          port_range_max: 53
    
      - name: 'Create master-sg rule "DNS (UDP)"'
        os_security_group_rule:
          security_group: "{{ os_sg_master }}"
          remote_ip_prefix: "{{ os_subnet_range }}"
          protocol: udp
          port_range_min: 53
          port_range_max: 53
    
      - name: 'Create master-sg rule "mDNS"'
        os_security_group_rule:
          security_group: "{{ os_sg_master }}"
          remote_ip_prefix: "{{ os_subnet_range }}"
          protocol: udp
          port_range_min: 5353
          port_range_max: 5353
    
      - name: 'Create master-sg rule "OpenShift API"'
        os_security_group_rule:
          security_group: "{{ os_sg_master }}"
          protocol: tcp
          port_range_min: 6443
          port_range_max: 6443
    
      - name: 'Create master-sg rule "VXLAN"'
        os_security_group_rule:
          security_group: "{{ os_sg_master }}"
          protocol: udp
          remote_ip_prefix: "{{ os_subnet_range }}"
          port_range_min: 4789
          port_range_max: 4789
    
      - name: 'Create master-sg rule "Geneve"'
        os_security_group_rule:
          security_group: "{{ os_sg_master }}"
          protocol: udp
          remote_ip_prefix: "{{ os_subnet_range }}"
          port_range_min: 6081
          port_range_max: 6081
    
      - name: 'Create master-sg rule "ovndb"'
        os_security_group_rule:
          security_group: "{{ os_sg_master }}"
          protocol: tcp
          remote_ip_prefix: "{{ os_subnet_range }}"
          port_range_min: 6641
          port_range_max: 6642
    
      - name: 'Create master-sg rule "master ingress internal (TCP)"'
        os_security_group_rule:
          security_group: "{{ os_sg_master }}"
          protocol: tcp
          remote_ip_prefix: "{{ os_subnet_range }}"
          port_range_min: 9000
          port_range_max: 9999
    
      - name: 'Create master-sg rule "master ingress internal (UDP)"'
        os_security_group_rule:
          security_group: "{{ os_sg_master }}"
          protocol: udp
          remote_ip_prefix: "{{ os_subnet_range }}"
          port_range_min: 9000
          port_range_max: 9999
    
      - name: 'Create master-sg rule "kube scheduler"'
        os_security_group_rule:
          security_group: "{{ os_sg_master }}"
          protocol: tcp
          remote_ip_prefix: "{{ os_subnet_range }}"
          port_range_min: 10259
          port_range_max: 10259
    
      - name: 'Create master-sg rule "kube controller manager"'
        os_security_group_rule:
          security_group: "{{ os_sg_master }}"
          protocol: tcp
          remote_ip_prefix: "{{ os_subnet_range }}"
          port_range_min: 10257
          port_range_max: 10257
    
      - name: 'Create master-sg rule "master ingress kubelet secure"'
        os_security_group_rule:
          security_group: "{{ os_sg_master }}"
          protocol: tcp
          remote_ip_prefix: "{{ os_subnet_range }}"
          port_range_min: 10250
          port_range_max: 10250
    
      - name: 'Create master-sg rule "etcd"'
        os_security_group_rule:
          security_group: "{{ os_sg_master }}"
          protocol: tcp
          remote_ip_prefix: "{{ os_subnet_range }}"
          port_range_min: 2379
          port_range_max: 2380
    
      - name: 'Create master-sg rule "master ingress services (TCP)"'
        os_security_group_rule:
          security_group: "{{ os_sg_master }}"
          protocol: tcp
          remote_ip_prefix: "{{ os_subnet_range }}"
          port_range_min: 30000
          port_range_max: 32767
    
      - name: 'Create master-sg rule "master ingress services (UDP)"'
        os_security_group_rule:
          security_group: "{{ os_sg_master }}"
          protocol: udp
          remote_ip_prefix: "{{ os_subnet_range }}"
          port_range_min: 30000
          port_range_max: 32767
    
      - name: 'Create master-sg rule "VRRP"'
        os_security_group_rule:
          security_group: "{{ os_sg_master }}"
          protocol: '112'
          remote_ip_prefix: "{{ os_subnet_range }}"
    
    
      - name: 'Create worker-sg rule "ICMP"'
        os_security_group_rule:
          security_group: "{{ os_sg_worker }}"
          protocol: icmp
    
      - name: 'Create worker-sg rule "SSH"'
        os_security_group_rule:
          security_group: "{{ os_sg_worker }}"
          protocol: tcp
          port_range_min: 22
          port_range_max: 22
    
      - name: 'Create worker-sg rule "mDNS"'
        os_security_group_rule:
          security_group: "{{ os_sg_worker }}"
          protocol: udp
          remote_ip_prefix: "{{ os_subnet_range }}"
          port_range_min: 5353
          port_range_max: 5353
    
      - name: 'Create worker-sg rule "Ingress HTTP"'
        os_security_group_rule:
          security_group: "{{ os_sg_worker }}"
          protocol: tcp
          port_range_min: 80
          port_range_max: 80
    
      - name: 'Create worker-sg rule "Ingress HTTPS"'
        os_security_group_rule:
          security_group: "{{ os_sg_worker }}"
          protocol: tcp
          port_range_min: 443
          port_range_max: 443
    
      - name: 'Create worker-sg rule "router"'
        os_security_group_rule:
          security_group: "{{ os_sg_worker }}"
          protocol: tcp
          remote_ip_prefix: "{{ os_subnet_range }}"
          port_range_min: 1936
          port_range_max: 1936
    
      - name: 'Create worker-sg rule "VXLAN"'
        os_security_group_rule:
          security_group: "{{ os_sg_worker }}"
          protocol: udp
          remote_ip_prefix: "{{ os_subnet_range }}"
          port_range_min: 4789
          port_range_max: 4789
    
      - name: 'Create worker-sg rule "Geneve"'
        os_security_group_rule:
          security_group: "{{ os_sg_worker }}"
          protocol: udp
          remote_ip_prefix: "{{ os_subnet_range }}"
          port_range_min: 6081
          port_range_max: 6081
    
      - name: 'Create worker-sg rule "worker ingress internal (TCP)"'
        os_security_group_rule:
          security_group: "{{ os_sg_worker }}"
          protocol: tcp
          remote_ip_prefix: "{{ os_subnet_range }}"
          port_range_min: 9000
          port_range_max: 9999
    
      - name: 'Create worker-sg rule "worker ingress internal (UDP)"'
        os_security_group_rule:
          security_group: "{{ os_sg_worker }}"
          protocol: udp
          remote_ip_prefix: "{{ os_subnet_range }}"
          port_range_min: 9000
          port_range_max: 9999
    
      - name: 'Create worker-sg rule "worker ingress kubelet insecure"'
        os_security_group_rule:
          security_group: "{{ os_sg_worker }}"
          protocol: tcp
          remote_ip_prefix: "{{ os_subnet_range }}"
          port_range_min: 10250
          port_range_max: 10250
    
      - name: 'Create worker-sg rule "worker ingress services (TCP)"'
        os_security_group_rule:
          security_group: "{{ os_sg_worker }}"
          protocol: tcp
          remote_ip_prefix: "{{ os_subnet_range }}"
          port_range_min: 30000
          port_range_max: 32767
    
      - name: 'Create worker-sg rule "worker ingress services (UDP)"'
        os_security_group_rule:
          security_group: "{{ os_sg_worker }}"
          protocol: udp
          remote_ip_prefix: "{{ os_subnet_range }}"
          port_range_min: 30000
          port_range_max: 32767
    
      - name: 'Create worker-sg rule "VRRP"'
        os_security_group_rule:
          security_group: "{{ os_sg_worker }}"
          protocol: '112'
          remote_ip_prefix: "{{ os_subnet_range }}"
  4. 将以下内容插入到名为 02_network.yaml 的本地文件中:

    例 1.4. 02_network.yaml

    # Required Python packages:
    #
    # ansible
    # openstackclient
    # openstacksdk
    # netaddr
    
    - import_playbook: common.yaml
    
    - hosts: all
      gather_facts: no
    
      tasks:
      - name: 'Create the cluster network'
        os_network:
          name: "{{ os_network }}"
    
      - name: 'Set the cluster network tag'
        command:
          cmd: "openstack network set --tag {{ cluster_id_tag }} {{ os_network }}"
    
      - name: 'Create a subnet'
        os_subnet:
          name: "{{ os_subnet }}"
          network_name: "{{ os_network }}"
          cidr: "{{ os_subnet_range }}"
          allocation_pool_start: "{{ os_subnet_range | next_nth_usable(10) }}"
          allocation_pool_end: "{{ os_subnet_range | ipaddr('last_usable') }}"
    
      - name: 'Set the cluster subnet tag'
        command:
          cmd: "openstack subnet set --tag {{ cluster_id_tag }} {{ os_subnet }}"
    
      - name: 'Create the service network'
        os_network:
          name: "{{ os_svc_network }}"
        when: os_networking_type == "Kuryr"
    
      - name: 'Set the service network tag'
        command:
          cmd: "openstack network set --tag {{ cluster_id_tag }} {{ os_svc_network }}"
        when: os_networking_type == "Kuryr"
    
      - name: 'Computing facts for service subnet'
        set_fact:
          first_ip_svc_subnet_range: "{{ svc_subnet_range | ipv4('network') }}"
          last_ip_svc_subnet_range: "{{ svc_subnet_range | ipaddr('last_usable') |ipmath(1) }}"
          first_ip_os_svc_network_range: "{{ os_svc_network_range | ipv4('network') }}"
          last_ip_os_svc_network_range: "{{ os_svc_network_range | ipaddr('last_usable') |ipmath(1) }}"
          allocation_pool: ""
        when: os_networking_type == "Kuryr"
    
      - name: 'Get first part of OpenStack network'
        set_fact:
          allocation_pool: "{{ allocation_pool + '--allocation-pool start={{ first_ip_os_svc_network_range | ipmath(1) }},end={{ first_ip_svc_subnet_range |ipmath(-1) }}' }}"
        when:
        - os_networking_type == "Kuryr"
        - first_ip_svc_subnet_range != first_ip_os_svc_network_range
    
      - name: 'Get last part of OpenStack network'
        set_fact:
          allocation_pool: "{{ allocation_pool + ' --allocation-pool start={{ last_ip_svc_subnet_range | ipmath(1) }},end={{ last_ip_os_svc_network_range |ipmath(-1) }}' }}"
        when:
        - os_networking_type == "Kuryr"
        - last_ip_svc_subnet_range != last_ip_os_svc_network_range
    
      - name: 'Get end of allocation'
        set_fact:
          gateway_ip: "{{ allocation_pool.split('=')[-1] }}"
        when: os_networking_type == "Kuryr"
    
      - name: 'replace last IP'
        set_fact:
          allocation_pool: "{{ allocation_pool | replace(gateway_ip, gateway_ip | ipmath(-1))}}"
        when: os_networking_type == "Kuryr"
    
      - name: 'list service subnet'
        command:
          cmd: "openstack subnet list --name {{ os_svc_subnet }} --tag {{ cluster_id_tag }}"
        when: os_networking_type == "Kuryr"
        register: svc_subnet
    
      - name: 'Create the service subnet'
        command:
          cmd: "openstack subnet create --ip-version 4 --gateway {{ gateway_ip }} --subnet-range {{ os_svc_network_range }} {{ allocation_pool }} --no-dhcp --network {{ os_svc_network }} --tag {{ cluster_id_tag }} {{ os_svc_subnet }}"
        when:
        - os_networking_type == "Kuryr"
        - svc_subnet.stdout == ""
    
      - name: 'list subnet pool'
        command:
          cmd: "openstack subnet pool list --name {{ subnet_pool }} --tags {{ cluster_id_tag }}"
        when: os_networking_type == "Kuryr"
        register: pods_subnet_pool
    
      - name: 'Create pods subnet pool'
        command:
          cmd: "openstack subnet pool create --default-prefix-length {{ host_prefix }} --pool-prefix {{ cluster_network_cidrs }} --tag {{ cluster_id_tag }} {{ subnet_pool }}"
        when:
        - os_networking_type == "Kuryr"
        - pods_subnet_pool.stdout == ""
    
      - name: 'Create external router'
        os_router:
          name: "{{ os_router }}"
          network: "{{ os_external_network }}"
          interfaces:
          - "{{ os_subnet }}"
    
      - name: 'Set external router tag'
        command:
          cmd: "openstack router set --tag {{ cluster_id_tag }} {{ os_router }}"
        when: os_networking_type == "Kuryr"
    
      - name: 'Create the API port'
        os_port:
          name: "{{ os_port_api }}"
          network: "{{ os_network }}"
          security_groups:
          - "{{ os_sg_master }}"
          fixed_ips:
          - subnet: "{{ os_subnet }}"
            ip_address: "{{ os_subnet_range | next_nth_usable(5) }}"
    
      - name: 'Set API port tag'
        command:
          cmd: "openstack port set --tag {{ cluster_id_tag }} {{ os_port_api }}"
    
      - name: 'Create the Ingress port'
        os_port:
          name: "{{ os_port_ingress }}"
          network: "{{ os_network }}"
          security_groups:
          - "{{ os_sg_worker }}"
          fixed_ips:
          - subnet: "{{ os_subnet }}"
            ip_address: "{{ os_subnet_range | next_nth_usable(7) }}"
    
      - name: 'Set the Ingress port tag'
        command:
          cmd: "openstack port set --tag {{ cluster_id_tag }} {{ os_port_ingress }}"
    
      # NOTE: openstack ansible module doesn't allow attaching Floating IPs to
      # ports, let's use the CLI instead
      - name: 'Attach the API floating IP to API port'
        command:
          cmd: "openstack floating ip set --port {{ os_port_api }} {{ os_api_fip }}"
    
      # NOTE: openstack ansible module doesn't allow attaching Floating IPs to
      # ports, let's use the CLI instead
      - name: 'Attach the Ingress floating IP to Ingress port'
        command:
          cmd: "openstack floating ip set --port {{ os_port_ingress }} {{ os_ingress_fip }}"
  5. 在命令行中,通过运行第一个数字的 playbook 来创建安全组:

    $ ansible-playbook -i inventory.yaml 01_security-groups.yaml
  6. 在命令行上,通过运行第二个数字的 playbook 来创建一个网络、子网和路由器:

    $ ansible-playbook -i inventory.yaml 02_network.yaml
  7. 可选:如果要控制 Nova 服务器使用的默认解析程序,请运行 RHOSP CLI 命令:

    $ openstack subnet set --dns-nameserver <server_1> --dns-nameserver <server_2> "$INFRA_ID-nodes"

1.3.17. 创建 bootstrap 机器

创建 bootstrap 机器,为其提供在 Red Hat OpenStack Platform(RHOSP)上运行所需的网络访问权限。红帽提供了一个 Ansible playbook,您可运行它来简化此过程。

先决条件

  • 在一个通用目录中的 inventory.yamlcommon.yaml Ansible playbook

    • 如果您需要这些文件,请从创建网络资源中复制它们。
  • 安装程序创建的 metadata.yaml 文件与 Ansible playbook 位于同一个目录中

流程

  1. 在命令行中,将工作目录改为 inventory.yamlcommon.yaml 文件的位置。
  2. 将以下内容插入到名为 03_bootstrap.yaml 的本地文件中:

    例 1.5. 03_bootstrap.yaml

    # Required Python packages:
    #
    # ansible
    # openstackclient
    # openstacksdk
    # netaddr
    
    - import_playbook: common.yaml
    
    - hosts: all
      gather_facts: no
    
      tasks:
      - name: 'Create the bootstrap server port'
        os_port:
          name: "{{ os_port_bootstrap }}"
          network: "{{ os_network }}"
          security_groups:
          - "{{ os_sg_master }}"
          allowed_address_pairs:
          - ip_address: "{{ os_subnet_range | next_nth_usable(5) }}"
          - ip_address: "{{ os_subnet_range | next_nth_usable(6) }}"
    
      - name: 'Set bootstrap port tag'
        command:
          cmd: "openstack port set --tag {{ cluster_id_tag }} {{ os_port_bootstrap }}"
    
      - name: 'Create the bootstrap server'
        os_server:
          name: "{{ os_bootstrap_server_name }}"
          image: "{{ os_image_rhcos }}"
          flavor: "{{ os_flavor_master }}"
          userdata: "{{ lookup('file', os_bootstrap_ignition) | string }}"
          auto_ip: no
          nics:
          - port-name: "{{ os_port_bootstrap }}"
    
      - name: 'Create the bootstrap floating IP'
        os_floating_ip:
          state: present
          network: "{{ os_external_network }}"
          server: "{{ os_bootstrap_server_name }}"
  3. 在命令行中运行 playbook:

    $ ansible-playbook -i inventory.yaml 03_bootstrap.yaml
  4. bootstrap 服务器可用后,查看日志以验证是否收到 Ignition 文件:

    $ openstack console log show "$INFRA_ID-bootstrap"

1.3.18. 创建 control plane 机器

使用您生成的 Ignition 配置文件创建三台 control plane 机器。

先决条件

  • 来自安装程序元数据文件中的基础架构 ID 被设置为环境变量($INFRA_ID)。
  • 在一个通用目录中的 inventory.yamlcommon.yaml Ansible playbook

    • 如果您需要这些文件,请从创建网络资源中复制它们。
  • 创建 control plane Ignition 配置文件中创建的三个 Ignition 文件

流程

  1. 在命令行中,将工作目录改为 inventory.yamlcommon.yaml 文件的位置。
  2. 如果 control plane Ignition 配置文件尚未位于工作目录中,将其复制到其中。
  3. 将以下内容插入到名为 04_control-plane.yaml 的本地文件中:

    例 1.6. 04_control-plane.yaml

    # Required Python packages:
    #
    # ansible
    # openstackclient
    # openstacksdk
    # netaddr
    
    - import_playbook: common.yaml
    
    - hosts: all
      gather_facts: no
    
      tasks:
      - name: 'Create the Control Plane ports'
        os_port:
          name: "{{ item.1 }}-{{ item.0 }}"
          network: "{{ os_network }}"
          security_groups:
          - "{{ os_sg_master }}"
          allowed_address_pairs:
          - ip_address: "{{ os_subnet_range | next_nth_usable(5) }}"
          - ip_address: "{{ os_subnet_range | next_nth_usable(6) }}"
          - ip_address: "{{ os_subnet_range | next_nth_usable(7) }}"
        with_indexed_items: "{{ [os_port_master] * os_cp_nodes_number }}"
        register: ports
    
      - name: 'Set Control Plane ports tag'
        command:
          cmd: "openstack port set --tag {{ cluster_id_tag }} {{ item.1 }}-{{ item.0 }}"
        with_indexed_items: "{{ [os_port_master] * os_cp_nodes_number }}"
    
      - name: 'List the Control Plane Trunks'
        command:
          cmd: "openstack network trunk list"
        when: os_networking_type == "Kuryr"
        register: control_plane_trunks
    
      - name: 'Create the Control Plane trunks'
        command:
          cmd: "openstack network trunk create --parent-port {{ item.1.id }} {{ os_cp_trunk_name }}-{{ item.0 }}"
        with_indexed_items: "{{ ports.results }}"
        when:
        - os_networking_type == "Kuryr"
        - "os_cp_trunk_name|string not in control_plane_trunks.stdout"
    
      - name: 'Create the Control Plane servers'
        os_server:
          name: "{{ item.1 }}-{{ item.0 }}"
          image: "{{ os_image_rhcos }}"
          flavor: "{{ os_flavor_master }}"
          auto_ip: no
          # The ignition filename will be concatenated with the Control Plane node
          # name and its 0-indexed serial number.
          # In this case, the first node will look for this filename:
          #    "{{ infraID }}-master-0-ignition.json"
          userdata: "{{ lookup('file', [item.1, item.0, 'ignition.json'] | join('-')) | string }}"
          nics:
          - port-name: "{{ os_port_master }}-{{ item.0 }}"
        with_indexed_items: "{{ [os_cp_server_name] * os_cp_nodes_number }}"
  4. 在命令行中运行 playbook:

    $ ansible-playbook -i inventory.yaml 04_control-plane.yaml
  5. 运行以下命令来监控 bootstrap 过程:

    $ openshift-install wait-for bootstrap-complete

    您会看到确认 control plane 机器正在运行并加入集群的消息:

    INFO API v1.14.6+f9b5405 up
    INFO Waiting up to 30m0s for bootstrapping to complete...
    ...
    INFO It is now safe to remove the bootstrap resources

1.3.19. 登录集群

您可以通过导出集群 kubeconfig 文件,以默认系统用户身份登录集群。kubeconfig 文件包含关于集群的信息,供 CLI 用于将客户端连接到正确集群和 API 服务器。该文件特只适用于一个特定的集群,在 OpenShift Container Platform 安装过程中创建。

先决条件

  • 部署一个 OpenShift Container Platform 集群。
  • 安装 oc CLI。

流程

  1. 导出 kubeadmin 凭证:

    $ export KUBECONFIG=<installation_directory>/auth/kubeconfig 1
    1
    对于 <installation_directory>,请指定安装文件保存到的目录的路径。
  2. 使用导出的配置,验证能否成功运行 oc 命令:

    $ oc whoami
    system:admin

1.3.20. 删除 bootstrap 资源:

删除您不再需要的 bootstrap 资源。

先决条件

  • 在一个通用目录中的 inventory.yamlcommon.yaml Ansible playbook

    • 如果您需要这些文件,请从创建网络资源中复制它们。
  • control plane 机器正在运行

    • 如果您不知道机器的状态,请参阅 验证集群状态

流程

  1. 将以下内容插入到名为 down-03_bootstrap.yaml 的本地文件中:

    例 1.7. down-03_bootstrap.yaml

    # Required Python packages:
    #
    # ansible
    # openstacksdk
    
    - import_playbook: common.yaml
    
    - hosts: all
      gather_facts: no
    
      tasks:
      - name: 'Remove the bootstrap server'
        os_server:
          name: "{{ os_bootstrap_server_name }}"
          state: absent
          delete_fip: yes
    
      - name: 'Remove the bootstrap server port'
        os_port:
          name: "{{ os_port_bootstrap }}"
          state: absent
  2. 在命令行中运行 playbook:

    $ ansible-playbook -i inventory.yaml down-03_bootstrap.yaml

bootstrap 端口、服务器和浮动 IP 地址会被删除。

警告

如果您之前没有禁用 bootstrap Ignition 文件 URL,现在需要禁用。

1.3.21. 创建计算机器

启动 control plane 后,创建计算机器。

先决条件

  • 在一个通用目录中的 inventory.yamlcommon.yaml Ansible playbook

    • 如果您需要这些文件,请从创建网络资源中复制它们。
  • 安装程序创建的 metadata.yaml 文件与 Ansible playbook 位于同一个目录中
  • control plane 处于活跃状态

流程

  1. 在命令行中,将工作目录改为 inventory.yamlcommon.yaml 文件的位置。
  2. 将以下内容插入到名为 05_compute-nodes.yaml 的本地文件中:

    例 1.8. 05_compute-nodes.yaml

    # Required Python packages:
    #
    # ansible
    # openstackclient
    # openstacksdk
    # netaddr
    
    - import_playbook: common.yaml
    
    - hosts: all
      gather_facts: no
    
      tasks:
      - name: 'Create the Compute ports'
        os_port:
          name: "{{ item.1 }}-{{ item.0 }}"
          network: "{{ os_network }}"
          security_groups:
          - "{{ os_sg_worker }}"
          allowed_address_pairs:
          - ip_address: "{{ os_subnet_range | next_nth_usable(7) }}"
        with_indexed_items: "{{ [os_port_worker] * os_compute_nodes_number }}"
        register: ports
    
      - name: 'Set Compute ports tag'
        command:
          cmd: "openstack port set --tag {{ [cluster_id_tag] }} {{ item.1 }}-{{ item.0 }}"
        with_indexed_items: "{{ [os_port_worker] * os_compute_nodes_number }}"
    
      - name: 'List the Compute Trunks'
        command:
          cmd: "openstack network trunk list"
        when: os_networking_type == "Kuryr"
        register: compute_trunks
    
      - name: 'Create the Compute trunks'
        command:
          cmd: "openstack network trunk create --parent-port {{ item.1.id }} {{ os_compute_trunk_name }}-{{ item.0 }}"
        with_indexed_items: "{{ ports.results }}"
        when:
        - os_networking_type == "Kuryr"
        - "os_compute_trunk_name|string not in compute_trunks.stdout"
    
      - name: 'Create the Compute servers'
        os_server:
          name: "{{ item.1 }}-{{ item.0 }}"
          image: "{{ os_image_rhcos }}"
          flavor: "{{ os_flavor_worker }}"
          auto_ip: no
          userdata: "{{ lookup('file', 'worker.ign') | string }}"
          nics:
          - port-name: "{{ os_port_worker }}-{{ item.0 }}"
        with_indexed_items: "{{ [os_compute_server_name] * os_compute_nodes_number }}"
  3. 在命令行中运行 playbook:

    $ ansible-playbook -i inventory.yaml 05_compute-nodes.yaml

后续步骤

  • 批准机器的证书签名请求

1.3.22. 批准机器的证书签名请求

将机器添加到集群时,会为您添加的每台机器生成两个待处理证书签名请求(CSR)。您必须确认这些 CSR 已获得批准,或根据需要自行批准。客户端请求必须首先被批准,然后是服务器请求。

先决条件

  • 您已将机器添加到集群中。

流程

  1. 确认集群可以识别这些机器:

    # oc get nodes
    
    NAME                    STATUS   ROLES    AGE   VERSION
    master-01.example.com   Ready    master   40d   v1.17.1
    master-02.example.com   Ready    master   40d   v1.17.1
    master-03.example.com   Ready    master   40d   v1.17.1
    worker-01.example.com   Ready    worker   40d   v1.17.1
    worker-02.example.com   Ready    worker   40d   v1.17.1

    输出将列出您创建的所有机器。

  2. 检查待处理的 CSR,并确保可以看到添加到集群中的每台机器都有 PendingApproved 状态的客户端请求:

    $ oc get csr
    
    NAME        AGE     REQUESTOR                                                                   CONDITION
    csr-8b2br   15m     system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   Pending
    csr-8vnps   15m     system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   Pending
    ...

    在本例中,两台机器加入了集群。您可能会在列表中看到更多已批准的 CSR。

  3. 如果 CSR 没有获得批准,请在所添加机器的所有待处理 CSR 都处于 Pending 状态后,为您的集群机器批准这些 CSR:

    注意

    由于 CSR 会自动轮转,因此请在将机器添加到集群后一小时内批准您的 CSR。如果没有在一小时内批准,证书将会轮转,每个节点将会存在多个证书。您必须批准所有这些证书。批准初始 CSR 后,集群的 kube-controller-manager 会自动批准后续的节点客户端 CSR。您必须实施一个方法来自动批准 kubelet 提供的证书请求。

    • 若要单独批准,请对每个有效的 CSR 运行以下命令:

      $ oc adm certificate approve <csr_name> 1
      1
      <csr_name> 是当前 CSR 列表中 CSR 的名称。
    • 要批准所有待处理的 CSR,请运行以下命令:

      $ oc get csr -o go-template='{{range .items}}{{if not .status}}{{.metadata.name}}{{"\n"}}{{end}}{{end}}' | xargs oc adm certificate approve
  4. 现在,您的客户端请求已被批准,您必须查看添加到集群中的每台机器的服务器请求:

    $ oc get csr

    输出示例

    NAME        AGE     REQUESTOR                                                                   CONDITION
    csr-bfd72   5m26s   system:node:ip-10-0-50-126.us-east-2.compute.internal                       Pending
    csr-c57lv   5m26s   system:node:ip-10-0-95-157.us-east-2.compute.internal                       Pending
    ...

  5. 如果剩余的 CSR 没有被批准,且处于 Pending 状态,请批准集群机器的 CSR:

    • 若要单独批准,请对每个有效的 CSR 运行以下命令:

      $ oc adm certificate approve <csr_name> 1
      1
      <csr_name> 是当前 CSR 列表中 CSR 的名称。
    • 要批准所有待处理的 CSR,请运行以下命令:

      $ oc get csr -o go-template='{{range .items}}{{if not .status}}{{.metadata.name}}{{"\n"}}{{end}}{{end}}' | xargs oc adm certificate approve
  6. 批准所有客户端和服务器 CSR 后,器将处于 Ready 状态。运行以下命令验证:

    $ oc get nodes

    输出示例

    NAME      STATUS    ROLES   AGE  VERSION
    master-0  Ready     master  73m  v1.20.0
    master-1  Ready     master  73m  v1.20.0
    master-2  Ready     master  74m  v1.20.0
    worker-0  Ready     worker  11m  v1.20.0
    worker-1  Ready     worker  11m  v1.20.0

    注意

    批准服务器 CSR 后可能需要几分钟时间让机器转换为 Ready 状态。

其他信息

1.3.23. 验证安装是否成功

验证 OpenShift Container Platform 安装已完成。

先决条件

  • 有安装程序(openshift-install

流程

  • 在命令行中运行:

    $ openshift-install --log-level debug wait-for install-complete

程序输出控制台 URL 以及管理员的登录信息。

1.3.24. 使用浮动 IP 地址配置应用程序访问

安装 OpenShift Container Platform 后,请配置 Red Hat OpenStack Platform (RHOSP) 以允许应用程序网络流量。

先决条件

  • 必须已安装 OpenShift Container Platform 集群
  • 已启用浮动 IP 地址,如启用对环境的访问中所述。

流程

在安装 OpenShift Container Platform 集群后,将浮动 IP 地址附加到入口端口:

  1. 显示端口:

    $ openstack port show <cluster name>-<clusterID>-ingress-port
  2. 将端口附加到 IP 地址:

    $ openstack floating ip set --port <ingress port ID> <apps FIP>
  3. 在您的 DNS 文件中,为 *apps. 添加一条通配符 A 记录。

    *.apps.<cluster name>.<base domain>  IN  A  <apps FIP>
注意

如果您不控制 DNS 服务器,但希望为非生产用途启用应用程序访问,您可以将这些主机名添加到 /etc/hosts

<apps FIP> console-openshift-console.apps.<cluster name>.<base domain>
<apps FIP> integrated-oauth-server-openshift-authentication.apps.<cluster name>.<base domain>
<apps FIP> oauth-openshift.apps.<cluster name>.<base domain>
<apps FIP> prometheus-k8s-openshift-monitoring.apps.<cluster name>.<base domain>
<apps FIP> grafana-openshift-monitoring.apps.<cluster name>.<base domain>
<apps FIP> <app name>.apps.<cluster name>.<base domain>

1.3.25. 后续步骤

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.