OpenShift Container Platform 的辅助安装程序(Assisted Installer)

Assisted Installer for OpenShift Container Platform 2022

辅助安装程序用户指南

Red Hat Customer Content Services

摘要

有关辅助安装程序的信息及其用法

第 1 章 使用辅助安装程序(Assisted Installer)安装内部集群

您可以使用辅助安装程序在内部硬件或内部虚拟机中安装 OpenShift Container Platform。使用 Assisted Installer 安装 OpenShift Container Platform 所支持的 CPU 架构包括 x86_64ppc64les390xarm64

注意

对于在 IBM zSystems (s390x) 上安装 OpenShift Container Platform,目前只支持使用 RHEL KVM 的系统。

1.1. 使用辅助安装程序

OpenShift Container Platform Assisted Installer(辅助安装程序)Red Hat Hybrid Cloud Console 上提供的用户友好的安装解决方案。Assisted Installer 支持不同的部署平台,特别专注于裸机和 vSphere 基础架构。

辅助安装程序使用服务的形式提供安装功能。此软件即服务 (SaaS) 方法具有以下优点:

  • Web 用户界面:在无需手动创建安装配置文件的情况下,web 用户界面会执行集群安装。
  • 无需 bootstrap 节点:使用 Assisted Installer 安装时不需要 bootstrap 节点。bootstrap 过程在集群的节点中执行。
  • 主机:辅助安装程序主机:

    • Ignition 文件
    • 安装配置
    • 发现 ISO
    • 安装程序
  • 简化的安装流程:不需要深入了解 OpenShift Container Platform 就可以进行部署。Assisted Installer 提供了合理的默认值,并将安装程序作为服务提供,它:

    • 消除在本地安装和运行 OpenShift Container Platform 安装程序的需要。
    • 确保安装程序的最新版本,到最新的已测试的 z-stream 版本。旧版本保持可用(如果需要)。
    • 启用使用 API 构建自动化,而无需在本地运行 OpenShift Container Platform 安装程序。
  • 高级网络: 辅助安装程序支持使用 SDN 和 OVN 的 IPv4 网络,以及只使用 OVN 的 IPv6 和双堆栈网络,基于 NMState 的静态 IP 寻址和 HTTP/S 代理。OVN 是 OpenShift Container Platform 4.12 及更新版本的默认 Container Network Interface (CNI),但您仍然可以切换到使用 SDN。
  • 预安装验证: 辅助安装程序在安装前验证配置以确保高度成功。验证包括:

    • 确保网络连接
    • 确保足够的网络带宽
    • 确保与 registry 的连接
    • 确保任何上游 DNS 都可以解析所需的域名
    • 确保集群节点之间的时间同步
    • 验证集群节点满足最低硬件要求
    • 验证安装配置参数
  • REST API: 辅助安装程序具有 REST API,支持自动化。

Assisted Installer 支持在连接的环境中安装 OpenShift Container Platform,包括使用可选的 HTTP/S 代理。它可安装以下内容:

  • 高度可用的 OpenShift Container Platform 或单节点 OpenShift (SNO)
  • 在带有完整平台基础的裸机或 vSphere 上,或没有集成的其他虚拟平台上的 OpenShift Container Platform
  • OpenShift Virtualization 和 OpenShift Data Foundation(以前称为 OpenShift Container Storage)

用户界面提供了一个直观的交互式工作流,其中自动化不存在或不需要。用户也可以使用 REST API 自动执行安装。

请参阅使用 Assisted Installer 安装 OpenShift,以使用辅助安装程序创建 OpenShift Container Platform 集群。

1.2. 对引导安装程序的 API 支持

在宣布弃用后,Assisted Installer 支持的 API 最少会保持三个月的稳定。

第 2 章 准备使用辅助安装程序安装

在安装集群前,您必须确保集群节点和网络满足要求。

2.1. 先决条件

  • 您可以参阅有关 OpenShift Container Platform 安装和更新流程的详细信息。
  • 您可以阅读有关选择集群安装方法的文档,并为用户准备相关的环境。
  • 如果使用防火墙,需要进行相关的配置,以便 Assisted Installer 可以访问它所需要的资源。

2.2. 支持的安装程序先决条件

Assisted Installer 验证以下先决条件以确保成功安装。

2.2.1. CPU 架构

在以下 CPU 构架中支持 Assisted 安装程序:

  • x86_64
  • arm64
  • ppc64le
  • s390x

2.2.2. 硬件

Assisted Installer 需要一个至少 8 个 CPU 内核、16.00 GiB RAM 和 100 GB 磁盘大小的主机。

对于 control plane,主机必须至少具有以下资源:

  • 4 个 CPU 内核
  • 16.00 GiB RAM
  • 100 GB 存储
  • 对于 etcd wal_fsync_duration_seconds,10ms 写速度或更小

对于 worker,每个主机必须至少具有以下资源:

  • 2 个 CPU 内核
  • 8.00 GiB RAM
  • 100 GB 存储

对于类型为 vMware 的主机,将 clusterSet disk.enableUUID 设置为 true,即使平台不是 vSphere。

2.2.3. Networking

网络必须满足以下要求:

  • DHCP 服务器,除非使用静态 IP 地址。
  • 基本域名。您必须确保满足以下要求:

    • 没有通配符,如 *.<cluster_name>.<base_domain>,否则安装将无法进行。
    • api.<cluster_name>.<base_domain> 的 DNS A/AAAA 记录。
    • *.apps.<cluster_name>.<base_domain> 的带有 DNS A/AAAA 记录。
  • 如果您打算通过 oc CLI 工具访问集群,则对 API URL 打开端口 6443
  • 如果您打算允许防火墙外的用户访问控制台,则控制台打开端口 443
  • 在使用 User Managed Networking 时,集群中每个节点都需要一个 DNS A/AAAA 记录,否则安装将无法进行。在安装完成后,使用 Cluster Managed Networking 需要集群中每个节点都有 DNS A/AAAA 记录,以便可以连接到集群,但安装本身在使用 Cluster Managed Networking 时可以在没有 A/AAAA 记录的情况下进行。
  • 在使用静态 IP 地址时,如需要使用预设置的主机名进行引导,则集群中每个节点都需要一个 DNS PTR 记录。否则,当使用静态 IP 地址时,辅助安装程序提供的自动重命名功能会将把节点重命名为其网络接口 MAC 地址。
重要

顶级域注册器中的 DNS A/AAAA 记录设置可能需要大量时间更新。在安装前确保 A/AAAA 记录 DNS 设置可以正常工作,以防止安装延迟。

OpenShift Container Platform 集群的网络还必须满足以下要求:

  • 所有集群节点之间的连接
  • 每个节点到互联网的连接
  • 访问 NTP 服务器,以便在集群节点之间进行时间同步

2.2.4. preflight 验证

Assisted Installer 确保集群在安装过程中满足先决条件,因为它消除了复杂的安装后故障排除,从而节省大量时间和工作时间。在节点上安装软件前,辅助安装程序执行以下验证:

  • 确保网络连接
  • 确保有足够的网络带宽
  • 确保连接到 registry
  • 确保任何上游 DNS 都可以解析所需的域名
  • 确保集群节点之间的时间同步
  • 验证集群节点是否满足最低硬件要求
  • 验证安装配置参数

如果 Assisted Installer 没有成功验证忘记要求,安装将无法进行。

第 3 章 使用 Assisted Installer UI 安装

确保满足集群节点和网络要求后,您可以开始安装集群。

3.1. 预安装注意事项

在使用 Assisted Installer 安装 OpenShift Container Platform 前,您必须考虑以下配置选择:

  • 要使用的基本域
  • 要安装的 OpenShift Container Platform 产品版本
  • 是否要安装完整集群还是单节点 OpenShift
  • 是否使用 DHCP 服务器或静态网络配置
  • 是否使用 IPv4 还是双栈网络
  • 是否要安装 OpenShift Virtualization
  • 是否要安装 Red Hat OpenShift Data Foundation
  • 是否要安装多集群引擎
  • 在 vSphere 或 Nutanix 上安装时是否与平台集成
重要

如果计划安装任何 Operator,请参阅可选:安装 Operator 中的相关硬件和存储要求部分。

3.2. 设置集群详情

要使用 Assisted Installer Web 用户界面创建集群,请使用以下步骤。

流程

  1. 登录到 Red Hat Hybrid Cloud 控制台
  2. Red Hat OpenShift 标题中,点 Scale your application
  3. 在菜单中,单击 Clusters
  4. Create cluster
  5. Datacenter 选项卡。
  6. Assisted Installer 下,点 Create cluster
  7. Cluster name 字段中输入集群名称。
  8. Base domain 字段中输入集群的基域。集群的所有子域将使用此基域。

    注意

    基域必须是有效的 DNS 名称。不得为基域设置通配符域。

  9. 选择要安装的 OpenShift Container Platform 版本。

    注意

    对于 IBM Power 和 IBM zSystems 平台,只支持 OpenShift Container Platform 版本 4.13 及更新的版本。

  10. 可选: 如果您要在单一节点上安装 OpenShift Container Platform,请选择 Install single node Openshift (SNO)

    注意

    目前,IBM zSystems 和 IBM Power 平台还不支持 SNO。

  11. 可选: Assisted Installer 已关联有与您的帐户关联的 pull secret。如果要使用不同的 pull secret,请选择 Edit pull secret
  12. 可选: 辅助安装程序默认使用 x86_64 CPU 架构。如果要在不同的架构上安装 OpenShift Container Platform,请选择要使用的架构。有效值为 arm64, ppc64le, 和 s390x。请记住,一些功能不适用于 arm64, ppc64le, 和 s390x CPU 架构。
  13. 可选: 辅助安装程序默认为 DHCP 网络。如果集群节点需要使用静态 IP 配置、网桥或绑定,而不是使用 DHCP,请选择 Static IP、bridge 和 bond
  14. 可选:如果要启用安装磁盘的加密,对单节点 OpenShift,在Enable encryption of installation disks 中选择 Control plane node, worker。对于多节点集群,您可以选择 Control plane 节点 来加密 control plane 节点安装磁盘,选择 Workers 来加密 worker 节点安装磁盘。
重要

您不能在安装后更改基域、SNO 复选框、CPU 架构、主机的网络配置或磁盘加密。

3.3. 可选:配置静态网络

Assisted Installer 支持带有 SDN 和 OVN 的 IPv4 网络,并支持使用 OVN 的 IPv6 和双栈网络。Assisted Installer 支持使用 IP 地址/MAC 地址映射使用静态网络接口配置网络。Assisted Installer 还支持使用 NMState 库配置主机网络接口,即主机的声明网络管理器 API。您可以使用 NMState 部署带有静态 IP 寻址、绑定、VLAN 和其他高级网络功能的主机。首先,您必须设置网络范围内的配置。然后,您必须为每个主机创建特定于主机的配置。

注意

对于使用 z/VM 的 IBM Z 上安装,请确保为静态网络和 NMState 正确配置 z/VM 节点和 vSwitches。另外,z/VM 节点必须分配有固定的 MAC 地址作为池 MAC 地址,可能会导致 NMState 出现问题。

流程

  1. 选择互联网协议版本。有效选项为 IPv4Dual stack
  2. 如果集群主机位于共享 VLAN 上,请输入 VLAN ID。
  3. 输入网络范围内的 IP 地址。如果选择了 Dual stack 网络,则必须同时输入 IPv4 和 IPv6 地址。

    1. 以 CIDR 标记形式输入集群网络的 IP 地址范围。
    2. 输入默认网关 IP 地址。
    3. 输入 DNS 服务器 IP 地址。
  4. 输入特定于主机的配置。

    1. 如果您只设置使用单一网络接口的静态 IP 地址,请使用表单视图输入主机的 IP 地址和 MAC 地址。
    2. 如果您使用多个接口、绑定或其他高级网络功能,请使用 YAML 视图并为使用 NMState 语法的每个主机输入所需的网络状态。然后,为在网络配置中使用的每个主机接口添加 MAC 地址和接口名称。

其他资源

3.4. 配置 Operator

Assisted Installer 的安装可以配置某些 Operator。Operator 包括:

  • OpenShift Virtualization
  • Multicluster Engine (MCE) for Kubernetes
  • OpenShift Data Foundation
  • Logical Volume Manager (LVM) Storage
重要

有关每个 Operator 的详细描述,以及硬件要求、存储注意事项、相互依赖关系和其他安装说明,请参阅附加资源

此步骤是可选的。您可以在不选择 Operator 的情况下完成安装。

流程

  1. 要安装 OpenShift Virtualization,请选择 Install OpenShift Virtualization
  2. 要安装多集群引擎 (MCE),请选择 Install multicluster engine
  3. 要安装 OpenShift Data Foundation,请选择 Install OpenShift Data Foundation
  4. 要安装逻辑卷管理器,请选择 Install Logical Volume Manager
  5. Next 进入下一步。

3.5. 在集群中添加主机

您必须将一个或多个主机添加到集群中。将主机添加到集群涉及生成发现 ISO。发现 ISO 使用代理运行 Red Hat Enterprise Linux CoreOS (RHCOS) 内存中。

对集群中的每个主机执行以下步骤。

流程

  1. Add hosts 按钮并选择安装介质。

    1. 选择 Minimal image file: Provision with virtual media 以下载一个较小的镜像,该镜像会获取引导所需的数据。节点必须具有虚拟介质功能。这是 x86_64arm64 架构的推荐方法。
    2. 选择 Full image file: Provision with physical media 以下载更大的完整镜像。这是 ppc64le 架构的推荐方法。
    3. 选择 iPXE: Provision from your network server,以使用 iPXE 引导主机。这是 s390x 架构的推荐方法。

      注意

      如果您在 RHEL KVM 上使用 iPXE 安装,在有些情况下,KVM 主机上的虚拟机不会在第一次引导时重启,需要手动启动。

  2. 可选: 如果集群主机位于需要使用代理的防火墙后面,请选择 Configure cluster-wide proxy settings。输入代理服务器的 HTTP 和 HTTPS URL 的用户名、密码、IP 地址和端口。
  3. 可选:添加一个 SSH 公钥,以便可以以 core 用户身份连接到集群节点。通过登录到集群节点,您可以在安装过程中为您提供调试信息。

    重要

    不要在生产环境中跳过这个过程,在生产环境中需要灾难恢复和调试。

    1. 如果您在本地计算机上没有现有的 SSH 密钥对,请按照 为集群节点 SSH 访问生成密钥对 的步骤进行操作。
    2. SSH 公钥 字段中,单击 Browse 以上传包含 SSH 公钥的 id_rsa.pub 文件。或者,将文件拖放到文件管理器的字段中。要查看文件管理器中的文件,请在菜单中选择 Show hidden files
  4. 可选: 如果集群主机位于带有重新加密 man-in-the-middle (MITM)代理的网络中,或者集群需要信任证书用于容器镜像 registry,请选择 Configure cluster-wide trusted certificate。以 X.509 格式添加额外的证书。
  5. 如果需要,配置发现镜像。
  6. 可选:如果您要在一个平台上安装并希望与该平台集成,请选择 Integrate with your virtualization platform。您必须引导所有主机,并确保它们出现在主机清单中。所有主机必须位于同一平台上。
  7. Generate Discovery ISOGenerate Script File
  8. 下载发现 ISO 或 iPXE 脚本。
  9. 使用发现镜像或 iPXE 脚本引导主机。

3.6. 配置主机

使用发现 ISO 引导主机后,主机将显示在页面底部的表中。您可以选择为每个主机配置主机名和角色。如果需要,您还可以删除主机。

流程

  1. 在主机的 Options (⋮) 菜单中,选择 Change hostname。如有必要,为主机输入一个新名称,然后点更改。您必须确保每个主机具有有效且唯一的主机名。

    或者,从 Actions 列表中选择 Change hostname 以重命名多个所选主机。在 Change Hostname 对话框中,输入新名称并包含 {{n}},使每个主机名都是唯一的。然后点 更改

    注意

    在键入时,您可以看到在 Preview 窗格中显示的新名称。所有选定的主机的名称都几乎相同,唯一的不同是每个主机都带有一个一位的递增数字。

  2. Options (⋮) 菜单中,您可以选择 Delete host 来删除一个主机。点 Delete 以确认删除。

    或者,从 Actions 列表中选择 Delete 同时删除多个所选主机。然后点 Delete hosts

    注意

    在常规部署中,集群可以有三个或更多主机,其中三个主机必须是 control plane 主机。如果您删除一个也是 control plane 的主机,或者您只保留两个主机,则会出现一条信息表示系统未就绪。要恢复主机,您需要使用发现 ISO 重启它。

  3. 在主机的 Options (⋮) 菜单中,可以选择 View host events(可选)。列表中的事件按时间顺序显示。
  4. 对于多主机集群,在主机名旁边的 Role 列中,您可以点菜单来更改主机的角色。

    如果您没有选择角色,则 Assisted Installer 会自动分配角色。control plane 节点的最低硬件要求超过 worker 节点。如果为主机分配角色,请确保为满足最低硬件要求的主机分配 control plane 角色。

  5. Status 链接,以查看主机的硬件、网络和操作器验证。
  6. 点主机名左侧的箭头,以展开主机详细信息。

当所有集群主机都显示为 Ready 状态后,继续下一步。

3.7. 配置存储磁盘

发现并配置集群主机后,您可以选择为每个主机配置存储磁盘。

可能的主机配置都包括在配置主机部分中。有关链接,请参见下面的其他资源。

流程

  1. 在主机名旁边的复选框的左侧,单击以显示该主机的存储磁盘。
  2. 如果主机有多个存储磁盘,您可以选择不同的磁盘来充当安装磁盘。点磁盘的 Role 下拉列表,然后选择 Installation disk。之前的安装磁盘的角色更改为 None
  3. 在默认情况下,所有可引导磁盘都会在安装过程中标记为重新格式化,但只读磁盘(如 CDROM )除外。取消选择 Format 复选框以防止磁盘被重新格式化。安装磁盘必须重新格式化。在继续操作前备份任何敏感数据。

当所有磁盘驱动器都显示为 Ready 状态后,继续下一步。

其他资源

3.8. 配置网络

在安装 OpenShift Container Platform 之前,您必须配置集群网络。

流程

  1. Networking 页面中,如果还没有为您选择,请选择以下之一:

    • Cluster-Managed Networking: 选择集群管理的联网意味着 Assisted Installer 将配置标准网络拓扑,包括 keepalived 和 Virtual Router Redundancy Protocol (VRRP) 用于管理 API 和 Ingress VIP 地址。

      注意

      目前,OpenShift Container Platform 版本 4.13 中的 IBM zSystems 和 IBM Power 不支持集群管理的网络。

    • 用户管理的联网 :选择用户管理的网络允许您使用非标准网络拓扑部署 OpenShift Container Platform。例如,如果要使用外部负载均衡器而不是 keepalived 和 VRRP 部署,或者您想要在多个不同 L2 网络片段中部署集群节点。
  2. 对于集群管理的联网,请配置以下设置:

    1. 定义 Machine 网络。您可以使用默认网络或选择子网。
    2. 定义一个 API 虚拟 IP。API 虚拟 IP 为所有用户提供与平台交互的端点。
    3. 定义一个 Ingress 虚拟 IP。Ingress 虚拟 IP 为来自集群外部的应用程序流量提供端点。
  3. 对于用户管理的网络,请配置以下设置:

    1. 选择您的网络堆栈类型

      • IPv4 :当您的主机只使用 IPv4 时,请选择此类型。
      • Dual-stack:当主机将 IPv4 与 IPv6 一起使用时,您可以选择双栈。
    2. 定义 Machine 网络。您可以使用默认网络或选择子网。
    3. 定义一个 API 虚拟 IP。API 虚拟 IP 为所有用户提供与平台交互的端点。
    4. 定义一个 Ingress 虚拟 IP。Ingress 虚拟 IP 为来自集群外部的应用程序流量提供端点。
    5. 可选:您可以选择 Allocate IPs via DHCP server 来自动分配 API IPIngress IP 使用 DHCP 服务器。
  4. 可选: 选择 Use advanced networking 来配置以下高级网络属性:

    • Cluster network CIDR :定义从中分配 Pod IP 地址的 IP 地址块。
    • Cluster network host prefix :定义分配给每个节点的子网前缀长度。
    • 服务网络 CIDR :定义用于服务 IP 地址的 IP 地址。
    • Network type: 选择 Software-Defined Networking (SDN) 用于标准网络,或 Open Virtual Networking (OVN) 用于 IPv6, 双堆栈和电信功能。在 OpenShift Container Platform 4.12 及更新的版本中,OVN 是默认的 Container Network Interface (CNI)。

其他资源

3.9. 预安装验证

Assisted Installer 确保集群在安装过程中满足先决条件,因为它消除了复杂的安装后故障排除,从而节省大量时间和工作时间。在安装集群前,请确保集群和每个主机都通过预安装验证。

其他资源

3.10. 安装集群

完成配置并且所有节点都为 Ready 后,您可以开始安装。安装过程需要花费相当长的时间,您可以从 Assisted Installer Web 控制台监控安装。节点将在安装过程中重新引导,它们将在安装后进行初始化。

流程

  1. Begin Installation
  2. Host Inventory 列表中的 Status 列中的链接,以查看特定主机的安装状态。

3.11. 完成安装

安装和初始化集群后,Assisted Installer 表示安装已完成。Assisted Installer 提供控制台 URL、kubeadmin 用户名和密码以及 kubeconfig 文件。另外,辅助安装程序提供集群详情,包括 OpenShift Container Platform 版本、基础域、CPU 架构、API 和 Ingress IP 地址,以及集群和服务网络 IP 地址。

先决条件

  • 已安装 oc CLI 工具。

流程

  1. 复制 kubeadmin 用户名和密码。
  2. 下载 kubeconfig 文件,并将其复制到工作目录中的 auth 目录中:

    $ mkdir -p <working_directory>/auth
    $ cp kubeadmin <working_directory>/auth
    注意

    kubeconfig 文件可在完成安装后 24 小时下载。

  3. 在您的环境中添加 kubeconfig 文件:

    $ export KUBECONFIG=<your working directory>/auth/kubeconfig
  4. 使用 oc CLI 工具登录:

    $ oc login -u kubeadmin -p <password>

    <password> 替换为 kubeadmin 用户的密码。

  5. 点 Web 控制台 URL 或点 Launch OpenShift Console 打开控制台。
  6. 输入 kubeadmin 用户名和密码。按照 OpenShift Container Platform 控制台中的说明来配置身份提供程序并配置警报接收器。
  7. 添加 OpenShift Container Platform 控制台的书签。
  8. 完成任何安装后平台集成步骤。

第 4 章 使用 Assisted Installer API 安装

确保满足集群节点和网络要求后,您可以使用 Assisted Installer API 开始安装集群。要使用 API,您必须执行以下步骤:

  • 设置 API 身份验证。
  • 配置 pull secret。
  • 注册新的集群定义。
  • 为集群创建基础架构环境。

执行这些步骤后,您可以修改集群定义,创建发现 ISO,在集群中添加主机,并安装集群。本文档并没有包括 Assisted Installer API 的每个端点,但您可以查看 API viewerswagger.yaml 文件中的详细内容。

4.1. 可选:安装 OpenShift Cluster Manager CLI

OpenShift Cluster Manager (ocm) CLI 工具可让您通过命令行与 OpenShift Cluster Manager 交互。您可以执行 REST GET、POST、PATCH 和 DELETE 操作,生成 API 令牌,以及列出集群以及其他功能。

重要

OpenShift Cluster Manager CLI 只是一个技术预览功能。Developer Preview(开发人员预览)功能不被红帽支持,其功能可能并不完善且不是生产环境就绪。不要将开发人员预览功能用于生产环境或业务关键型工作负载。开发人员预览功能可以在之前可能地包含在红帽产品产品中提前访问即将推出的产品功能,使客户能够测试功能并在开发过程中提供反馈。这些功能可能没有任何文档,可能会随时被更改或删除,测试也会受到限制。红帽可能会提供在没有关联 SLA 的情况下提交对开发人员预览功能的反馈。

先决条件

流程

  1. 在菜单中,点 OpenShift
  2. 在子菜单中,点 Downloads
  3. OpenShift Cluster Manager API Token 下的 Tokens 部分中,点 View API Token
  4. Load Token

    重要

    禁用弹出窗口阻塞。

  5. API 令牌 部分中,复制离线令牌。
  6. 在终端中,将离线令牌设置为 OFFLINE_TOKEN 变量:

    $ export OFFLINE_TOKEN=<copied_api_token>
    提示

    要使离线令牌永久生效,请将其添加到您的配置集中。

  7. Download ocm CLI
  8. 将下载的文件复制到您的路径中。例如,将文件复制到 /usr/bin~/.local/bin 并创建一个 ocm 符号链接。
  9. 将身份验证命令复制并粘贴到终端中,然后按 Enter 键登录:

    $ ocm login --token="${OFFLINE_TOKEN}"

4.2. 使用 REST API 进行身份验证

API 调用需要通过 API 令牌进行身份验证。假设您使用 API_TOKEN 作为变量名称,请将 -H "Authorization: Bearer ${API_TOKEN}" 添加到 API 调用中以与 REST API 进行身份验证。

注意

API 令牌在 15 分钟后过期。

先决条件

  • (可选)已安装了 OpenShift Cluster Manager (ocm) CLI 工具。

流程

  1. 使用 OFFLINE_TOKEN 设置 API_TOKEN 变量以验证用户。

    1. (可选)在命令行终端上执行以下命令:

      $ export API_TOKEN=$( \
        curl \
        --silent \
        --header "Accept: application/json" \
        --header "Content-Type: application/x-www-form-urlencoded" \
        --data-urlencode "grant_type=refresh_token" \
        --data-urlencode "client_id=cloud-services" \
        --data-urlencode "refresh_token=${OFFLINE_TOKEN}" \
        "https://sso.redhat.com/auth/realms/redhat-external/protocol/openid-connect/token" \
        | jq --raw-output ".access_token" \
      )
    2. (可选)在命令行终端上登录到 ocm 客户端:

      $ ocm login --token="${OFFLINE_TOKEN}"

      然后,生成 API 令牌:

      $ export API_TOKEN=$(ocm token)
  1. 在您的路径中为令牌生成方法创建一个脚本。例如:

    $ vim ~/.local/bin/refresh-token
    export API_TOKEN=$( \
      curl \
      --silent \
      --header "Accept: application/json" \
      --header "Content-Type: application/x-www-form-urlencoded" \
      --data-urlencode "grant_type=refresh_token" \
      --data-urlencode "client_id=cloud-services" \
      --data-urlencode "refresh_token=${OFFLINE_TOKEN}" \
      "https://sso.redhat.com/auth/realms/redhat-external/protocol/openid-connect/token" \
      | jq --raw-output ".access_token" \
    )

    然后保存文件。

  2. 更改文件模式使其可执行:

    $ chmod +x ~/.local/bin/refresh-token
  3. 刷新 API 令牌:

    $ source refresh-token
  4. 运行以下命令验证您可以访问 API:

    $ curl -s https://api.openshift.com/api/assisted-install/v2/component-versions -H "Authorization: Bearer ${API_TOKEN}" | jq

    输出示例

    {
      "release_tag": "v2.11.3",
      "versions": {
        "assisted-installer": "registry.redhat.io/rhai-tech-preview/assisted-installer-rhel8:v1.0.0-211",
        "assisted-installer-controller": "registry.redhat.io/rhai-tech-preview/assisted-installer-reporter-rhel8:v1.0.0-266",
        "assisted-installer-service": "quay.io/app-sre/assisted-service:78d113a",
        "discovery-agent": "registry.redhat.io/rhai-tech-preview/assisted-installer-agent-rhel8:v1.0.0-195"
      }
    }

4.3. 配置 pull secret

许多 Assisted Installer API 调用都需要 pull secret。将 pull secret 下载到文件中,以便您可以在 API 调用中引用它。pull secret 是一个 JSON 对象,它将作为请求的 JSON 对象中的值包含在其中。必须格式化 pull secret JSON 来转义引号。例如:

之前

{"auths":{"cloud.openshift.com": ...

After

{\"auths\":{\"cloud.openshift.com\": ...

流程

  1. 在菜单中,点 OpenShift
  2. 在子菜单中,点 Downloads
  3. Pull secret 下的 Tokens 部分中,点 Download
  4. 要使用 shell 变量中的 pull secret,请执行以下命令:

    $ export PULL_SECRET=$(cat ~/Downloads/pull-secret.txt | jq -R .)
  5. 要使用 jq 分片 pull secret 文件,请在 pull_secret 变量中引用它,将值传送到 tojson,以确保它被正确格式化为转义的 JSON。例如:

    $ curl https://api.openshift.com/api/assisted-install/v2/clusters \
    -H "Authorization: Bearer ${API_TOKEN}" \
    -H "Content-Type: application/json" \
    -d "$(jq --null-input \
            --slurpfile pull_secret ~/Downloads/pull-secret.txt ' 1
        {
            "name": "testcluster",
            "high_availability_mode": "None",
            "openshift_version": "4.11",
            "pull_secret": $pull_secret[0] | tojson, 2
            "base_dns_domain": "example.com"
        }
    ')"
    1
    对 pull secret 文件进行 Slurp。
    2
    格式化 pull secret 以转义 JSON 格式。

4.4. 注册新集群

要使用 API 注册新集群定义,请使用 /v2/clusters 端点。注册新集群需要以下设置:

  • name
  • openshift-version
  • pull_secret
  • cpu_architecture

有关注册新集群时可设置的字段的详情,请参阅 API viewer 中的 cluster-create-params 模型。设置 olm_operators 字段时,请参阅安装 Operator 的详情,请参阅附加资源

创建集群定义后,您可以修改集群定义并为附加设置提供值。有关修改集群的详情,请参阅附加资源

先决条件

  • 您已生成了一个有效的 API_TOKEN。令牌每 15 分钟过期一次。
  • 您已下载了 pull secret。
  • 可选: 您已将 pull secret 分配给 $PULL_SECRET 变量。

流程

  1. 刷新 API 令牌:

    $ source refresh-token
  2. 注册新集群。

    1. 可选: 您可以通过在请求中分片 pull secret 文件来注册新集群:

      $ curl -s -X POST https://api.openshift.com/api/assisted-install/v2/clusters \
      -H "Authorization: Bearer ${API_TOKEN}" \
      -H "Content-Type: application/json" \
      -d "$(jq --null-input \
          --slurpfile pull_secret ~/Downloads/pull-secret.txt '
      {
          "name": "testcluster",
          "openshift_version": "4.11",
          "cpu_architecture" : "<architecture_name>" 1
          "high_availability_mode": <cluster_type>, 2
          "base_dns_domain": "example.com",
          "pull_secret": $pull_secret[0] | tojson
      }
      ')" | jq '.id'
      注意
      1
      使用以下值:x86_64,arm64,ppc64le,s390x,multi.
      2
      使用默认值 full 来代表多节点 OpenShift 集群,或 none 代表单节点 OpenShift 集群。
    2. 可选: 您可以通过将配置写入 JSON 文件,然后在请求中引用它来注册新集群:

      cat << EOF > cluster.json
      {
        "name": "testcluster",
        "openshift_version": "4.11",
        "high_availability_mode": "<cluster_type>",
        "base_dns_domain": "example.com",
        "pull_secret": $PULL_SECRET
      }
      EOF
      $ curl -s -X POST "https://api.openshift.com/api/assisted-install/v2/clusters" \
        -d @./cluster.json \
        -H "Content-Type: application/json" \
        -H "Authorization: Bearer $API_TOKEN" \
        | jq '.id'
  3. 将返回的 cluster_id 分配给 CLUSTER_ID 变量,并导出它:

    $ export CLUSTER_ID=<cluster_id>
    注意

    如果关闭终端会话,则需要在新的终端会话中再次导出 CLUSTER_ID 变量。

  4. 检查新集群的状态:

    $ curl -s -X GET "https://api.openshift.com/api/assisted-install/v2/clusters/$CLUSTER_ID" \
      -H "Content-Type: application/json" \
      -H "Authorization: Bearer $API_TOKEN" \
      | jq

注册新的集群定义后,为集群创建基础架构环境。

注意

在创建基础架构环境前,您无法在 Assisted Installer 用户界面中看到集群配置设置。

4.5. 修改集群

要使用 API 修改集群定义,请使用 /v2/clusters/{cluster_id} 端点。修改集群资源是添加设置(如更改网络类型或启用用户管理的网络)的常见操作。如需了解在修改集群定义时您可以设置的字段的详情,请参阅 API viewer 中的 v2-cluster-update-params 模型。如需有关在集群中定义 Operator 的详细信息,请参阅安装和修改 Operator。

先决条件

  • 您已创建了新的集群资源。

流程

  1. 刷新 API 令牌:

    $ source refresh-token
  2. 修改集群。例如:

    $ curl https://api.openshift.com/api/assisted-install/v2/clusters/${CLUSTER_ID} \
    -X PATCH \
    -H "Authorization: Bearer ${API_TOKEN}" \
    -H "Content-Type: application/json" \
    -d '
    {
        "ssh_public_key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDZrD4LMkAEeoU2vShhF8VM+cCZtVRgB7tqtsMxms2q3TOJZAgfuqReKYWm+OLOZTD+DO3Hn1pah/mU3u7uJfTUg4wEX0Le8zBu9xJVym0BVmSFkzHfIJVTn6SfZ81NqcalisGWkpmkKXVCdnVAX6RsbHfpGKk9YPQarmRCn5KzkelJK4hrSWpBPjdzkFXaIpf64JBZtew9XVYA3QeXkIcFuq7NBuUH9BonroPEmIXNOa41PUP1IWq3mERNgzHZiuU8Ks/pFuU5HCMvv4qbTOIhiig7vidImHPpqYT/TCkuVi5w0ZZgkkBeLnxWxH0ldrfzgFBYAxnpTU8Ih/4VhG538Ix1hxPaM6cXds2ic71mBbtbSrk+zjtNPaeYk1O7UpcCw4jjHspU/rVV/DY51D5gSiiuaFPBMucnYPgUxy4FMBFfGrmGLIzTKiLzcz0DiSz1jBeTQOX++1nz+KDLBD8CPdi5k4dq7lLkapRk85qdEvgaG5RlHMSPSS3wDrQ51fD8= user@hostname"
    }
    ' | jq

4.6. 注册新的基础架构环境

使用 Assisted Installer API 注册新集群定义后,使用 v2/infra-envs 端点创建一个基础架构环境。注册新的基础架构环境需要以下设置:

  • name
  • pull_secret
  • cpu_architecture

有关注册新基础架构环境时可以设置的字段的详情,请参阅 API viewer 中的 infra-env-create-params 模型。您可以在创建基础架构环境后修改基础架构环境。作为最佳实践,请考虑在创建新基础架构环境时包括 cluster_idcluster_id 将基础架构环境与集群定义相关联。在创建新基础架构环境时,辅助安装程序也会生成发现 ISO。

先决条件

  • 您已生成了一个有效的 API_TOKEN。令牌每 15 分钟过期一次。
  • 您已下载了 pull secret。
  • 可选: 注册一个新的集群定义并导出 cluster_id

流程

  1. 刷新 API 令牌:

    $ source refresh-token
  2. 注册新的基础架构环境。提供名称,最好包含集群名称。本例提供集群 ID,用于将基础架构环境与集群资源关联。以下示例指定了 image_type。您可以指定 full-isominimal-iso。默认值为 minimal-iso

    1. 可选: 您可以通过在请求中分片 pull secret 文件来注册新的基础架构环境:

      $ curl https://api.openshift.com/api/assisted-install/v2/infra-envs \
      -H "Authorization: Bearer ${API_TOKEN}" \
      -H "Content-Type: application/json" \
      -d "$(jq --null-input \
        --slurpfile pull_secret ~/Downloads/pull-secret.txt \
        --arg cluster_id ${CLUSTER_ID} '
          {
            "name": "testcluster-infra-env",
            "image_type":"full-iso",
            "cluster_id": $cluster_id,
            "cpu_architecture" : "<architecture_name>" 1
            "pull_secret": $pull_secret[0] | tojson
          }
      ')" | jq '.id'
      注意
      1
      表示有效的值。它们包括:x86_64, arm64, ppc64le, s390x, multi
    2. 可选: 您可以通过将配置写入 JSON 文件并在请求中引用它来注册新的基础架构环境:

      $ cat << EOF > infra-envs.json
      {
       "name": "testcluster-infra-env",
       "image_type": "full-iso",
       "cluster_id": "$CLUSTER_ID",
       "pull_secret": $PULL_SECRET
      }
      EOF
      $ curl -s -X POST "https://api.openshift.com/api/assisted-install/v2/infra-envs" \
       -d @./infra-envs.json \
       -H "Content-Type: application/json" \
       -H "Authorization: Bearer $API_TOKEN" \
       | jq '.id'
  3. INFRA_ENV_ID 变量分配返回的 id 并导出它:

    $ export INFRA_ENV_ID=<id>
注意

创建基础架构环境并通过 cluster_id 将其与集群定义相关联后,您可以在 Assisted Installer Web 用户界面中看到集群设置。如果您关闭终端会话,则需要在新终端会话中重新导出 id

4.7. 修改基础架构环境

您可以使用 /v2/infra-envs/{infra_env_id} 端点修改基础架构环境。修改基础架构环境是添加设置(如网络、SSH 密钥或 ignition 配置覆盖)的常见操作。

如需了解在修改基础架构环境时您可以设置的字段的详情,请参阅 API viewer 中的 infra-env-update-params 模型。修改新的基础架构环境时,辅助安装程序也会重新生成发现 ISO。

先决条件

  • 您已创建了新的基础架构环境。

流程

  1. 刷新 API 令牌:

    $ source refresh-token
  2. 修改基础架构环境:

    $ curl https://api.openshift.com/api/assisted-install/v2/infra-envs/${INFRA_ENV_ID} \
    -X PATCH \
    -H "Authorization: Bearer ${API_TOKEN}" \
    -H "Content-Type: application/json" \
    -d "$(jq --null-input \
      --slurpfile pull_secret ~/Downloads/pull-secret.txt '
        {
          "image_type":"minimal-iso",
          "pull_secret": $pull_secret[0] | tojson
        }
    ')" | jq

4.8. 添加主机

配置集群资源和基础架构环境后,下载发现 ISO 镜像。您可以从两个镜像中选择:

  • 完整 ISO 镜像 :在启动时使用完整的 ISO 镜像必须自我包含。该镜像包括引导和启动辅助安装程序代理所需的所有内容。ISO 镜像的大小大约为 1GB。
  • 最小 ISO 镜像:当虚拟介质连接的带宽有限时,使用最小 ISO 镜像。这是默认设置。镜像仅包含使用联网引导主机所需的内容。在引导时会下载大多数内容。ISO 镜像大小为 100MB。
  • iPXE: 这是 's390x' 架构的推荐方法。

两个镜像都会导致相同的安装过程。要更改镜像类型,请在执行此流程前更改基础架构环境中的 image_type 设置。

先决条件

  • 您已创建了集群。
  • 您已创建了基础架构环境。
  • 您已完成配置。
  • 如果集群主机位于需要使用代理的防火墙后面,您已为代理服务器的 HTTP 和 HTTPS URL 配置了用户名、密码、IP 地址和端口。
  • 您已选择了镜像类型,或者使用默认的 minimal-iso

流程

  1. 如果需要,配置发现镜像。请参阅使用 iPXE 引导主机
  2. 刷新 API 令牌:

    $ source refresh-token
  3. 获取下载 URL:

    $ curl -H "Authorization: Bearer ${API_TOKEN}" \
    https://api.openshift.com/api/assisted-install/v2/infra-envs/${INFRA_ENV_ID}/downloads/image-url
  4. 下载发现镜像:

    $ wget -O discovery.iso '<url>'

    <url> 替换为上一步中的下载 URL。

  5. 使用发现镜像引导主机。如果要在平台上安装并希望与平台集成,请查看以下其他资源以了解详情:
  6. 为主机分配角色。

4.9. 修改主机

添加主机后,根据需要修改主机。最常见的修改是 host_namehost_role 参数。

您可以使用 /v2/infra-envs/{infra_env_id}/hosts/{host_id} 端点修改主机。如需了解在修改主机时您可以设置的字段的详情,请参阅 API viewer 中的 host-update-params 模型。

主机可能是两个角色之一:

  • master: 带有 master 角色的一个主机,作为控制平面(control plane)主机。
  • worker: 带有 worker 角色的主机,作为 worker 主机。

默认情况下,辅助安装程序将主机设置为 auto-assign,这意味着安装程序会自动决定主机是 master 角色还是 worker 角色。使用以下步骤设置主机的角色:

先决条件

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

流程

  1. 刷新 API 令牌:

    $ source refresh-token
  2. 获取主机 ID:

    $ curl -s -X GET "https://api.openshift.com/api/assisted-install/v2/clusters/$CLUSTER_ID" \
    --header "Content-Type: application/json" \
      -H "Authorization: Bearer $API_TOKEN" \
    | jq '.host_networks[].host_ids'
  3. 对于使用 z/VM 的 IBM Z (s390x)安装,需要额外的内核参数。

    1. 要检索匹配节点的 hostID,请运行以下命令:

      curl https://api.openshift.com/api/assisted-install/v2/infra-envs/$INFRA_ENV_ID/hosts -H "Authorization: Bearer ${API_TOKEN}" | jq '.[]|[.id,.requested_hostname] | join("|")'
    2. 要指定所需的内核参数,请运行以下命令:

      curl https://api.stage.openshift.com/api/assisted-install/v2/infra-envs/${INFRA_ENV_ID}/hosts/$1/installer-args \
      -X PATCH \
      -H "Authorization: Bearer ${API_TOKEN}" \
      -H "Content-Type: application/json" \
      -d '
      {
      "args": [
      "--append-karg", "rd.neednet=1",
      "--append-karg", "ip=10.14.6.3::10.14.6.1:255.255.255.0:master-0.boea3e06.lnxero1.boe:encbdd0:none",
      "--append-karg", "nameserver=10.14.6.1",
      "--append-karg", "ip=[fd00::3]::[fd00::1]:64::encbdd0:none",
      "--append-karg", "nameserver=[fd00::1]",
      "--append-karg", "zfcp.allow_lun_scan=0",
      "--append-karg", "rd.znet=qeth,0.0.bdd0,0.0.bdd1,0.0.bdd2,layer2=1",
      "--append-karg", "rd.dasd=0.0.5235"
      ]
      }
      ' | jq
      注意

      每个主机可能具有特定的内核参数。

      输出示例

      [
        "1062663e-7989-8b2d-7fbb-e6f4d5bb28e5"
      ]

  4. 修改主机:

    $ curl https://api.openshift.com/api/assisted-install/v2/infra-envs/${INFRA_ENV_ID}/hosts/<host_id> \ 1
    -X PATCH \
    -H "Authorization: Bearer ${API_TOKEN}" \
    -H "Content-Type: application/json" \
    -d '
        {
          "host_role":"worker"
          "host_name" : "worker-1"
        }
    ' | jq
    1
    <host_id> 替换为主机的 ID。

4.10. 预安装验证

Assisted Installer 确保集群在安装过程中满足先决条件,因为它消除了复杂的安装后故障排除,从而节省大量时间和工作时间。在安装集群前,请确保集群和每个主机都通过预安装验证。

其他资源

4.11. 安装集群

一旦集群主机经过验证,您就可以安装集群。

先决条件

  • 您已创建了集群和基础架构环境。
  • 您已将主机添加到基础架构环境中。
  • 主机已通过验证。

流程

  1. 刷新 API 令牌:

    $ source refresh-token
  2. 安装集群:

    $ curl -H "Authorization: Bearer $API_TOKEN" \
    -X POST \
    https://api.openshift.com/api/assisted-install/v2/clusters/$CLUSTER_ID/actions/install | jq
  3. 完成任何安装后平台集成步骤。

第 5 章 可选:启用磁盘加密

您可以使用 TPM v2 或 Tang 加密模式启用安装磁盘加密。

注意

在某些情况下,当您在固件中为裸机主机启用 TPM 磁盘加密时,然后从您使用辅助安装程序生成的 ISO 引导它,集群部署可能会卡住。如果以前的安装在主机中保留了 TPM 加密密钥,则可能会出现这种情况。如需更多信息,请参阅 BZ#2011634。如果您遇到这个问题,请联系红帽支持。

5.1. 启用 TPM v2 加密

先决条件

  • 检查每个主机上的 BIOS 是否启用了 TPM v2 加密。大多数 Dell 系统都需要这个设置。检查您的计算机手册。Assisted Installer 还验证固件中是否启用了 TPM。详情请查看 Assisted Installer API 中的 disk-encruption 模式。
重要

验证每个节点上是否安装了 TPM v2 加密芯片,并在固件中启用。

流程

  1. 可选: 使用 UI,在用户界面向导的 集群详情 步骤中,选择在 control plane 节点、worker 或这两个节点上启用 TPM v2 加密。
  2. 可选:使用 API,请遵循"修改主机"过程。将 disk_encryption.enable_on 设置设置为 all, masters, 或 workers。将 disk_encryption.mode 设置设置为 tpmv2

    1. 刷新 API 令牌:

      $ source refresh-token
    2. 启用 TPM v2 加密:

      $ curl https://api.openshift.com/api/assisted-install/v2/clusters/${CLUSTER_ID} \
      -X PATCH \
      -H "Authorization: Bearer ${API_TOKEN}" \
      -H "Content-Type: application/json" \
      -d '
      {
        "disk_encryption": {
          "enable_on": "none",
          "mode": "tpmv2"
        }
      }
      ' | jq

      enable_on 的有效设置是 all, master, worker, 或 none

5.2. 启用 Tang 加密

先决条件

  • 您可以使用 Red Hat Enterprise Linux(RHEL)8 机器来生成 Tang Exchange 密钥的指纹。

流程

  1. 设置 Tang 服务器或访问现有服务器。具体步骤请查看 网络绑定磁盘加密。您可以设置多个 Tang 服务器,但 Assisted Installer 在安装过程中需要可以连接到所有 Tang 服务器。
  2. 在 Tang 服务器上,使用 tang-show-keys 检索 Tang 服务器的 thumbprint:

    $ tang-show-keys <port>

    可选:将 <port> 替换为端口号。默认端口号为 80

    thumbprint 示例

    1gYTN_LpU9ZMB35yn5IbADY5OQ0

  3. 可选:使用 jose 获取 Tang 服务器的 thumbprint。

    1. 确保在 Tang 服务器中安装了 jose

      $ sudo dnf install jose
    2. 在 Tang 服务器上,使用 jose 检索 thumbprint:

      $ sudo jose jwk thp -i /var/db/tang/<public_key>.jwk

      <public_key> 替换为 Tang 服务器的公共交换密钥。

      thumbprint 示例

      1gYTN_LpU9ZMB35yn5IbADY5OQ0

  4. 可选:在用户界面向导的 Cluster details 步骤中,选择在 control plane 节点、worker 或这两个节点上启用 Tang 加密。您需要为 Tang 服务器输入 URL 和 thumbprints。
  5. 可选:使用 API,请遵循"修改主机"过程。

    1. 刷新 API 令牌:

      $ source refresh-token
    2. disk_encryption.enable_on 设置设置为 all, masters, 或 workers。将 disk_encryption.mode 设置设置为 tang。设置 disk_encyrption.tang_servers,以提供一个或多个 Tang 服务器的 URL 和 thumbprint 详情:

      $ curl https://api.openshift.com/api/assisted-install/v2/clusters/${CLUSTER_ID} \
      -X PATCH \
      -H "Authorization: Bearer ${API_TOKEN}" \
      -H "Content-Type: application/json" \
      -d '
      {
        "disk_encryption": {
          "enable_on": "all",
          "mode": "tang",
          "tang_servers": "[{\"url\":\"http://tang.example.com:7500\",\"thumbprint\":\"PLjNyRdGw03zlRoGjQYMahSZGu9\"},{\"url\":\"http://tang2.example.com:7500\",\"thumbprint\":\"XYjNyRdGw03zlRoGjQYMahSZGu3\"}]"
        }
      }
      ' | jq

      enable_on 的有效设置是 all, master, worker, 或 none。在 tang_servers 值中,注释掉对象中的引号。

5.3. 其他资源

第 6 章 可选:安装和修改 Operator

Assisted Installer 可以在 UI 或 API 中使用默认配置安装所选 Operator。如果需要高级选项,请在安装集群后安装所需的 Operator。

Assisted Installer 监控所选 Operator 的安装作为集群安装的一部分,并报告其状态。如果一个或多个 Operator 在安装过程中遇到错误,则 Assisted Installer 会报告集群安装已完成,并显示一个或多个 Operator 无法安装的警告。

有关使用 Assisted Installer UI 或 API 安装或修改集群定义时,请参阅下面的部分。有关安装 OpenShift Container Platform 集群的完整说明,请参阅 使用 Assisted Installer UI 安装或使用 Assisted Installer API 安装。

6.1. 安装 Operator

当使用 Assisted Installer UI installng Operator 时,在向导的 Operators 页面中选择 Operator。当使用 Assisted Installer API 安装 Operator 时,使用 /v2/clusters 端点中的 POST 方法。

6.1.1. 安装 OpenShift Virtualization

配置集群时,您可以启用 OpenShift Virtualization

注意

目前,IBM zSystems 和 IBM Power 不支持 OpenShift Virtualization。

如果启用,辅助安装程序:

  1. 验证您的环境是否满足以下先决条件。
  2. 配置虚拟机存储,如下所示:

    1. 对于单节点 OpenShift 集群版本 4.10 及更新版本,辅助安装程序配置 hostpath 置备程序
    2. 对于早期版本中的单节点 OpenShift 集群,辅助安装程序配置 Local Storage Operator
    3. 对于多节点集群,辅助安装程序配置 OpenShift Data Foundation。

先决条件

  • Red Hat Enterprise Linux(RHEL)8 支持
  • 支持 Intel 64 或 AMD64 CPU 扩展
  • 启用 Intel 虚拟化技术或 AMD-V 硬件虚拟化扩展
  • 启用 NX(无执行)标记

流程

  1. 如果您使用 Assisted Installer UI:

    • 向导的 Operator 步骤中,启用 Install OpenShift Virtualization 复选框。
  2. 如果您使用 Assisted Installer API:

    • 在注册新集群时,添加 "olm_operators: [{"name": "cnv"}]" 语句。

      注意

      CNV 代表容器原生虚拟化。

      例如:

      $ curl -s -X POST https://api.openshift.com/api/assisted-install/v2/clusters \
      -H "Authorization: Bearer ${API_TOKEN}" \
      -H "Content-Type: application/json" \
      -d "$(jq --null-input \
         --slurpfile pull_secret ~/Downloads/pull-secret.txt '
      {
         "name": "testcluster",
         "openshift_version": "4.11",
         "cpu_architecture" : "x86_64",
         "base_dns_domain": "example.com",
         "olm_operators: [{"name": "cnv"}]"
         "pull_secret": $pull_secret[0] | tojson
      }
      ')" | jq '.id'

其他资源

  • 有关为 OpenShift Virtualization 准备集群的详情,请参阅 OpenShift 文档

6.1.2. 安装多集群引擎 (MCE)

配置集群时,您可以启用多集群引擎 (MCE) Operator。Multicluster Engine (MCE) Operator 允许您从当前安装的集群安装额外的集群。

先决条件

  • OpenShift 版本 4.10 及更高版本
  • 用于多节点 OpenShift 集群的额外 4 个 CPU 内核和 16GB RAM。
  • 单节点 OpenShift 集群的额外 8 个 CPU 内核和 32GB RAM。

存储注意事项

在安装前,您必须考虑管理集群所需的存储,以便从多集群引擎进行部署。您可以选择以下场景之一来自动化存储:

  • 在多节点集群中安装 OpenShift Data Foundation (ODF)。ODF 是集群的推荐存储,但需要额外的订阅。详情请参阅本章中的 安装 OpenShift Data Foundation
  • 在单节点 OpenShift (SNO) 集群中安装逻辑卷管理存储(LVMS)。
  • 在多节点集群中安装多集群引擎,无需配置存储。然后,配置您选择的存储,并在安装后启用中央基础架构管理 (CIM) 服务。详情请查看本章中的附加资源

流程

  1. 如果您使用 Assisted Installer UI:

    • 在向导的 Operator 步骤中,启用 Install multicluster engine 复选框。
  2. 如果您使用 Assisted Installer API:

    • 在注册新集群时,请使用 "olm_operators: [{"name": "mce"}]" 语句,例如:

      $ curl -s -X POST https://api.openshift.com/api/assisted-install/v2/clusters \
      -H "Authorization: Bearer ${API_TOKEN}" \
      -H "Content-Type: application/json" \
      -d "$(jq --null-input \
          --slurpfile pull_secret ~/Downloads/pull-secret.txt '
      {
          "name": "testcluster",
          "openshift_version": "4.11",
          "cpu_architecture" : "x86_64"
          "base_dns_domain": "example.com",
          "olm_operators: [{"name": "mce"}]",
          "pull_secret": $pull_secret[0] | tojson
      }
      ')" | jq '.id'

安装后的步骤

  • 要将辅助安装程序技术与多集群引擎搭配使用,请启用中央基础架构管理服务。详情请参阅启用中央基础架构管理服务
  • 要使用托管的 control plane 部署 OpenShift Container Platform 集群,请配置托管的 control plane。详情请参阅 Hosted Control Planes

其他资源

6.1.3. 安装 OpenShift Data Foundation

配置集群时,您可以启用 OpenShift Data Foundation。如果启用,辅助安装程序:

  1. 验证您的环境是否满足以下先决条件。它不会验证磁盘设备是否已重新格式化,您必须在启动前进行验证。
  2. 将存储配置为使用所有可用的磁盘。

启用 OpenShift Data Foundation 时,辅助安装程序会创建一个 StorageCluster 资源,该资源指定用于 OpenShift Data Foundation 的所有可用磁盘。如果需要不同的配置,请在安装集群后修改配置,或者在安装集群后安装 Operator。

先决条件

  • 集群是一个三节点 OpenShift 集群,或至少具有 3 个 worker 节点。
  • 每个主机至少有一个非安装磁盘,至少具有 25GB。
  • 您使用的磁盘设备必须为空。磁盘上不应保留物理卷(PV)、卷组(VG)或逻辑卷(LV)。
  • 除了其他 CPU 要求外,对于三节点 OpenShift ,每个主机需要有 6 个 CPU,对于标准集群,每个主机需要 8 个 CPU 内核。
  • 除了其他 RAM 要求外,每个主机还需要有 19 GiB RAM。
  • 除了其他 CPU 和 RAM 要求外,每个主机需要有 2 个 CPU,每个存储磁盘有 5GiB RAM。
  • 您已为每个主机分配了 control plane 或 worker 角色(而不是自动分配)。

流程

  1. 如果您使用 Assisted Installer UI:

    • 向导的 Operator 步骤中,启用 Install OpenShift Data Foundation 复选框。
  2. 如果您使用 Assisted Installer API:

    • 在注册新集群时,添加 "olm_operators: [{"name": "odf"}]" 语句。例如:

      $ curl -s -X POST https://api.openshift.com/api/assisted-install/v2/clusters \
      -H "Authorization: Bearer ${API_TOKEN}" \
      -H "Content-Type: application/json" \
      -d "$(jq --null-input \
         --slurpfile pull_secret ~/Downloads/pull-secret.txt '
      {
         "name": "testcluster",
         "openshift_version": "4.11",
         "cpu_architecture" : "x86_64",
         "base_dns_domain": "example.com",
         "olm_operators: [{"name": "odf"}]",
         "pull_secret": $pull_secret[0] | tojson
      }
      ')" | jq '.id'

其他资源

  • 如需有关 OpenShift Data Foundation 的更多信息,请参阅 OpenShift 文档

6.1.4. 安装逻辑卷管理器存储

配置集群时,您可以在单节点 OpenShift 集群上启用逻辑卷管理器存储(LVMS) Operator。安装 LVMS Operator 可让您动态置备本地存储。

先决条件

  • 安装了版本 4.11 或更高版本的单节点 OpenShift 集群
  • 至少一个非安装磁盘
  • 一个额外的 CPU 内核和 400 MB RAM (1200 MB RAM 用于 4.13 之前的版本)

流程

  1. 如果您使用 Assisted Installer UI:

    • 向导的 Operator 步骤中,启用 Install Logical Volume Manager Storage 复选框。
  2. 如果您使用 Assisted Installer API:

    • 在注册新集群时,请使用 olm_operators: [{"name": "lvm"}] 语句。例如:

      $ curl -s -X POST https://api.openshift.com/api/assisted-install/v2/clusters \
      -H "Authorization: Bearer ${API_TOKEN}" \
      -H "Content-Type: application/json" \
      -d "$(jq --null-input \
         --slurpfile pull_secret ~/Downloads/pull-secret.txt '
      {
         "name": "testcluster",
         "openshift_version": "4.14",
         "cpu_architecture" : "x86_64",
         "base_dns_domain": "example.com",
         "olm_operators: [{"name": "lvm"}]"
         "pull_secret": $pull_secret[0] | tojson
      }
      ')" | jq '.id'

其他资源

6.2. 修改 Operator

在 Assisted Installer 中,您可以为已在上一安装步骤中注册的集群资源添加或删除 Operator。这只能在启动 OpenShift Container Platform 安装前进行。

修改定义的 Operator:

  • 如果使用 Assisted Installer UI,进入向导的 Operators 页面并修改您的选择。详情请参阅本节中的步骤 安装 Operator
  • 如果使用 Assisted Installer API,请为 /v2/clusters/{cluster_id} 端点使用 PATCH 方法设置所需的 Operator 定义。

先决条件

  • 您已创建了新的集群资源。

流程

  1. 刷新 API 令牌:

    $ source refresh-token
  2. 通过列出现有集群来识别 CLUSTER_ID 变量,如下所示:

    $ curl -s https://api.openshift.com/api/assisted-install/v2/clusters -H "Authorization: Bearer ${API_TOKEN}" | jq '[ .[] | { "name": .name, "id": .id } ]'

    输出示例

    [
      {
        "name": "lvmtest",
        "id": "475358f9-ed3a-442f-ab9e-48fd68bc8188" 1
      },
      {
        "name": "mcetest",
        "id": "b5259f97-be09-430e-b5eb-d78420ee509a"
      }
    ]

    注意
    1
    id 值是 < cluster_id>
  3. 将返回的 & lt;cluster_id > 分配给 CLUSTER_ID 变量并导出它:

    $ export CLUSTER_ID=<cluster_id>
  4. 使用新 Operator 更新集群:

    $ curl https://api.openshift.com/api/assisted-install/v2/clusters/${CLUSTER_ID} \
    -X PATCH \
    -H "Authorization: Bearer ${API_TOKEN}" \
    -H "Content-Type: application/json" \
    -d '
    {
        "olm_operators": [{"name": "mce"}, {"name": "cnv"}], 1
    }
    ' | jq '.id'
    注意
    1
    指明要安装的 Operator。有效值包括 mcecnvlvmodf。要删除之前安装的 Operator,请从值列表中排除它。要删除之前所有安装的 Operator,请键入 "olm_operators": []

    输出示例

    {
      <various cluster properties>,
      "monitored_operators": [
        {
          "cluster_id": "b5259f97-be09-430e-b5eb-d78420ee509a",
          "name": "console",
          "operator_type": "builtin",
          "status_updated_at": "0001-01-01T00:00:00.000Z",
          "timeout_seconds": 3600
        },
        {
          "cluster_id": "b5259f97-be09-430e-b5eb-d78420ee509a",
          "name": "cvo",
          "operator_type": "builtin",
          "status_updated_at": "0001-01-01T00:00:00.000Z",
          "timeout_seconds": 3600
        },
        {
          "cluster_id": "b5259f97-be09-430e-b5eb-d78420ee509a",
          "name": "mce",
          "namespace": "multicluster-engine",
          "operator_type": "olm",
          "status_updated_at": "0001-01-01T00:00:00.000Z",
          "subscription_name": "multicluster-engine",
          "timeout_seconds": 3600
        },
        {
          "cluster_id": "b5259f97-be09-430e-b5eb-d78420ee509a",
          "name": "cnv",
          "namespace": "openshift-cnv",
          "operator_type": "olm",
          "status_updated_at": "0001-01-01T00:00:00.000Z",
          "subscription_name": "hco-operatorhub",
          "timeout_seconds": 3600
        },
        {
          "cluster_id": "b5259f97-be09-430e-b5eb-d78420ee509a",
          "name": "lvm",
          "namespace": "openshift-local-storage",
          "operator_type": "olm",
          "status_updated_at": "0001-01-01T00:00:00.000Z",
          "subscription_name": "local-storage-operator",
          "timeout_seconds": 4200
        }
      ],
      <more cluster properties>

    注意

    输出是新集群状态的描述。输出中的 monitored_operators 属性包含两个类型的 Operator:

    • "operator_type": "builtin" :此类型的 Operator 是 OpenShift Container Platform 的一部分。
    • "operator_type": "olm" :此类型的 Operator 由用户手动添加,或者因为依赖项自动添加。在示例中,自动添加 lso Operator,因为 cnv Operator 需要它。

第 7 章 配置发现镜像

Assisted Installer 使用初始镜像来运行在尝试安装 OpenShift Container Platform 前执行硬件和网络验证的代理。您可以使用 Ignition 自定义发现镜像。

注意

对发现镜像的修改不会在系统中保留。

7.1. 创建 Ignition 配置文件

Ignition 是一个低级系统配置实用程序,它是 initramfs 临时初始根文件系统的一部分。当 Ignition 在第一次引导时运行时,它会在 Ignition 配置文件中找到配置数据,并在调用 switch_root 之前将其应用到主机,以 pivot 到主机的根文件系统。

Ignition 使用 JSON 配置规格文件来代表第一次引导时发生的一组更改。

重要

不支持比 3.2 更新的 Ignition 版本,并引发一个错误。

流程

  1. 创建 Ignition 文件并指定配置规格版本:

    $ vim ~/ignition.conf
    {
      "ignition": { "version": "3.1.0" }
    }
  2. 将配置数据添加到 Ignition 文件。例如,为 core 用户添加密码。

    1. 生成密码哈希:

      $ openssl passwd -6
    2. core 用户中添加生成的密码哈希:

      {
        "ignition": { "version": "3.1.0" },
        "passwd": {
          "users": [
            {
              "name": "core",
              "passwordHash": "$6$spam$M5LGSMGyVD.9XOboxcwrsnwNdF4irpJdAWy.1Ry55syyUiUssIzIAHaOrUHr2zg6ruD8YNBPW9kW0H8EnKXyc1"
            }
          ]
        }
      }
  3. 保存 Ignition 文件并将其导出到 IGNITION_FILE 变量:

    $ export IGNITION_FILE=~/ignition.conf

7.2. 使用 Ignition 修改发现镜像

创建 Ignition 配置文件后,您可以使用 Assisted Installer API 修补基础架构环境来修改发现镜像。

先决条件

  • 如果您使用 UI 创建集群,则已设置 API 身份验证。
  • 您有一个基础架构环境,并将基础架构环境 id 导出至 INFRA_ENV_ID 变量。
  • 您有一个有效的 Ignition 文件,并将文件名导出为 $IGNITION_FILE

流程

  1. 创建 ignition_config_override JSON 对象并将其重定向到文件中:

    $ jq -n \
      --arg IGNITION "$(jq -c . $IGNITION_FILE)" \
      '{ignition_config_override: $IGNITION}' \
      > discovery_ignition.json
  2. 刷新 API 令牌:

    $ source refresh-token
  3. 对基础架构环境进行补丁:

    $ curl \
      --header "Authorization: Bearer $API_TOKEN" \
      --header "Content-Type: application/json" \
      -XPATCH \
      -d @discovery_ignition.json \
      https://api.openshift.com/api/assisted-install/v2/infra-envs/$INFRA_ENV_ID | jq

    ignition_config_override 对象引用 Ignition 文件。

  4. 下载更新的发现镜像。

第 8 章 使用发现镜像引导主机

Assisted Installer 使用初始镜像来运行在尝试安装 OpenShift Container Platform 前执行硬件和网络验证的代理。您可以使用三种方法使用发现镜像引导主机:

  • USB 驱动器
  • RedFish 虚拟介质
  • iPXE

8.1. 在 USB 驱动器中创建 ISO 镜像

您可以使用包含发现 ISO 镜像的 USB 驱动器安装 Assisted Installer 代理。使用 USB 驱动器启动主机为软件安装准备主机。

流程

  1. 在管理主机上,在 USB 端口中插入 USB 驱动器。
  2. 将 ISO 镜像复制到 USB 驱动器中,例如:

    # dd if=<path_to_iso> of=<path_to_usb> status=progress

    其中:

    <path_to_iso>
    是下载的发现 ISO 文件的相对路径,如 discovery.iso
    <path_to_usb>

    是连接的 USB 驱动器的位置,例如 /dev/sdb

    将 ISO 复制到 USB 驱动器后,您可以使用 USB 驱动器在集群主机上安装辅助安装程序代理。

8.2. 使用 USB 驱动器引导

要使用可引导 USB 驱动器将节点注册到 Assisted Installer,请使用以下步骤。

流程

  1. 将 RHCOS 发现 ISO USB 驱动器插入到目标主机中。
  2. 在服务器固件设置中配置启动驱动器顺序,以便从附加的发现 ISO 启动,然后重启服务器。
  3. 等待主机启动。

    1. 对于 UI 安装,在管理主机上返回浏览器。等待主机出现在已发现的主机列表中。
    2. 对于 API 安装,刷新令牌,检查启用的主机计数,并收集主机 ID:

      $ source refresh-token
      $ curl -s -X GET "https://api.openshift.com/api/assisted-install/v2/clusters/$CLUSTER_ID" \
      --header "Content-Type: application/json" \
        -H "Authorization: Bearer $API_TOKEN" \
      | jq '.enabled_host_count'
      $ curl -s -X GET "https://api.openshift.com/api/assisted-install/v2/clusters/$CLUSTER_ID" \
      --header "Content-Type: application/json" \
        -H "Authorization: Bearer $API_TOKEN" \
      | jq '.host_networks[].host_ids'

      输出示例

      [
        "1062663e-7989-8b2d-7fbb-e6f4d5bb28e5"
      ]

8.3. 使用 Redfish API 从 HTTP 托管 ISO 镜像引导

您可以使用 Redfish Baseboard Management Controller (BMC) API 安装的 ISO 来置备网络中的主机。

先决条件

  • 下载安装 Red Hat Enterprise Linux CoreOS (RHCOS) ISO。

流程

  1. 将 ISO 文件复制到网络中的 HTTP 服务器。
  2. 从托管 ISO 文件引导主机,例如:

    1. 运行以下命令调用 redfish API,将托管的 ISO 设置为 VirtualMedia 引导介质:

      $ curl -k -u <bmc_username>:<bmc_password> \
      -d '{"Image":"<hosted_iso_file>", "Inserted": true}' \
      -H "Content-Type: application/json" \
      -X POST <host_bmc_address>/redfish/v1/Managers/iDRAC.Embedded.1/VirtualMedia/CD/Actions/VirtualMedia.InsertMedia

      其中:

      <bmc_username>:<bmc_password>
      是目标主机 BMC 的用户名和密码。
      <hosted_iso_file>
      是托管安装 ISO 的 URL,例如:http://webserver.example.com/rhcos-live-minimal.iso。ISO 必须从目标主机机器中访问。
      <host_bmc_address>
      是目标主机计算机的 BMC IP 地址。
    2. 运行以下命令,将主机设置为从 VirtualMedia 设备引导:

      $ curl -k -u <bmc_username>:<bmc_password> \
      -X PATCH -H 'Content-Type: application/json' \
      -d '{"Boot": {"BootSourceOverrideTarget": "Cd", "BootSourceOverrideMode": "UEFI", "BootSourceOverrideEnabled": "Once"}}' \
      <host_bmc_address>/redfish/v1/Systems/System.Embedded.1
    3. 重启主机:

      $ curl -k -u <bmc_username>:<bmc_password> \
      -d '{"ResetType": "ForceRestart"}' \
      -H 'Content-type: application/json' \
      -X POST <host_bmc_address>/redfish/v1/Systems/System.Embedded.1/Actions/ComputerSystem.Reset
    4. 可选: 如果主机已关闭,您可以使用 {"ResetType": "On"} 开关引导它。运行以下命令:

      $ curl -k -u <bmc_username>:<bmc_password> \
      -d '{"ResetType": "On"}' -H 'Content-type: application/json' \
      -X POST <host_bmc_address>/redfish/v1/Systems/System.Embedded.1/Actions/ComputerSystem.Reset

8.4. 使用 iPXE 引导主机

Assisted Installer 提供了一个 iPXE 脚本,包括为基础架构环境引导发现镜像所需的所有工件。由于 iPXE 的当前 HTTPS 实施的限制,建议是下载并公开 HTTP 服务器中所需的工件。目前,即使 iPXE 支持 HTTPS 协议,支持的算法也比较旧且不推荐。

支持的密码的完整列表位于 https://ipxe.org/crypto 中。

先决条件

  • 您已使用 API 创建基础架构环境,或使用 UI 创建集群。
  • 在 shell 中将您的基础架构环境 ID 导出为 $INFRA_ENV_ID
  • 您在访问 API 时具有凭证,并在 shell 中将令牌导出为 $API_TOKEN
  • 您有一个 HTTP 服务器来托管镜像。
注意

通过 UI 配置时,$INFRA_ENV_ID$API_TOKEN 变量会被提供。

注意

IBM Power 只支持 PXE,这还需要: 您已在 /var/lib/tftpboot安装了 grub2。已安装了 DHCP 和 TFTP for PXE

流程

  1. 直接从 UI 下载 iPXE 脚本,或者从 Assisted Installer 获取 iPXE 脚本:

    $ curl \
      --silent \
      --header "Authorization: Bearer $API_TOKEN" \
      https://api.openshift.com/api/assisted-install/v2/infra-envs/$INFRA_ENV_ID/downloads/files?file_name=ipxe-script > ipxe-script

    示例

    #!ipxe
    initrd --name initrd http://api.openshift.com/api/assisted-images/images/<infra_env_id>/pxe-initrd?arch=x86_64&image_token=<token_string>&version=4.10
    kernel http://api.openshift.com/api/assisted-images/boot-artifacts/kernel?arch=x86_64&version=4.10 initrd=initrd coreos.live.rootfs_url=http://api.openshift.com/api/assisted-images/boot-artifacts/rootfs?arch=x86_64&version=4.10 random.trust_cpu=on rd.luks.options=discard ignition.firstboot ignition.platform.id=metal console=tty1 console=ttyS1,115200n8 coreos.inst.persistent-kargs="console=tty1 console=ttyS1,115200n8"
    boot

  2. 通过从 ipxe-script 中提取 URL 下载所需的工件。

    1. 下载初始 RAM 磁盘:

      $ awk '/^initrd /{print $NF}' ipxe-script | curl -o initrd.img
    2. 下载 linux 内核:

      $ awk '/^kernel /{print $2}' ipxe-script | curl -o kernel
    3. 下载根文件系统:

      $ grep ^kernel ipxe-script | xargs -n1| grep ^coreos.live.rootfs_url | cut -d = -f 2- | curl -o rootfs.img
  3. 将 URL 更改为 ipxe-script' 中不同的工件,以匹配本地 HTTP 服务器。例如:

    #!ipxe
    set webserver http://192.168.0.1
    initrd --name initrd $webserver/initrd.img
    kernel $webserver/kernel initrd=initrd coreos.live.rootfs_url=$webserver/rootfs.img random.trust_cpu=on rd.luks.options=discard ignition.firstboot ignition.platform.id=metal console=tty1 console=ttyS1,115200n8 coreos.inst.persistent-kargs="console=tty1 console=ttyS1,115200n8"
    boot
  4. 可选:当在 IBM zSystems 上使用 RHEL KVM 安装时,您必须通过指定附加内核参数来引导主机

    random.trust_cpu=on rd.luks.options=discard ignition.firstboot ignition.platform.id=metal console=tty1 console=ttyS1,115200n8 coreos.inst.persistent-kargs="console=tty1 console=ttyS1,115200n8
    注意

    如果您在 RHEL KVM 上使用 iPXE 安装,在一些情况下,虚拟机主机上的虚拟机不会在第一次引导时重启,需要手动启动。

  5. 可选:在 IBM Power 上安装时,您必须下载 intramfs、kernel 和 root,如下所示:

    1. 将 initrd.img 和 kernel.img 复制到 PXE 目录 '/var/lib/tftpboot/rhcos '
    2. 将 rootfs.img 复制到 HTTPD 目录 '/var/www/html/install '
    3. 在 '/var/lib/tftpboot/boot/grub2/grub.cfg ' 中添加以下条目:

      if [ ${net_default_mac} == fa:1d:67:35:13:20 ]; then
      default=0
      fallback=1
      timeout=1
      menuentry "CoreOS (BIOS)" {
      echo "Loading kernel"
      linux "/rhcos/kernel.img" ip=dhcp rd.neednet=1 ignition.platform.id=metal ignition.firstboot coreos.live.rootfs_url=http://9.114.98.8:8000/install/rootfs.img
      echo "Loading initrd"
      initrd "/rhcos/initrd.img"
      }
      fi

第 9 章 为主机分配角色

您可以为发现的主机分配角色。这些角色定义集群中主机的功能。角色可以是标准 Kubernetes 类型之一: control plane (master)worker

主机必须满足您选择的角色的最低要求。您可以通过引用本文档的先决条件部分或使用 preflight 要求 API 来查找硬件要求。

如果您没有选择角色,系统会为您选择一个。您可以在安装启动前随时更改角色。

9.1. 使用 UI 选择角色

您可以在主机完成其发现后选择角色。

流程

  1. 进入 Host Discovery 选项卡,向下滚动到 Host Inventory 表。
  2. 选择所需主机的 Auto-assign 下拉菜单。

    1. 选择 Control plane 节点 来为这个主机分配一个 control plane 角色。
    2. 选择 Worker 为这个主机分配一个 worker 角色。
  3. 检查验证状态。

9.2. 使用 API 选择一个角色

您可以使用 /v2/infra-envs/{infra_env_id}/hosts/{host_id} 端点为主机选择一个角色。主机可以是两个角色之一:

  • master: 带有 master 角色的一个主机,作为控制平面(control plane)主机。
  • worker: 带有 worker 角色的主机,作为 worker 主机。

默认情况下,辅助安装程序将主机设置为 auto-assign,这意味着安装程序将确定主机是否是 master 角色还是 worker 角色。使用这个流程设置主机的角色。

先决条件

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

流程

  1. 刷新 API 令牌:

    $ source refresh-token
  2. 获取主机 ID:

    $ curl -s -X GET "https://api.openshift.com/api/assisted-install/v2/clusters/$CLUSTER_ID" \
    --header "Content-Type: application/json" \
      -H "Authorization: Bearer $API_TOKEN" \
    | jq '.host_networks[].host_ids'

    输出示例

    [
      "1062663e-7989-8b2d-7fbb-e6f4d5bb28e5"
    ]

  3. 修改 host_role 设置:

    $ curl https://api.openshift.com/api/assisted-install/v2/infra-envs/${INFRA_ENV_ID}/hosts/<host_id> \
    -X PATCH \
    -H "Authorization: Bearer ${API_TOKEN}" \
    -H "Content-Type: application/json" \
    -d '
        {
          "host_role":"worker"
        }
    ' | jq

    <host_id> 替换为主机的 ID。

9.3. 自动分配角色

如果您没有自行分配角色,安装程序会自动为主机选择一个角色。角色选择机制决定主机的内存、CPU 和磁盘空间。它的目的是,为可以满足 control plane 节点的最低要求的 3 个弱主机分配 control plane 角色。所有其他主机默认为 worker 节点。目标是提供足够的资源来运行 control plane,并保留具有更多资源的主机用于运行实际工作负载。

您可以在安装前随时覆盖 auto-assign 决定。

这个验证可以确保,自动选择是一个有效的值。

9.4. 其他资源

先决条件

第 10 章 预安装验证

10.1. 预安装验证定义

Assisted Installer 旨在使集群安装尽可能简单、高效且无错误。Assisted Installer 在开始安装前对配置和收集的遥测执行验证检查。

Assisted Installer 将使用安装前提供的信息,如 control plane 拓扑、网络配置和主机名。它还将使用您要安装的主机的实时遥测。

当主机引导发现 ISO 时,代理将在主机上启动。代理会将主机状态的信息发送到 Assisted Installer。

Assisted Installer 使用所有这些信息来计算实时预安装验证。所有验证都可以是,阻止安装,或不阻塞安装。

10.2. 阻塞和不阻塞验证

阻塞验证将阻止安装的进度,这意味着您需要解决问题,并在继续操作前通过阻塞验证。

非阻塞验证只是一个警告,它会提示您可能导致问题的原因。

10.3. 验证类型

Assisted Installer 执行两种类型的验证:

主机

主机验证可确保给定主机的配置对安装有效。

集群

集群验证可确保整个集群的配置对安装有效。

10.4. 主机验证

10.4.1. 使用 REST API 获取主机验证

注意

如果您使用基于 Web 的 UI,则其中许多验证不会按名称显示。要获取与标签一致的验证列表,请使用以下步骤。

先决条件

  • 已安装 jq 工具。
  • 您已使用 API 创建基础架构环境,或使用 UI 创建集群。
  • 您的主机使用发现 ISO 引导
  • 在 shell 中以 CLUSTER_ID 的形式导出集群 ID。
  • 您在访问 API 时具有凭证,并在 shell 中导出令牌作为 API_TOKEN

流程

  1. 刷新 API 令牌:

    $ source refresh-token
  2. 获取所有主机的所有验证:

    $ curl \
      --silent \
      --header "Authorization: Bearer $API_TOKEN" \
      https://api.openshift.com/api/assisted-install/v2/clusters/$CLUSTER_ID/hosts \
      | jq -r .[].validations_info \
      | jq 'map(.[])'
  3. 获取所有主机的没有通过的验证:

    $ curl \
      --silent \
      --header "Authorization: Bearer $API_TOKEN" \
      https://api.openshift.com/api/assisted-install/v2/clusters/$CLUSTER_ID/hosts \
      | jq -r .[].validations_info \
      | jq 'map(.[]) | map(select(.status=="failure" or .status=="pending")) | select(length>0)'

10.4.2. 详细的主机验证

参数验证类型描述

connected

非阻塞

检查主机最近与 Assisted Installer 进行通信。

has-inventory

非阻塞

检查 Assisted Installer 是否从主机收到清单。

has-min-cpu-cores

非阻塞

检查 CPU 内核数是否满足最低要求。

has-min-memory

非阻塞

检查内存量是否满足最低要求。

has-min-valid-disks

非阻塞

检查至少一个可用磁盘是否满足资格标准。

has-cpu-cores-for-role

阻塞

检查内核数是否满足主机角色的最低要求。

has-memory-for-role

阻塞

检查内存量是否满足主机角色的最低要求。

ignition-downloadable

阻塞

对于第 2 天,检查主机是否可以从第 1 天集群中下载 ignition 配置。

belongs-to-majority-group

阻塞

大多数组是集群中最大的 full-mesh 连接组,所有成员都可以与所有其他成员通信。此验证检查多节点中的第 1 天集群在大多数组中。

valid-platform-network-settings

阻塞

检查平台是否对网络设置有效。

ntp-synced

非阻塞

检查 NTP 服务器是否已成功用于同步主机上的时间。

container-images-available

非阻塞

检查容器镜像是否已成功从镜像 registry 中拉取。

sufficient-installation-disk-speed

阻塞

检查磁盘是否加快了之前安装的指标满足要求(如果存在)。

sufficient-network-latency-requirement-for-role

阻塞

检查集群中主机之间的平均网络延迟是否满足要求。

sufficient-packet-loss-requirement-for-role

阻塞

检查集群中主机之间的网络数据包丢失是否满足要求。

has-default-route

阻塞

检查主机是否配置了默认路由。

api-domain-name-resolved-correctly

阻塞

对于带有用户管理网络的多节点集群。检查主机是否可以解析集群的 API 域名。

api-int-domain-name-resolved-correctly

阻塞

对于带有用户管理网络的多节点集群。检查主机是否可以解析集群的内部 API 域名。

apps-domain-name-resolved-correctly

阻塞

对于带有用户管理网络的多节点集群。检查主机是否可以解析集群的内部 apps 域名。

compatible-with-cluster-platform

非阻塞

检查主机是否与集群平台兼容

dns-wildcard-not-configured

阻塞

检查通配符 DNS *.<cluster_name>.<base_domain> 是否已配置,因为这会导致 OpenShift 的已知问题

disk-encryption-requirements-satisfied

非阻塞

检查配置的主机和磁盘加密的类型是否满足要求。

non-overlapping-subnets

阻塞

检查此主机没有重叠的子网。

hostname-unique

阻塞

检查主机名是否在集群中是唯一的。

hostname-valid

阻塞

检查主机名的有效性,这意味着它与常规主机名格式匹配且没有被禁止。

belongs-to-machine-cidr

阻塞

检查主机 IP 是否在机器 CIDR 的地址范围内。

lso-requirements-satisfied

阻塞

验证集群是否满足 Local Storage Operator 的要求。

odf-requirements-satisfied

阻塞

验证集群是否满足 Openshift Data Foundation Operator 的要求。

  • 集群至少有 3 个主机。
  • 集群只有 3 个 master 或至少 3 个 worker。
  • 集群有 3 个有资格的磁盘,每个主机都必须有合格的磁盘。
  • 对于有超过三个主机的集群,主机角色不能为 "Auto Assign"。

cnv-requirements-satisfied

阻塞

验证集群是否满足容器原生虚拟化的要求。

  • 主机的 BIOS 必须启用 CPU 虚拟化。
  • 主机必须具有足够的 CPU 内核和 RAM 用于容器原生虚拟化。
  • 如果需要,将验证 Host Path Provisioner。

lvm-requirements-satisfied

阻塞

验证集群是否满足逻辑卷管理器 Operator 的要求。

  • 主机至少有一个额外的空磁盘,没有分区且未被格式化。

vsphere-disk-uuid-enabled

非阻塞

验证每个有效磁盘是否将 disk.EnableUUID 设置为 true。在 VSphere 中,这将导致每个磁盘都有一个 UUID。

compatible-agent

阻塞

检查发现代理版本是否与代理 docker 镜像版本兼容。

no-skip-installation-disk

阻塞

检查安装磁盘是否没有跳过磁盘格式。

no-skip-missing-disk

阻塞

检查标记为跳过格式的所有磁盘是否在清单中。磁盘 ID 可能会在重启后改变,此验证可防止出现此问题的问题。

media-connected

阻塞

检查安装介质到主机的连接。

machine-cidr-defined

非阻塞

检查集群是否存在机器网络定义。

id-platform-network-settings

阻塞

检查平台是否与网络设置兼容。只有安装单节点 Openshift 或使用用户管理时,某些平台才被允许。

10.5. 集群验证

10.5.1. 使用 REST API 获取集群验证

注意:如果您使用基于 Web 的 UI,则其中许多验证不会按名称显示。要获取与标签一致的验证列表,请使用以下步骤。

先决条件

  • 已安装 jq 工具。
  • 您已使用 API 创建基础架构环境,或使用 UI 创建集群。
  • 在 shell 中以 CLUSTER_ID 的形式导出集群 ID。
  • 您在访问 API 时具有凭证,并在 shell 中导出令牌作为 API_TOKEN

流程

  1. 刷新 API 令牌:

    $ source refresh-token
  2. 获取所有集群验证:

    $ curl \
      --silent \
      --header "Authorization: Bearer $API_TOKEN" \
      https://api.openshift.com/api/assisted-install/v2/clusters/$CLUSTER_ID \
      | jq -r .validations_info \
      | jq 'map(.[])'
  3. 获取没有通过的集群验证:

    $ curl \
      --silent \
      --header "Authorization: Bearer $API_TOKEN" \
      https://api.openshift.com/api/assisted-install/v2/clusters/$CLUSTER_ID \
      | jq -r .validations_info \
      | jq '. | map(.[] | select(.status=="failure" or .status=="pending")) | select(length>0)'

10.5.2. 详细的集群验证

参数验证类型描述

machine-cidr-defined

非阻塞

检查集群是否存在机器网络定义。

cluster-cidr-defined

非阻塞

检查集群是否存在集群网络定义。

service-cidr-defined

非阻塞

检查集群是否存在服务网络定义。

no-cidrs-overlapping

阻塞

检查定义的网络没有重叠。

networks-same-address-families

阻塞

检查定义的网络是否共享相同的地址系列 (有效地址系列为 IPv4、IPv6)

network-prefix-valid

阻塞

检查集群网络前缀,以确保其有效,并为所有主机有足够的地址空间。

machine-cidr-equals-to-calculated-cidr

阻塞

对于非用户管理的网络集群。检查 apiVIPsingressVIPs 是否是机器 CIDR 的成员(如果存在)。

api-vips-defined

非阻塞

对于非用户管理的网络集群。检查 apiVIPs 是否存在。

api-vips-valid

阻塞

对于非用户管理的网络集群。检查 apiVIPs 是否属于机器 CIDR,且没有使用。

ingress-vips-defined

阻塞

对于非用户管理的网络集群。检查 ingressVIPs 是否存在。

ingress-vips-valid

非阻塞

对于非用户管理的网络集群。检查 ingressVIPs 是否属于机器 CIDR,且没有使用。

all-hosts-are-ready-to-install

阻塞

检查集群中的所有主机是否处于 "ready to install" 状态。

sufficient-masters-count

阻塞

此验证只适用于多节点集群。

  • 集群必须有三个 master。
  • 如果集群有 worker 节点,则至少必须存在 2 个 worker 节点。

dns-domain-defined

非阻塞

检查集群是否存在基本 DNS 域。

pull-secret-set

非阻塞

检查 pull secret 存在。不会检查 pull secret 是否有效或被授权。

ntp-server-configured

阻塞

检查每个主机的时钟与其他主机的时钟没有进行同步的时间不超过 4 分钟。

lso-requirements-satisfied

阻塞

验证集群是否满足 Local Storage Operator 的要求。

odf-requirements-satisfied

阻塞

验证集群是否满足 Openshift Data Foundation Operator 的要求。

  • 集群至少有 3 个主机。
  • 集群只有 3 个 master 或至少 3 个 worker。
  • 集群有 3 个有资格的磁盘,每个主机都必须有合格的磁盘。

cnv-requirements-satisfied

阻塞

验证集群是否满足容器原生虚拟化的要求。

  • 集群的 CPU 架构是 x86

lvm-requirements-satisfied

阻塞

验证集群是否满足逻辑卷管理器 Operator 的要求。

  • 集群必须是单一节点。
  • 集群必须运行 Openshift >= 4.11.0。

network-type-valid

阻塞

检查网络类型的有效性(如果存在)。

  • 网络类型必须是 OpenshiftSDN 或 OVNKubernetes。
  • OpenShiftSDN 不支持 IPv6 或单节点 Openshift。
  • OVNKubernetes 不支持 VIP DHCP 分配。

第 11 章 网络配置

这部分论述了使用 Assisted Installer 进行网络配置的基础知识。

11.1. 集群网络

OpenShift 使用各种网络类型和地址,并在下表中列出。

类型DNS描述

clusterNetwork

 

从中分配 Pod IP 地址的 IP 地址池。

serviceNetwork

 

服务的 IP 地址池。

machineNetwork

 

组成集群的机器的 IP 地址块。

apiVIP

api.<clustername.clusterdomain>

用于 API 通信的 VIP。这个设置必须提供,或者在 DNS 中预先配置,以便正确解析默认名称。如果要使用双栈网络部署,则必须是 IPv4 地址。

apiVIPs

api.<clustername.clusterdomain>

用于 API 通信的 VIP。这个设置必须提供,或者在 DNS 中预先配置,以便正确解析默认名称。如果使用双栈网络,则第一个地址必须是 IPv4 地址,第二个地址必须是 IPv6 地址。您还必须设置 apiVIP 设置。

ingressVIP

*.apps.<clustername.clusterdomain>

用于入口流量的 VIP。如果要使用双栈网络部署,则必须是 IPv4 地址。

ingressVIPs

*.apps.<clustername.clusterdomain>

用于入口流量的 VIP。如果您使用双栈网络部署,则第一个地址必须是 IPv4 地址,第二个地址必须是 IPv6 地址。您还必须设置 ingressVIP 设置。

注意

OpenShift Container Platform 4.12 引入了新的 apiVIPsingressVIPs 设置,用于接受双栈网络的多个 IP 地址。使用双栈网络时,第一个 IP 地址必须是 IPv4 地址,第二个 IP 地址必须是 IPv6 地址。新设置将替换 apiVIPIngressVIP,但在使用 API 修改配置时,您必须同时设置新的和旧设置。

根据所需的网络堆栈,您可以选择不同的网络接口控制器。目前,辅助服务可以使用以下配置之一部署 OpenShift Container Platform 集群:

  • IPv4
  • IPv6
  • 双栈 (IPv4 + IPv6)

支持的网络接口控制器取决于所选的堆栈,并在下表中总结。如需详细的 Container Network Interface (CNI)网络供应商功能比较,请参阅 OCP 网络文档

堆栈SDNOVN

IPv4

IPv6

dual-stack

注意

OVN 是 OpenShift Container Platform 4.12 及更新的版本中的默认 Container Network Interface (CNI)。

11.1.1. 限制

11.1.1.1. SDN

  • 使用单节点 OpenShift (SNO) 时,不支持 SDN 控制器。
  • SDN 控制器不支持 IPv6。

11.1.1.2. OVN-Kubernetes

请参阅 OCP 文档中的 OVN-Kubernetes 限制部分

11.1.2. 集群网络

集群网络是一个网络,集群中部署的每个 Pod 都从中获取其 IP 地址。如果工作负载可以在组成集群的多个节点间存在,因此网络供应商可以根据 Pod 的 IP 地址轻松查找单个节点。为此,clusterNetwork.cidr 被进一步分成 clusterNetwork.hostPrefix 中定义的大小的子网。

主机前缀指定分配给集群中每个节点的子网的长度。集群如何为多节点集群分配地址的示例:

---
  clusterNetwork:
  - cidr: 10.128.0.0/14
    hostPrefix: 23
---

使用上述代码片段创建 3 节点集群可以创建以下网络拓扑:

  • 在节点 #1 中调度的 Pod 从 10.128.0.0/23 获取 IP
  • 在节点 #2 中调度的 Pod 从 10.128.2.0/23 获取 IP
  • 在节点 #3 中调度的 Pod 从 10.128.4.0/23 获取 IP

解释 OVN-K8s 超出了本文档的范围,但上述的模式提供了在不同节点之间路由 Pod 到Pod 流量的方法,而无需保留 Pod 和对应节点之间的大量映射列表。

11.1.3. 机器网络

机器网络是由组成集群用来相互通信的所有主机使用的网络。这也是必须包括 API 和 Ingress VIP 的子网。

11.1.4. 与多节点集群相比的 SNO

取决于您要部署单节点 OpenShift 还是多节点集群,需要使用不同的值。下表更详细地说明了这一点。

参数SNO使用 DHCP 模式的多节点集群没有 DHCP 模式的多节点集群

clusterNetwork

必填

必填

必填

serviceNetwork

必填

必填

必填

machineNetwork

可以自动分配 (*)

可以自动分配 (*)

可以自动分配 (*)

apiVIP

禁止

禁止

必填

apiVIPs

禁止

禁止

4.12 及更新的版本需要

ingressVIP

禁止

禁止

必填

ingressVIPs

禁止

禁止

4.12 及更新的版本需要

如果只有一个主机网络,则机器网络 CIDR 的自动分配。否则,您需要明确指定它。

11.1.5. air-gapped 环境

在没有互联网访问的情况下部署集群的工作流有一些超出本文档范围的先决条件。您可以参阅 Zero Touch Provisioning the hard way Git repository 以了解更多信息。

11.2. DHCP VIP 分配

VIP DHCP 分配是允许用户跳过为 API 和 Ingress 手动提供虚拟 IP 和 Ingress 的要求,利用服务从 DHCP 服务器自动分配这些 IP 地址。

如果您启用这个功能,而不是使用来自集群配置的 api_vipsingress_vips,服务会发送租期分配请求,并根据回复相应地使用 VIP。该服务将从 Machine Network 分配 IP 地址。

请注意,这不是 OpenShift Container Platform 功能,它已在辅助服务中实施,以简化配置。

11.2.1. 启用自动分配的有效负载示例

---
{
  "vip_dhcp_allocation": true,
  "network_type": "OVNKubernetes",
  "user_managed_networking": false,
  "cluster_networks": [
    {
      "cidr": "10.128.0.0/14",
      "host_prefix": 23
    }
  ],
  "service_networks": [
    {
      "cidr": "172.30.0.0/16"
    }
  ],
  "machine_networks": [
    {
      "cidr": "192.168.127.0/24"
    }
  ]
}
---

11.2.2. 禁用自动分配的有效负载示例

---
{
  "api_vip": "192.168.127.100",
  "api_vips": [
    {
        "ip": "192.168.127.100"
    }
  ],
  "ingress_vip": "192.168.127.101",
  "ingress_vips": [
    {
        "ip": "192.168.127.101"
    }
  ],
  "vip_dhcp_allocation": false,
  "network_type": "OVNKubernetes",
  "user_managed_networking": false,
  "cluster_networks": [
    {
      "cidr": "10.128.0.0/14",
      "host_prefix": 23
    }
  ],
  "service_networks": [
    {
      "cidr": "172.30.0.0/16"
    }
  ]
}
---
注意

在 OpenShift Container Platform 4.12 中,您必须同时设置旧的 api_vipingress_vip 设置,以及新的 api_vipsingress_vips 设置。

11.3. 其他资源

11.4. 了解用户管理的网络和集群管理网络之间的区别

用户管理的网络是 Assisted Installer 中的一项功能,它允许具有非标准网络拓扑的客户部署 OpenShift Container Platform 集群。示例包括:

  • 具有不需要使用 keepalived 和 VRRP 处理 VIP 地址的外部负载均衡器的客户。
  • 使用在许多不同 L2 网络片段间分布的集群节点部署。

11.4.1. 验证

在允许安装启动前,辅助安装程序中会发生各种网络验证。当您启用用户管理的网络时,以下验证更改:

  • L3 连接检查 (ICMP) 被执行,而不是 L2 检查 (ARP)

11.5. 静态网络配置

您可以在生成或更新发现 ISO 时使用静态网络配置。

11.5.1. 先决条件

11.5.2. NMState 配置

YAML 格式的 NMState 文件指定主机所需的网络配置。它具有在发现时将替换为接口的实际名称的接口的逻辑名称。

11.5.2.1. NMState 配置示例

---
dns-resolver:
  config:
    server:
    - 192.168.126.1
interfaces:
- ipv4:
    address:
    - ip: 192.168.126.30
      prefix-length: 24
    dhcp: false
    enabled: true
  name: eth0
  state: up
  type: ethernet
- ipv4:
    address:
    - ip: 192.168.141.30
      prefix-length: 24
    dhcp: false
    enabled: true
  name: eth1
  state: up
  type: ethernet
routes:
  config:
  - destination: 0.0.0.0/0
    next-hop-address: 192.168.126.1
    next-hop-interface: eth0
    table-id: 254
---

11.5.3. MAC 接口映射

MAC 接口映射是一个属性,它使用主机上的实际接口映射 NMState 配置中定义的逻辑接口。

映射应始终使用主机上的物理接口。例如,当 NMState 配置定义了绑定或 VLAN 时,映射应该只包含父接口的条目。

11.5.3.1. MAC 接口映射示例

---
mac_interface_map: [
    {
      mac_address: 02:00:00:2c:23:a5,
      logical_nic_name: eth0
    },
    {
      mac_address: 02:00:00:68:73:dc,
      logical_nic_name: eth1
    }
]
---

11.5.4. 额外的 NMState 配置示例

以下示例仅用于显示部分配置。您不应该原样使用它们,而是根据您的具体环境对它们进行相应的调整。如果使用错误,可能会导致您的机器没有网络连接。

11.5.4.1. 标记的 VLAN

---
    interfaces:
    - ipv4:
        address:
        - ip: 192.168.143.15
          prefix-length: 24
        dhcp: false
        enabled: true
      ipv6:
        enabled: false
      name: eth0.404
      state: up
      type: vlan
      vlan:
        base-iface: eth0
        id: 404
---

11.5.4.2. 网络绑定

---
    interfaces:
    - ipv4:
        address:
        - ip: 192.168.138.15
          prefix-length: 24
        dhcp: false
        enabled: true
      ipv6:
        enabled: false
      link-aggregation:
        mode: active-backup
        options:
          all_slaves_active: delivered
          miimon: "140"
        slaves:
        - eth0
        - eth1
      name: bond0
      state: up
      type: bond
---

11.6. 使用 API 应用静态网络配置

您可以使用 Assisted Installer API 应用静态网络配置。

先决条件

  1. 您已使用 API 创建基础架构环境,或者已使用 UI 创建集群。
  2. 在 shell 中将您的基础架构环境 ID 导出为 $INFRA_ENV_ID
  3. 您在访问 API 时具有凭证,并在 shell 中将令牌导出为 $API_TOKEN
  4. 您有带有静态网络配置的 YAML 文件,作为 server-a.yamlserver-b.yaml

流程

  1. 使用 API 请求创建一个临时文件 /tmp/request-body.txt

    ---
    jq -n --arg NMSTATE_YAML1 "$(cat server-a.yaml)" --arg NMSTATE_YAML2 "$(cat server-b.yaml)" \
    '{
      "static_network_config": [
        {
          "network_yaml": $NMSTATE_YAML1,
          "mac_interface_map": [{"mac_address": "02:00:00:2c:23:a5", "logical_nic_name": "eth0"}, {"mac_address": "02:00:00:68:73:dc", "logical_nic_name": "eth1"}]
        },
        {
          "network_yaml": $NMSTATE_YAML2,
          "mac_interface_map": [{"mac_address": "02:00:00:9f:85:eb", "logical_nic_name": "eth1"}, {"mac_address": "02:00:00:c8:be:9b", "logical_nic_name": "eth0"}]
         }
      ]
    }' >> /tmp/request-body.txt
    ---
  2. 刷新 API 令牌:

    $ source refresh-token
  3. 将请求发送到 Assisted Service API 端点:

    ---
    curl -H "Content-Type: application/json" \
    -X PATCH -d @/tmp/request-body.txt \
    -H "Authorization: Bearer ${API_TOKEN}" \
    https://api.openshift.com/api/assisted-install/v2/infra-envs/$INFRA_ENV_ID
    ---

11.7. 其他资源

11.8. 转换为双栈网络

双栈 IPv4/IPv6 配置允许部署驻留在 IPv4 和 IPv6 子网中的 pod 的集群。

11.8.1. 先决条件

11.8.2. 单一节点 OpenShift 的有效负载示例

---
{
  "network_type": "OVNKubernetes",
  "user_managed_networking": false,
  "cluster_networks": [
    {
      "cidr": "10.128.0.0/14",
      "host_prefix": 23
    },
    {
      "cidr": "fd01::/48",
      "host_prefix": 64
    }
  ],
  "service_networks": [
    {"cidr": "172.30.0.0/16"}, {"cidr": "fd02::/112"}
  ],
  "machine_networks": [
    {"cidr": "192.168.127.0/24"},{"cidr": "1001:db8::/120"}
  ]
}
---

11.8.3. 由多个节点组成的 OpenShift Container Platform 集群的有效负载示例

---
{
  "vip_dhcp_allocation": false,
  "network_type": "OVNKubernetes",
  "user_managed_networking": false,
  "api_vip": "192.168.127.100",
  "api_vips": [
     {
        "ip": "192.168.127.100"
     },
     {
        "ip": "2001:0db8:85a3:0000:0000:8a2e:0370:7334"
     }
  ],
  "ingress_vip": "192.168.127.101",
  "ingress_vips": [
     {
        "ip": "192.168.127.101"
     },
     {
        "ip": "2001:0db8:85a3:0000:0000:8a2e:0370:7335"
     }
  ],
  "cluster_networks": [
    {
      "cidr": "10.128.0.0/14",
      "host_prefix": 23
    },
    {
      "cidr": "fd01::/48",
      "host_prefix": 64
    }
  ],
  "service_networks": [
    {"cidr": "172.30.0.0/16"}, {"cidr": "fd02::/112"}
  ],
  "machine_networks": [
    {"cidr": "192.168.127.0/24"},{"cidr": "1001:db8::/120"}
  ]
}
---

11.8.4. 限制

在使用双栈网络时,api_vip IP 地址和 ingress_vip IP 地址设置必须是主 IP 地址系列,该网络必须是 IPv4 地址。目前,红帽不支持将 IPv6 作为主要 IP 地址系列的双栈 VIP 或双栈网络。红帽支持双栈网络,并将 IPv4 作为主要 IP 地址系列,以及 IPv6 作为辅助 IP 地址系列。因此,在输入 IP 地址值时,您必须在 IPv6 条目前面放置 IPv4 条目。

在 OpenShift Container Platform 4.12 中,如果要在 VIP 地址上使用双栈网络,则必须同时设置旧的 api_vipingress_vips 设置,以及新的 api_vipsingress_vips 设置。由于旧的 api_vipingress_vip 设置各自仅有一个值,所以它们必须是 IPv4 地址。

11.9. 其他资源

第 12 章 扩展集群

您可以使用用户界面或 API 添加主机来扩展使用 Assisted Installer 安装的集群。

12.1. 先决条件

  • 您必须有权访问辅助安装程序集群。
  • 您必须安装 OpenShift CLI (oc)。
  • 确保将 worker 节点添加到集群中的集群需要的所有 DNS 记录。
  • 如果要将 worker 节点添加到具有多个 CPU 架构的集群,您必须确保该架构被设置为 multi

12.2. 检查多个构架

将节点添加到具有多个架构的集群时,请确保将 architecture 设置设置为 multi

流程

  1. 使用 CLI 登录集群。
  2. 检查 architecture 设置:

    $ oc adm release info -o json | jq .metadata.metadata

    确保 architecture 设置设为 'multi'。

    {
      "release.openshift.io/architecture": "multi"
    }

12.3. 使用 UI 添加主机

您可以将主机添加到使用 Assisted Installer 创建的集群。

重要

只有在运行 OpenShift Container Platform 版本 4.11 及 up 的集群才支持将主机添加到 Assisted Installer 集群。

流程

  1. 登录 OpenShift Cluster Manager,再点您要扩展的集群。
  2. Add hosts 并下载新主机的发现 ISO,添加 SSH 公钥并根据需要配置集群范围的代理设置。
  3. 可选:根据需要修改 ignition 文件。
  4. 使用发现 ISO 引导目标主机,并等待在控制台中发现主机。
  5. 选择主机角色。它可以是 workercontrol plane 主机。
  6. 开始安装。
  7. 当安装继续进行时,安装会为主机生成待处理的证书签名请求 (CSR)。出现提示时,批准待处理的 CSR 以完成安装。

    当主机成功安装后,它将在集群 web 控制台中被列为一个主机。

重要

新的主机将使用与原始集群相同的方法进行加密。

12.4. 使用 API 添加主机

您可以使用 Assisted Installer REST API 将主机添加到集群。

先决条件

  • 安装 OpenShift Cluster Manager CLI (ocm)。
  • 以具有集群创建权限的用户身份登录 OpenShift Cluster Manager
  • 安装 jq
  • 确保您要扩展的集群存在所有必需的 DNS 记录。

流程

  1. 针对 Assisted Installer REST API 进行身份验证,并为会话生成 API 令牌。生成的令牌有效期仅为 15 分钟。
  2. 运行以下命令设置 $API_URL 变量:

    $ export API_URL=<api_url> 1
    1
    <api_url> 替换为 Assisted Installer API URL,例如 https://api.openshift.com
  3. 运行以下命令导入集群:

    1. 设置 $CLUSTER_ID 变量。登录到集群并运行以下命令:

      $ export CLUSTER_ID=$(oc get clusterversion -o jsonpath='{.items[].spec.clusterID}')
    2. 设置用于导入集群的 $CLUSTER_REQUEST 变量:

      $ export CLUSTER_REQUEST=$(jq --null-input --arg openshift_cluster_id "$CLUSTER_ID" '{
        "api_vip_dnsname": "<api_vip>", 1
        "openshift_cluster_id": $CLUSTER_ID,
        "name": "<openshift_cluster_name>" 2
      }')
      1
      <api_vip> 替换为集群 API 服务器的主机名。这可以是 API 服务器的 DNS 域,也可以是主机可访问的单一节点的 IP 地址。例如: api.compute-1.example.com
      2
      <openshift_cluster_name> 替换为集群的纯文本名称。集群名称应与在第 1 天集群安装过程中设置的集群名称匹配。
    3. 导入集群并设置 $CLUSTER_ID 变量。运行以下命令:

      $ CLUSTER_ID=$(curl "$API_URL/api/assisted-install/v2/clusters/import" -H "Authorization: Bearer ${API_TOKEN}" -H 'accept: application/json' -H 'Content-Type: application/json' \
        -d "$CLUSTER_REQUEST" | tee /dev/stderr | jq -r '.id')
  4. 运行以下命令,为集群生成 InfraEnv 资源并设置 $INFRA_ENV_ID 变量:

    1. 从位于 console.redhat.com 的 Red Hat OpenShift Cluster Manager 下载 pull secret 文件。
    2. 设置 $INFRA_ENV_REQUEST 变量:

      export INFRA_ENV_REQUEST=$(jq --null-input \
          --slurpfile pull_secret <path_to_pull_secret_file> \1
          --arg ssh_pub_key "$(cat <path_to_ssh_pub_key>)" \2
          --arg cluster_id "$CLUSTER_ID" '{
        "name": "<infraenv_name>", 3
        "pull_secret": $pull_secret[0] | tojson,
        "cluster_id": $cluster_id,
        "ssh_authorized_key": $ssh_pub_key,
        "image_type": "<iso_image_type>" 4
      }')
      1
      <path_to_pull_secret_file> 替换为在 console.redhat.com 上从 Red Hat OpenShift Cluster Manager 下载的 pull secret 的本地文件的路径。
      2
      <path_to_ssh_pub_key> 替换为访问主机所需的公共 SSH 密钥路径。如果没有设置这个值,则无法在发现模式下访问主机。
      3
      <infraenv_name> 替换为 InfraEnv 资源的纯文本名称。
      4
      <iso_image_type> 替换为 ISO 镜像类型,可以是 full-isominimal-iso
    3. $INFRA_ENV_REQUEST 发布到 /v2/infra-envs API,并设置 $INFRA_ENV_ID 变量:

      $ INFRA_ENV_ID=$(curl "$API_URL/api/assisted-install/v2/infra-envs" -H "Authorization: Bearer ${API_TOKEN}" -H 'accept: application/json' -H 'Content-Type: application/json' -d "$INFRA_ENV_REQUEST" | tee /dev/stderr | jq -r '.id')
  5. 运行以下命令,获取集群主机的发现 ISO 的 URL:

    $ curl -s "$API_URL/api/assisted-install/v2/infra-envs/$INFRA_ENV_ID" -H "Authorization: Bearer ${API_TOKEN}" | jq -r '.download_url'

    输出示例

    https://api.openshift.com/api/assisted-images/images/41b91e72-c33e-42ee-b80f-b5c5bbf6431a?arch=x86_64&image_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NTYwMjYzNzEsInN1YiI6IjQxYjkxZTcyLWMzM2UtNDJlZS1iODBmLWI1YzViYmY2NDMxYSJ9.1EX_VGaMNejMhrAvVRBS7PDPIQtbOOc8LtG8OukE1a4&type=minimal-iso&version=4.12

  6. 下载 ISO:

    $ curl -L -s '<iso_url>' --output rhcos-live-minimal.iso 1
    1
    <iso_url> 替换为上一步中的 ISO URL。
  7. 从下载的 rhcos-live-minimal.iso 中引导新的 worker 主机。
  8. 获取没有安装的集群中的主机列表。继续运行以下命令,直到新主机显示:

    $ curl -s "$API_URL/api/assisted-install/v2/clusters/$CLUSTER_ID" -H "Authorization: Bearer ${API_TOKEN}" | jq -r '.hosts[] | select(.status != "installed").id'

    输出示例

    2294ba03-c264-4f11-ac08-2f1bb2f8c296

  9. 为新主机设置 $HOST_ID 变量,例如:

    $ HOST_ID=<host_id> 1
    1
    <host_id> 替换为上一步中的主机 ID。
  10. 运行以下命令检查主机是否已就绪:

    注意

    确保复制整个命令,包括完整的 jq 表达式。

    $ curl -s $API_URL/api/assisted-install/v2/clusters/$CLUSTER_ID -H "Authorization: Bearer ${API_TOKEN}" | jq '
    def host_name($host):
        if (.suggested_hostname // "") == "" then
            if (.inventory // "") == "" then
                "Unknown hostname, please wait"
            else
                .inventory | fromjson | .hostname
            end
        else
            .suggested_hostname
        end;
    
    def is_notable($validation):
        ["failure", "pending", "error"] | any(. == $validation.status);
    
    def notable_validations($validations_info):
        [
            $validations_info // "{}"
            | fromjson
            | to_entries[].value[]
            | select(is_notable(.))
        ];
    
    {
        "Hosts validations": {
            "Hosts": [
                .hosts[]
                | select(.status != "installed")
                | {
                    "id": .id,
                    "name": host_name(.),
                    "status": .status,
                    "notable_validations": notable_validations(.validations_info)
                }
            ]
        },
        "Cluster validations info": {
            "notable_validations": notable_validations(.validations_info)
        }
    }
    ' -r

    输出示例

    {
      "Hosts validations": {
        "Hosts": [
          {
            "id": "97ec378c-3568-460c-bc22-df54534ff08f",
            "name": "localhost.localdomain",
            "status": "insufficient",
            "notable_validations": [
              {
                "id": "ntp-synced",
                "status": "failure",
                "message": "Host couldn't synchronize with any NTP server"
              },
              {
                "id": "api-domain-name-resolved-correctly",
                "status": "error",
                "message": "Parse error for domain name resolutions result"
              },
              {
                "id": "api-int-domain-name-resolved-correctly",
                "status": "error",
                "message": "Parse error for domain name resolutions result"
              },
              {
                "id": "apps-domain-name-resolved-correctly",
                "status": "error",
                "message": "Parse error for domain name resolutions result"
              }
            ]
          }
        ]
      },
      "Cluster validations info": {
        "notable_validations": []
      }
    }

  11. 当上一个命令显示主机就绪时,通过运行以下命令来使用 /v2/infra-envs/{infra_env_id}/hosts/{host_id}/actions/install API 开始安装:

    $ curl -X POST -s "$API_URL/api/assisted-install/v2/infra-envs/$INFRA_ENV_ID/hosts/$HOST_ID/actions/install"  -H "Authorization: Bearer ${API_TOKEN}"
  12. 当安装继续进行时,安装会为主机生成待处理的证书签名请求 (CSR)。

    重要

    您必须批准 CSR 才能完成安装。

    运行以下 API 调用以监控集群安装:

    $ curl -s "$API_URL/api/assisted-install/v2/clusters/$CLUSTER_ID" -H "Authorization: Bearer ${API_TOKEN}" | jq '{
        "Cluster day-2 hosts":
            [
                .hosts[]
                | select(.status != "installed")
                | {id, requested_hostname, status, status_info, progress, status_updated_at, updated_at, infra_env_id, cluster_id, created_at}
            ]
    }'

    输出示例

    {
      "Cluster day-2 hosts": [
        {
          "id": "a1c52dde-3432-4f59-b2ae-0a530c851480",
          "requested_hostname": "control-plane-1",
          "status": "added-to-existing-cluster",
          "status_info": "Host has rebooted and no further updates will be posted. Please check console for progress and to possibly approve pending CSRs",
          "progress": {
            "current_stage": "Done",
            "installation_percentage": 100,
            "stage_started_at": "2022-07-08T10:56:20.476Z",
            "stage_updated_at": "2022-07-08T10:56:20.476Z"
          },
          "status_updated_at": "2022-07-08T10:56:20.476Z",
          "updated_at": "2022-07-08T10:57:15.306369Z",
          "infra_env_id": "b74ec0c3-d5b5-4717-a866-5b6854791bd3",
          "cluster_id": "8f721322-419d-4eed-aa5b-61b50ea586ae",
          "created_at": "2022-07-06T22:54:57.161614Z"
        }
      ]
    }

  13. 可选: 运行以下命令以查看集群的所有事件:

    $ curl -s "$API_URL/api/assisted-install/v2/events?cluster_id=$CLUSTER_ID" -H "Authorization: Bearer ${API_TOKEN}" | jq -c '.[] | {severity, message, event_time, host_id}'

    输出示例

    {"severity":"info","message":"Host compute-0: updated status from insufficient to known (Host is ready to be installed)","event_time":"2022-07-08T11:21:46.346Z","host_id":"9d7b3b44-1125-4ad0-9b14-76550087b445"}
    {"severity":"info","message":"Host compute-0: updated status from known to installing (Installation is in progress)","event_time":"2022-07-08T11:28:28.647Z","host_id":"9d7b3b44-1125-4ad0-9b14-76550087b445"}
    {"severity":"info","message":"Host compute-0: updated status from installing to installing-in-progress (Starting installation)","event_time":"2022-07-08T11:28:52.068Z","host_id":"9d7b3b44-1125-4ad0-9b14-76550087b445"}
    {"severity":"info","message":"Uploaded logs for host compute-0 cluster 8f721322-419d-4eed-aa5b-61b50ea586ae","event_time":"2022-07-08T11:29:47.802Z","host_id":"9d7b3b44-1125-4ad0-9b14-76550087b445"}
    {"severity":"info","message":"Host compute-0: updated status from installing-in-progress to added-to-existing-cluster (Host has rebooted and no further updates will be posted. Please check console for progress and to possibly approve pending CSRs)","event_time":"2022-07-08T11:29:48.259Z","host_id":"9d7b3b44-1125-4ad0-9b14-76550087b445"}
    {"severity":"info","message":"Host: compute-0, reached installation stage Rebooting","event_time":"2022-07-08T11:29:48.261Z","host_id":"9d7b3b44-1125-4ad0-9b14-76550087b445"}

  14. 登录到集群并批准待处理的 CSR 以完成安装。

验证

  • 检查新主机是否已成功添加到集群中,状态为 Ready

    $ oc get nodes

    输出示例

    NAME                           STATUS   ROLES           AGE   VERSION
    control-plane-1.example.com    Ready    master,worker   56m   v1.25.0
    compute-1.example.com          Ready    worker          11m   v1.25.0

12.5. 在一个健康的集群中安装主 control plane 节点

此流程描述了如何在健康的 OpenShift Container Platform 集群上安装主 control plane 节点。

如果集群不健康,则在管理前需要额外的操作。如需更多信息,请参阅在不健康集群中安装主 control plane 节点

先决条件

  • 使用正确的 etcd-operator 版本使用 OpenShift Container Platform 4.11 或更新版本。
  • 已安装至少三个节点的健康集群。
  • 您已将 role: master 分配给 一个节点。

流程

  1. 检查并批准 CSR

    1. 检查 CertificateSigningRequests (CSR):

      $ oc get csr | grep Pending

      输出示例

      csr-5sd59   8m19s   kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Pending
      csr-xzqts   10s     kubernetes.io/kubelet-serving                 system:node:worker-6                                                   <none>              Pending

    2. 批准所有待处理的 CSR:

      $ oc get csr -o go-template='{{range .items}}{{if not .status}}{{.metadata.name}}{{"\n"}}{{end}}{{end}}' | xargs --no-run-if-empty oc adm certificate approve
      重要

      您必须批准 CSR 才能完成安装。

  2. 确认主节点处于 Ready 状态:

    $ oc get nodes

    输出示例

    NAME       STATUS   ROLES    AGE     VERSION
    master-0   Ready    master   4h42m   v1.24.0+3882f8f
    worker-1   Ready    worker   4h29m   v1.24.0+3882f8f
    master-2   Ready    master   4h43m   v1.24.0+3882f8f
    master-3   Ready    master   4h27m   v1.24.0+3882f8f
    worker-4   Ready    worker   4h30m   v1.24.0+3882f8f
    master-5   Ready    master   105s    v1.24.0+3882f8f

    注意

    当集群使用功能 Machine API 运行时,etcd-operator 需要机器自定义资源 (CR) 引用新节点。

  3. Machine CR 与 BareMetalHostNode 链接:

    1. 使用唯一 .metadata.name 值创建 BareMetalHost CR:

      apiVersion: metal3.io/v1alpha1
      kind: BareMetalHost
      metadata:
        name: custom-master3
        namespace: openshift-machine-api
        annotations:
      spec:
        automatedCleaningMode: metadata
        bootMACAddress: 00:00:00:00:00:02
        bootMode: UEFI
        customDeploy:
          method: install_coreos
        externallyProvisioned: true
        online: true
        userData:
          name: master-user-data-managed
          namespace: openshift-machine-api
      $ oc create -f <filename>
    2. 应用 BareMetalHost CR:

      $ oc apply -f <filename>
    3. 使用唯一的 .machine.name 值创建 Machine CR:

      apiVersion: machine.openshift.io/v1beta1
      kind: Machine
      metadata:
        annotations:
          machine.openshift.io/instance-state: externally provisioned
          metal3.io/BareMetalHost: openshift-machine-api/custom-master3
        finalizers:
        - machine.machine.openshift.io
        generation: 3
        labels:
          machine.openshift.io/cluster-api-cluster: test-day2-1-6qv96
          machine.openshift.io/cluster-api-machine-role: master
          machine.openshift.io/cluster-api-machine-type: master
        name: custom-master3
        namespace: openshift-machine-api
      spec:
        metadata: {}
        providerSpec:
          value:
            apiVersion: baremetal.cluster.k8s.io/v1alpha1
            customDeploy:
              method: install_coreos
            hostSelector: {}
            image:
              checksum: ""
              url: ""
            kind: BareMetalMachineProviderSpec
            metadata:
              creationTimestamp: null
            userData:
              name: master-user-data-managed
      $ oc create -f <filename>
    4. 应用 Machine CR:

      $ oc apply -f <filename>
    5. 使用 link-machine-and-node.sh 脚本链接 BareMetalHost, Machine, 和 Node

      #!/bin/bash
      
      # Credit goes to https://bugzilla.redhat.com/show_bug.cgi?id=1801238.
      # This script will link Machine object and Node object. This is needed
      # in order to have IP address of the Node present in the status of the Machine.
      
      set -x
      set -e
      
      machine="$1"
      node="$2"
      
      if [ -z "$machine" -o -z "$node" ]; then
          echo "Usage: $0 MACHINE NODE"
          exit 1
      fi
      
      uid=$(echo $node | cut -f1 -d':')
      node_name=$(echo $node | cut -f2 -d':')
      
      oc proxy &
      proxy_pid=$!
      function kill_proxy {
          kill $proxy_pid
      }
      trap kill_proxy EXIT SIGINT
      
      HOST_PROXY_API_PATH="http://localhost:8001/apis/metal3.io/v1alpha1/namespaces/openshift-machine-api/baremetalhosts"
      
      function wait_for_json() {
          local name
          local url
          local curl_opts
          local timeout
      
          local start_time
          local curr_time
          local time_diff
      
          name="$1"
          url="$2"
          timeout="$3"
          shift 3
          curl_opts="$@"
          echo -n "Waiting for $name to respond"
          start_time=$(date +%s)
          until curl -g -X GET "$url" "${curl_opts[@]}" 2> /dev/null | jq '.' 2> /dev/null > /dev/null; do
              echo -n "."
              curr_time=$(date +%s)
              time_diff=$(($curr_time - $start_time))
              if [[ $time_diff -gt $timeout ]]; then
                  echo "\nTimed out waiting for $name"
                  return 1
              fi
              sleep 5
          done
          echo " Success!"
          return 0
      }
      wait_for_json oc_proxy "${HOST_PROXY_API_PATH}" 10 -H "Accept: application/json" -H "Content-Type: application/json"
      
      addresses=$(oc get node -n openshift-machine-api ${node_name} -o json | jq -c '.status.addresses')
      
      machine_data=$(oc get machine -n openshift-machine-api -o json ${machine})
      host=$(echo "$machine_data" | jq '.metadata.annotations["metal3.io/BareMetalHost"]' | cut -f2 -d/ | sed 's/"//g')
      
      if [ -z "$host" ]; then
          echo "Machine $machine is not linked to a host yet." 1>&2
          exit 1
      fi
      
      # The address structure on the host doesn't match the node, so extract
      # the values we want into separate variables so we can build the patch
      # we need.
      hostname=$(echo "${addresses}" | jq '.[] | select(. | .type == "Hostname") | .address' | sed 's/"//g')
      ipaddr=$(echo "${addresses}" | jq '.[] | select(. | .type == "InternalIP") | .address' | sed 's/"//g')
      
      host_patch='
      {
        "status": {
          "hardware": {
            "hostname": "'${hostname}'",
            "nics": [
              {
                "ip": "'${ipaddr}'",
                "mac": "00:00:00:00:00:00",
                "model": "unknown",
                "speedGbps": 10,
                "vlanId": 0,
                "pxe": true,
                "name": "eth1"
              }
            ],
            "systemVendor": {
              "manufacturer": "Red Hat",
              "productName": "product name",
              "serialNumber": ""
            },
            "firmware": {
              "bios": {
                "date": "04/01/2014",
                "vendor": "SeaBIOS",
                "version": "1.11.0-2.el7"
              }
            },
            "ramMebibytes": 0,
            "storage": [],
            "cpu": {
              "arch": "x86_64",
              "model": "Intel(R) Xeon(R) CPU E5-2630 v4 @ 2.20GHz",
              "clockMegahertz": 2199.998,
              "count": 4,
              "flags": []
            }
          }
        }
      }
      '
      
      echo "PATCHING HOST"
      echo "${host_patch}" | jq .
      
      curl -s \
           -X PATCH \
           ${HOST_PROXY_API_PATH}/${host}/status \
           -H "Content-type: application/merge-patch+json" \
           -d "${host_patch}"
      
      oc get baremetalhost -n openshift-machine-api -o yaml "${host}"
      $ bash link-machine-and-node.sh custom-master3 worker-5
  4. 确认 etcd 成员:

    $ oc rsh -n openshift-etcd etcd-worker-2
    etcdctl member list -w table

    输出示例

    +--------+---------+--------+--------------+--------------+---------+
    |   ID   |  STATUS |  NAME  |  PEER ADDRS  | CLIENT ADDRS | LEARNER |
    +--------+---------+--------+--------------+--------------+---------+
    |2c18942f| started |worker-3|192.168.111.26|192.168.111.26|  false  |
    |61e2a860| started |worker-2|192.168.111.25|192.168.111.25|  false  |
    |ead4f280| started |worker-5|192.168.111.28|192.168.111.28|  false  |
    +--------+---------+--------+--------------+--------------+---------+

  5. 确认 etcd-operator 配置适用于所有节点:

    $ oc get clusteroperator etcd

    输出示例

    NAME   VERSION   AVAILABLE   PROGRESSING   DEGRADED   SINCE   MESSAGE
    etcd   4.11.5    True        False         False      5h54m

  6. 确认 etcd-operator 健康状况:

    $ oc rsh -n openshift-etcd etcd-worker-0
    etcdctl endpoint health

    输出示例

    192.168.111.26 is healthy: committed proposal: took = 11.297561ms
    192.168.111.25 is healthy: committed proposal: took = 13.892416ms
    192.168.111.28 is healthy: committed proposal: took = 11.870755ms

  7. 确认节点健康状况:

    $ oc get Nodes

    输出示例

    NAME       STATUS   ROLES    AGE     VERSION
    master-0   Ready    master   6h20m   v1.24.0+3882f8f
    worker-1   Ready    worker   6h7m    v1.24.0+3882f8f
    master-2   Ready    master   6h20m   v1.24.0+3882f8f
    master-3   Ready    master   6h4m    v1.24.0+3882f8f
    worker-4   Ready    worker   6h7m    v1.24.0+3882f8f
    master-5   Ready    master   99m     v1.24.0+3882f8f

  8. 确认 ClusterOperators 健康状况:

    $ oc get ClusterOperators

    输出示例

    NAME                                      VERSION AVAILABLE PROGRESSING DEGRADED SINCE MSG
    authentication                            4.11.5  True      False       False    5h57m
    baremetal                                 4.11.5  True      False       False    6h19m
    cloud-controller-manager                  4.11.5  True      False       False    6h20m
    cloud-credential                          4.11.5  True      False       False    6h23m
    cluster-autoscaler                        4.11.5  True      False       False    6h18m
    config-operator                           4.11.5  True      False       False    6h19m
    console                                   4.11.5  True      False       False    6h4m
    csi-snapshot-controller                   4.11.5  True      False       False    6h19m
    dns                                       4.11.5  True      False       False    6h18m
    etcd                                      4.11.5  True      False       False    6h17m
    image-registry                            4.11.5  True      False       False    6h7m
    ingress                                   4.11.5  True      False       False    6h6m
    insights                                  4.11.5  True      False       False    6h12m
    kube-apiserver                            4.11.5  True      False       False    6h16m
    kube-controller-manager                   4.11.5  True      False       False    6h16m
    kube-scheduler                            4.11.5  True      False       False    6h16m
    kube-storage-version-migrator             4.11.5  True      False       False    6h19m
    machine-api                               4.11.5  True      False       False    6h15m
    machine-approver                          4.11.5  True      False       False    6h19m
    machine-config                            4.11.5  True      False       False    6h18m
    marketplace                               4.11.5  True      False       False    6h18m
    monitoring                                4.11.5  True      False       False    6h4m
    network                                   4.11.5  True      False       False    6h20m
    node-tuning                               4.11.5  True      False       False    6h18m
    openshift-apiserver                       4.11.5  True      False       False    6h8m
    openshift-controller-manager              4.11.5  True      False       False    6h7m
    openshift-samples                         4.11.5  True      False       False    6h12m
    operator-lifecycle-manager                4.11.5  True      False       False    6h18m
    operator-lifecycle-manager-catalog        4.11.5  True      False       False    6h19m
    operator-lifecycle-manager-pkgsvr         4.11.5  True      False       False    6h12m
    service-ca                                4.11.5  True      False       False    6h19m
    storage                                   4.11.5  True      False       False    6h19m

  9. 确认 ClusterVersion

    $ oc get ClusterVersion

    输出示例

    NAME      VERSION   AVAILABLE   PROGRESSING   SINCE   STATUS
    version   4.11.5    True        False         5h57m   Cluster version is 4.11.5

  10. 删除旧的 control plane 节点:

    1. 删除 BareMetalHost CR:

      $ oc delete bmh -n openshift-machine-api custom-master3
    2. 确认 Machine 不健康:

      $ oc get machine -A

      输出示例

      NAMESPACE              NAME                              PHASE    AGE
      openshift-machine-api  custom-master3                    Running  14h
      openshift-machine-api  test-day2-1-6qv96-master-0        Failed   20h
      openshift-machine-api  test-day2-1-6qv96-master-1        Running  20h
      openshift-machine-api  test-day2-1-6qv96-master-2        Running  20h
      openshift-machine-api  test-day2-1-6qv96-worker-0-8w7vr  Running  19h
      openshift-machine-api  test-day2-1-6qv96-worker-0-rxddj  Running  19h

    3. 删除 Machine CR:

      $ oc delete machine -n openshift-machine-api   test-day2-1-6qv96-master-0
      machine.machine.openshift.io "test-day2-1-6qv96-master-0" deleted
    4. 确认删除 Node CR:

      $ oc get nodes

      输出示例

      NAME       STATUS   ROLES    AGE   VERSION
      worker-1   Ready    worker   19h   v1.24.0+3882f8f
      master-2   Ready    master   20h   v1.24.0+3882f8f
      master-3   Ready    master   19h   v1.24.0+3882f8f
      worker-4   Ready    worker   19h   v1.24.0+3882f8f
      master-5   Ready    master   15h   v1.24.0+3882f8f

  11. 检查 etcd-operator 日志以确认 etcd 集群的状态:

    $ oc logs -n openshift-etcd-operator etcd-operator-8668df65d-lvpjf

    输出示例

    E0927 07:53:10.597523       1 base_controller.go:272] ClusterMemberRemovalController reconciliation failed: cannot remove member: 192.168.111.23 because it is reported as healthy but it doesn't have a machine nor a node resource

  12. 删除物理机器,以允许 etcd-operator 协调集群成员:

    $ oc rsh -n openshift-etcd etcd-worker-2
    etcdctl member list -w table; etcdctl endpoint health

    输出示例

    +--------+---------+--------+--------------+--------------+---------+
    |   ID   |  STATUS |  NAME  |  PEER ADDRS  | CLIENT ADDRS | LEARNER |
    +--------+---------+--------+--------------+--------------+---------+
    |2c18942f| started |worker-3|192.168.111.26|192.168.111.26|  false  |
    |61e2a860| started |worker-2|192.168.111.25|192.168.111.25|  false  |
    |ead4f280| started |worker-5|192.168.111.28|192.168.111.28|  false  |
    +--------+---------+--------+--------------+--------------+---------+
    192.168.111.26 is healthy: committed proposal: took = 10.458132ms
    192.168.111.25 is healthy: committed proposal: took = 11.047349ms
    192.168.111.28 is healthy: committed proposal: took = 11.414402ms

12.6. 在不健康集群中安装主 control plane 节点

此流程描述了如何在不健康的 OpenShift Container Platform 集群上安装主 control plane 节点。

先决条件

  • 使用正确的 etcd-operator 版本使用 OpenShift Container Platform 4.11 或更新版本。
  • 已安装至少两个节点的健康集群。
  • 您已创建了第 2 天 control plane。
  • 您已将 role: master 分配给 一个节点。

流程

  1. 确认集群的初始状态:

    $ oc get nodes

    输出示例

    NAME       STATUS     ROLES    AGE   VERSION
    worker-1   Ready      worker   20h   v1.24.0+3882f8f
    master-2   NotReady   master   20h   v1.24.0+3882f8f
    master-3   Ready      master   20h   v1.24.0+3882f8f
    worker-4   Ready      worker   20h   v1.24.0+3882f8f
    master-5   Ready      master   15h   v1.24.0+3882f8f

  2. 确认 etcd-operator 检测到集群不健康:

    $ oc logs -n openshift-etcd-operator etcd-operator-8668df65d-lvpjf

    输出示例

    E0927 08:24:23.983733       1 base_controller.go:272] DefragController reconciliation failed: cluster is unhealthy: 2 of 3 members are available, worker-2 is unhealthy

  3. 确认 etcdctl 成员:

    $ oc rsh -n openshift-etcd etcd-worker-3
    etcdctl member list -w table

    输出示例

    +--------+---------+--------+--------------+--------------+---------+
    |   ID   | STATUS  |  NAME  |  PEER ADDRS  | CLIENT ADDRS | LEARNER |
    +--------+---------+--------+--------------+--------------+---------+
    |2c18942f| started |worker-3|192.168.111.26|192.168.111.26|  false  |
    |61e2a860| started |worker-2|192.168.111.25|192.168.111.25|  false  |
    |ead4f280| started |worker-5|192.168.111.28|192.168.111.28|  false  |
    +--------+---------+--------+--------------+--------------+---------+

  4. 确认 etcdctl 报告集群的不健康成员:

    $ etcdctl endpoint health

    输出示例

    {"level":"warn","ts":"2022-09-27T08:25:35.953Z","logger":"client","caller":"v3/retry_interceptor.go:62","msg":"retrying of unary invoker failed","target":"etcd-endpoints://0xc000680380/192.168.111.25","attempt":0,"error":"rpc error: code = DeadlineExceeded desc = latest balancer error: last connection error: connection error: desc = \"transport: Error while dialing dial tcp 192.168.111.25: connect: no route to host\""}
    192.168.111.28 is healthy: committed proposal: took = 12.465641ms
    192.168.111.26 is healthy: committed proposal: took = 12.297059ms
    192.168.111.25 is unhealthy: failed to commit proposal: context deadline exceeded
    Error: unhealthy cluster

  5. 通过删除 Machine 自定义资源来删除不健康的 control plane:

    $ oc delete machine -n openshift-machine-api test-day2-1-6qv96-master-2
    注意

    如果不健康的集群无法成功运行,则不会删除 MachineNode 自定义资源 (CR)。

  6. 确认 etcd-operator 没有删除不健康的机器:

    $ oc logs -n openshift-etcd-operator etcd-operator-8668df65d-lvpjf -f

    输出示例

    I0927 08:58:41.249222       1 machinedeletionhooks.go:135] skip removing the deletion hook from machine test-day2-1-6qv96-master-2 since its member is still present with any of: [{InternalIP } {InternalIP 192.168.111.26}]

  7. 手动删除不健康的 etcdctl 成员:

    $ oc rsh -n openshift-etcd etcd-worker-3\
    etcdctl member list -w table

    输出示例

    +--------+---------+--------+--------------+--------------+---------+
    |   ID   |  STATUS |  NAME  |  PEER ADDRS  | CLIENT ADDRS | LEARNER |
    +--------+---------+--------+--------------+--------------+---------+
    |2c18942f| started |worker-3|192.168.111.26|192.168.111.26|  false  |
    |61e2a860| started |worker-2|192.168.111.25|192.168.111.25|  false  |
    |ead4f280| started |worker-5|192.168.111.28|192.168.111.28|  false  |
    +--------+---------+--------+--------------+--------------+---------+

  8. 确认 etcdctl 报告集群的不健康成员:

    $ etcdctl endpoint health

    输出示例

    {"level":"warn","ts":"2022-09-27T10:31:07.227Z","logger":"client","caller":"v3/retry_interceptor.go:62","msg":"retrying of unary invoker failed","target":"etcd-endpoints://0xc0000d6e00/192.168.111.25","attempt":0,"error":"rpc error: code = DeadlineExceeded desc = latest balancer error: last connection error: connection error: desc = \"transport: Error while dialing dial tcp 192.168.111.25: connect: no route to host\""}
    192.168.111.28 is healthy: committed proposal: took = 13.038278ms
    192.168.111.26 is healthy: committed proposal: took = 12.950355ms
    192.168.111.25 is unhealthy: failed to commit proposal: context deadline exceeded
    Error: unhealthy cluster

  9. 通过删除 etcdctl 成员自定义资源来删除不健康的集群:

    $ etcdctl member remove 61e2a86084aafa62

    输出示例

    Member 61e2a86084aafa62 removed from cluster 6881c977b97990d7

  10. 运行以下命令确认 etcdctl 的成员:

    $ etcdctl member list -w table

    输出示例

    +----------+---------+--------+--------------+--------------+-------+
    |    ID    | STATUS  |  NAME  |  PEER ADDRS  | CLIENT ADDRS |LEARNER|
    +----------+---------+--------+--------------+--------------+-------+
    | 2c18942f | started |worker-3|192.168.111.26|192.168.111.26| false |
    | ead4f280 | started |worker-5|192.168.111.28|192.168.111.28| false |
    +----------+---------+--------+--------------+--------------+-------+

  11. 检查并批准证书签名请求

    1. 查看证书签名请求 (CSR):

      $ oc get csr | grep Pending

      输出示例

      csr-5sd59   8m19s   kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   <none>              Pending
      csr-xzqts   10s     kubernetes.io/kubelet-serving                 system:node:worker-6                                                   <none>              Pending

    2. 批准所有待处理的 CSR:

      $ oc get csr -o go-template='{{range .items}}{{if not .status}}{{.metadata.name}}{{"\n"}}{{end}}{{end}}' | xargs --no-run-if-empty oc adm certificate approve
      注意

      您必须批准 CSR 才能完成安装。

  12. 确认 control plane 节点就绪状态:

    $ oc get nodes

    输出示例

    NAME       STATUS   ROLES    AGE     VERSION
    worker-1   Ready    worker   22h     v1.24.0+3882f8f
    master-3   Ready    master   22h     v1.24.0+3882f8f
    worker-4   Ready    worker   22h     v1.24.0+3882f8f
    master-5   Ready    master   17h     v1.24.0+3882f8f
    master-6   Ready    master   2m52s   v1.24.0+3882f8f

  13. 验证 Machine, NodeBareMetalHost 自定义资源。

    如果集群使用功能 Machine API 运行,etcd-operator 需要 Machine CR。存在时,Machine CR 会在 Running 阶段显示。

  14. 创建与 BareMetalHostNode 链接的 Machine 自定义资源。

    确保有 Machine CR 引用新添加的节点。

    重要

    boot-it-yourself 将不会创建 BareMetalHostMachine CR,因此您必须创建它们。如果无法创建 BareMetalHostMachine CR,在运行 etcd-operator 时会生成错误。

  15. 添加 BareMetalHost 自定义资源:

    $ oc create bmh -n openshift-machine-api custom-master3
  16. 添加 Machine 自定义资源:

    $ oc create machine -n openshift-machine-api custom-master3
  17. 运行 link-machine-and-node.sh 脚本链接 BareMetalHost, Machine, 和 Node

    #!/bin/bash
    
    # Credit goes to https://bugzilla.redhat.com/show_bug.cgi?id=1801238.
    # This script will link Machine object and Node object. This is needed
    # in order to have IP address of the Node present in the status of the Machine.
    
    set -x
    set -e
    
    machine="$1"
    node="$2"
    
    if [ -z "$machine" -o -z "$node" ]; then
        echo "Usage: $0 MACHINE NODE"
        exit 1
    fi
    
    uid=$(echo $node | cut -f1 -d':')
    node_name=$(echo $node | cut -f2 -d':')
    
    oc proxy &
    proxy_pid=$!
    function kill_proxy {
        kill $proxy_pid
    }
    trap kill_proxy EXIT SIGINT
    
    HOST_PROXY_API_PATH="http://localhost:8001/apis/metal3.io/v1alpha1/namespaces/openshift-machine-api/baremetalhosts"
    
    function wait_for_json() {
        local name
        local url
        local curl_opts
        local timeout
    
        local start_time
        local curr_time
        local time_diff
    
        name="$1"
        url="$2"
        timeout="$3"
        shift 3
        curl_opts="$@"
        echo -n "Waiting for $name to respond"
        start_time=$(date +%s)
        until curl -g -X GET "$url" "${curl_opts[@]}" 2> /dev/null | jq '.' 2> /dev/null > /dev/null; do
            echo -n "."
            curr_time=$(date +%s)
            time_diff=$(($curr_time - $start_time))
            if [[ $time_diff -gt $timeout ]]; then
                echo "\nTimed out waiting for $name"
                return 1
            fi
            sleep 5
        done
        echo " Success!"
        return 0
    }
    wait_for_json oc_proxy "${HOST_PROXY_API_PATH}" 10 -H "Accept: application/json" -H "Content-Type: application/json"
    
    addresses=$(oc get node -n openshift-machine-api ${node_name} -o json | jq -c '.status.addresses')
    
    machine_data=$(oc get machine -n openshift-machine-api -o json ${machine})
    host=$(echo "$machine_data" | jq '.metadata.annotations["metal3.io/BareMetalHost"]' | cut -f2 -d/ | sed 's/"//g')
    
    if [ -z "$host" ]; then
        echo "Machine $machine is not linked to a host yet." 1>&2
        exit 1
    fi
    
    # The address structure on the host doesn't match the node, so extract
    # the values we want into separate variables so we can build the patch
    # we need.
    hostname=$(echo "${addresses}" | jq '.[] | select(. | .type == "Hostname") | .address' | sed 's/"//g')
    ipaddr=$(echo "${addresses}" | jq '.[] | select(. | .type == "InternalIP") | .address' | sed 's/"//g')
    
    host_patch='
    {
      "status": {
        "hardware": {
          "hostname": "'${hostname}'",
          "nics": [
            {
              "ip": "'${ipaddr}'",
              "mac": "00:00:00:00:00:00",
              "model": "unknown",
              "speedGbps": 10,
              "vlanId": 0,
              "pxe": true,
              "name": "eth1"
            }
          ],
          "systemVendor": {
            "manufacturer": "Red Hat",
            "productName": "product name",
            "serialNumber": ""
          },
          "firmware": {
            "bios": {
              "date": "04/01/2014",
              "vendor": "SeaBIOS",
              "version": "1.11.0-2.el7"
            }
          },
          "ramMebibytes": 0,
          "storage": [],
          "cpu": {
            "arch": "x86_64",
            "model": "Intel(R) Xeon(R) CPU E5-2630 v4 @ 2.20GHz",
            "clockMegahertz": 2199.998,
            "count": 4,
            "flags": []
          }
        }
      }
    }
    '
    
    echo "PATCHING HOST"
    echo "${host_patch}" | jq .
    
    curl -s \
         -X PATCH \
         ${HOST_PROXY_API_PATH}/${host}/status \
         -H "Content-type: application/merge-patch+json" \
         -d "${host_patch}"
    
    oc get baremetalhost -n openshift-machine-api -o yaml "${host}"
    $ bash link-machine-and-node.sh custom-master3 worker-3
  18. 运行以下命令确认 etcdctl 的成员:

    $ oc rsh -n openshift-etcd etcd-worker-3
    etcdctl member list -w table

    输出示例

    +---------+-------+--------+--------------+--------------+-------+
    |   ID    | STATUS|  NAME  |   PEER ADDRS | CLIENT ADDRS |LEARNER|
    +---------+-------+--------+--------------+--------------+-------+
    | 2c18942f|started|worker-3|192.168.111.26|192.168.111.26| false |
    | ead4f280|started|worker-5|192.168.111.28|192.168.111.28| false |
    | 79153c5a|started|worker-6|192.168.111.29|192.168.111.29| false |
    +---------+-------+--------+--------------+--------------+-------+

  19. 确认 etcd Operator 已配置了所有节点:

    $ oc get clusteroperator etcd

    输出示例

    NAME   VERSION   AVAILABLE   PROGRESSING   DEGRADED   SINCE
    etcd   4.11.5    True        False         False      22h

  20. 确认 etcdctl 的健康状况:

    $ oc rsh -n openshift-etcd etcd-worker-3
    etcdctl endpoint health

    输出示例

    192.168.111.26 is healthy: committed proposal: took = 9.105375ms
    192.168.111.28 is healthy: committed proposal: took = 9.15205ms
    192.168.111.29 is healthy: committed proposal: took = 10.277577ms

  21. 确认节点的健康状况:

    $ oc get Nodes

    输出示例

    NAME       STATUS   ROLES    AGE   VERSION
    worker-1   Ready    worker   22h   v1.24.0+3882f8f
    master-3   Ready    master   22h   v1.24.0+3882f8f
    worker-4   Ready    worker   22h   v1.24.0+3882f8f
    master-5   Ready    master   18h   v1.24.0+3882f8f
    master-6   Ready    master   40m   v1.24.0+3882f8f

  22. 确认 ClusterOperators 的健康状况:

    $ oc get ClusterOperators

    输出示例

    NAME                               VERSION   AVAILABLE   PROGRESSING   DEGRADED   SINCE
    authentication                     4.11.5    True        False         False      150m
    baremetal                          4.11.5    True        False         False      22h
    cloud-controller-manager           4.11.5    True        False         False      22h
    cloud-credential                   4.11.5    True        False         False      22h
    cluster-autoscaler                 4.11.5    True        False         False      22h
    config-operator                    4.11.5    True        False         False      22h
    console                            4.11.5    True        False         False      145m
    csi-snapshot-controller            4.11.5    True        False         False      22h
    dns                                4.11.5    True        False         False      22h
    etcd                               4.11.5    True        False         False      22h
    image-registry                     4.11.5    True        False         False      22h
    ingress                            4.11.5    True        False         False      22h
    insights                           4.11.5    True        False         False      22h
    kube-apiserver                     4.11.5    True        False         False      22h
    kube-controller-manager            4.11.5    True        False         False      22h
    kube-scheduler                     4.11.5    True        False         False      22h
    kube-storage-version-migrator      4.11.5    True        False         False      148m
    machine-api                        4.11.5    True        False         False      22h
    machine-approver                   4.11.5    True        False         False      22h
    machine-config                     4.11.5    True        False         False      110m
    marketplace                        4.11.5    True        False         False      22h
    monitoring                         4.11.5    True        False         False      22h
    network                            4.11.5    True        False         False      22h
    node-tuning                        4.11.5    True        False         False      22h
    openshift-apiserver                4.11.5    True        False         False      163m
    openshift-controller-manager       4.11.5    True        False         False      22h
    openshift-samples                  4.11.5    True        False         False      22h
    operator-lifecycle-manager         4.11.5    True        False         False      22h
    operator-lifecycle-manager-catalog 4.11.5    True        False         False      22h
    operator-lifecycle-manager-pkgsvr  4.11.5    True        False         False      22h
    service-ca                         4.11.5    True        False         False      22h
    storage                            4.11.5    True        False         False      22h

  23. 确认 ClusterVersion

    $ oc get ClusterVersion

    输出示例

    NAME      VERSION   AVAILABLE   PROGRESSING   SINCE   STATUS
    version   4.11.5    True        False         22h     Cluster version is 4.11.5

12.7. 其他资源

第 13 章 可选:在 Nutanix 上安装

如果在 Nutanix 上安装 OpenShift Container Platform,辅助安装程序可将 OpenShift Container Platform 集群与 Nutanix 平台集成,这会将 Machine API 公开给 Nutanix,并使用 Nutanix Container Storage Interface (CSI) 动态置备存储容器。

13.1. 使用 UI 在 Nutanix 中添加主机

要使用用户界面 (UI) 在 Nutanix 中添加主机,请从 Assisted Installer 生成发现镜像 ISO。使用最小的发现镜像 ISO。这是默认设置。镜像仅包含使用联网引导主机所需的内容。在引导时会下载大多数内容。ISO 镜像大小为 100MB。

完成后,您必须为 Nutanix 平台创建一个镜像,并创建 Nutanix 虚拟机。

先决条件

  • 您已在 Assisted Installer UI 中创建了集群配置集。
  • 您已设置了 Nutanix 集群环境,并记录集群名称和子网名称。

流程

  1. Host discovery 中,点 Add hosts 按钮并选择安装介质。
  2. 选择 Minimal image file: Provision with virtual media 以下载一个较小的镜像,该镜像会获取引导所需的数据。
  3. 可选:添加一个 SSH 公钥,以便可以以 core 用户身份连接到 Nutanix 虚拟机。通过登录到集群主机,您可以在安装过程中为您提供调试信息。

    1. 如果您在本地计算机上没有现有的 SSH 密钥对,请按照 为集群节点 SSH 访问生成密钥对 的步骤进行操作。
    2. SSH 公钥 字段中,单击 Browse 以上传包含 SSH 公钥的 id_rsa.pub 文件。或者,将文件拖放到文件管理器的字段中。要查看文件管理器中的文件,请在菜单中选择 Show hidden files
  4. 可选: 如果集群主机位于需要使用代理的防火墙后面,请选择 Configure cluster-wide proxy settings。输入代理服务器的 HTTP 和 HTTPS URL 的用户名、密码、IP 地址和端口。
  5. 可选:如果要使用 ignition 文件引导它,请配置发现镜像。如需了解更多详细信息,请参阅配置发现镜像
  6. Generate Discovery ISO
  7. 复制 发现 ISO URL
  8. 在 Nutanix Prism UI 中,按照指示 从 Assisted Installer 中上传发现镜像
  9. 在 Nutanix Prism UI 中,通过 Prism Central 创建 control plane (master) 虚拟机。

    1. 输入 Name。例如,control-planemaster
    2. 输入虚拟机数量。对于 control plane,这应该是 3。
    3. 确保剩余的设置满足 control plane 主机的最低要求。
  10. 在 Nutanix Prism UI 中,通过 Prism Central 创建 worker 虚拟机。

    1. 输入 Name。例如,worker
    2. 输入虚拟机数量。您应该至少创建 2 个 worker 节点。
    3. 确保剩余的设置满足 worker 主机的最低要求。
  11. 返回到 Assisted Installer 用户界面,并等待 Assisted Installer 发现主机,每个都处于 Ready 状态。
  12. 使用 Integrate with your virtualization platform 滑块启用与 Nutanix 的集成。
  13. 继续安装过程。

13.2. 使用 API 在 Nutanix 中添加主机

要使用 API 在 Nutanix 中添加主机,请从 Assisted Installer 生成发现镜像 ISO。使用最小的发现镜像 ISO。这是默认设置。镜像仅包含使用联网引导主机所需的内容。在引导时会下载大多数内容。ISO 镜像大小为 100MB。

完成后,您必须为 Nutanix 平台创建一个镜像,并创建 Nutanix 虚拟机。

先决条件

  • 您已设置 Assisted Installer API 身份验证。
  • 您已创建了 Assisted Installer 集群配置集。
  • 您已创建了辅助安装程序基础架构环境。
  • 在 shell 中将您的基础架构环境 ID 导出为 $INFRA_ENV_ID
  • 您已完成 Assisted Installer 集群配置。
  • 您已设置了 Nutanix 集群环境,并记录集群名称和子网名称。

流程

  1. 如果要使用 ignition 文件引导,请配置发现镜像。
  2. 创建 Nutanix 集群配置文件来保存环境变量:

    $ touch ~/nutanix-cluster-env.sh
    $ chmod +x ~/nutanix-cluster-env.sh

    如果需要启动新的终端会话,您可以轻松重新加载环境变量。例如:

    $ source ~/nutanix-cluster-env.sh
  3. 将 Nutanix 集群的名称分配给配置文件中的 NTX_CLUSTER_NAME 环境变量:

    $ cat << EOF >> ~/nutanix-cluster-env.sh
    export NTX_CLUSTER_NAME=<cluster_name>
    EOF

    <cluster_name> 替换为 Nutanix 集群的名称。

  4. 将 Nutanix 集群的子网名称分配给配置文件中的 NTX_SUBNET_NAME 环境变量:

    $ cat << EOF >> ~/nutanix-cluster-env.sh
    export NTX_SUBNET_NAME=<subnet_name>
    EOF

    <subnet_name> 替换为 Nutanix 集群子网的名称。

  5. 刷新 API 令牌:

    $ source refresh-token
  6. 获取下载 URL:

    $ curl -H "Authorization: Bearer ${API_TOKEN}" \
    https://api.openshift.com/api/assisted-install/v2/infra-envs/${INFRA_ENV_ID}/downloads/image-url
  7. 创建 Nutanix 镜像配置文件:

    $ cat << EOF > create-image.json
    {
      "spec": {
        "name": "ocp_ai_discovery_image.iso",
        "description": "ocp_ai_discovery_image.iso",
        "resources": {
          "architecture": "X86_64",
          "image_type": "ISO_IMAGE",
          "source_uri": "<image_url>",
          "source_options": {
            "allow_insecure_connection": true
          }
        }
      },
      "metadata": {
        "spec_version": 3,
        "kind": "image"
      }
    }
    EOF

    <image_url> 替换为从上一步中下载的镜像 URL。

  8. 创建 Nutanix 镜像:

    $ curl  -k -u <user>:'<password>' -X 'POST' \
    'https://<domain-or-ip>:<port>/api/nutanix/v3/images \
      -H 'accept: application/json' \
      -H 'Content-Type: application/json' \
      -d @./create-image.json | jq '.metadata.uuid'

    <user> 替换为 Nutanix 用户名。将 '<password>' 替换为 Nutanix 密码。将 <domain-or-ip> 替换为 Nutanix plaform 的域名或 IP 地址。将 <port> 替换为 Nutanix 服务器的端口。端口默认为 9440

  9. 将返回的 UUID 分配给配置文件中的 NTX_IMAGE_UUID 环境变量:

    $ cat << EOF >> ~/nutanix-cluster-env.sh
    export NTX_IMAGE_UUID=<uuid>
    EOF
  10. 获取 Nutanix 集群 UUID:

    $ curl -k -u <user>:'<password>' -X 'POST' \
      'https://<domain-or-ip>:<port>/api/nutanix/v3/clusters/list' \
      -H 'accept: application/json' \
      -H 'Content-Type: application/json' \
      -d '{
      "kind": "cluster"
    }'  | jq '.entities[] | select(.spec.name=="<nutanix_cluster_name>") | .metadata.uuid'

    <user> 替换为 Nutanix 用户名。将 '<password>' 替换为 Nutanix 密码。将 <domain-or-ip> 替换为 Nutanix plaform 的域名或 IP 地址。将 <port> 替换为 Nutanix 服务器的端口。端口默认为 9440。将 <nutanix_cluster_name> 替换为 Nutanix 集群的名称。

  11. 将返回的 Nutanix 集群 UUID 分配给配置文件中的 NTX_CLUSTER_UUID 环境变量:

    $ cat << EOF >> ~/nutanix-cluster-env.sh
    export NTX_CLUSTER_UUID=<uuid>
    EOF

    <uuid> 替换为 Nutanix 集群的返回 UUID。

  12. 获取 Nutanix 集群的子网 UUID:

    $ curl -k -u <user>:'<password>' -X 'POST' \
      'https://<domain-or-ip>:<port>/api/nutanix/v3/subnets/list' \
      -H 'accept: application/json' \
      -H 'Content-Type: application/json' \
      -d '{
      "kind": "subnet",
      "filter": "name==<subnet_name>"
    }' | jq '.entities[].metadata.uuid'

    <user> 替换为 Nutanix 用户名。将 '<password>' 替换为 Nutanix 密码。将 <domain-or-ip> 替换为 Nutanix plaform 的域名或 IP 地址。将 <port> 替换为 Nutanix 服务器的端口。端口默认为 9440。将 <subnet_name> 替换为集群子网的名称。

  13. 将返回的 Nutanix 子网 UUID 分配给配置文件中的 NTX_CLUSTER_UUID 环境变量:

    $ cat << EOF >> ~/nutanix-cluster-env.sh
    export NTX_SUBNET_UUID=<uuid>
    EOF

    <uuid> 替换为集群子网的返回 UUID。

  14. 确保设置了 Nutanix 环境变量:

    $ source ~/nutanix-cluster-env.sh
  15. 为每个 Nutanix 主机创建一个虚拟机配置文件。创建三个 control plane (master) 虚拟机和至少两个 worker 虚拟机。例如:

    $ touch create-master-0.json
    $ cat << EOF > create-master-0.json
    {
       "spec": {
          "name": "<host_name>",
          "resources": {
             "power_state": "ON",
             "num_vcpus_per_socket": 1,
             "num_sockets": 16,
             "memory_size_mib": 32768,
             "disk_list": [
                {
                   "disk_size_mib": 122880,
                   "device_properties": {
                      "device_type": "DISK"
                   }
                },
                {
                   "device_properties": {
                      "device_type": "CDROM"
                   },
                   "data_source_reference": {
                     "kind": "image",
                     "uuid": "$NTX_IMAGE_UUID"
                  }
                }
             ],
             "nic_list": [
                {
                   "nic_type": "NORMAL_NIC",
                   "is_connected": true,
                   "ip_endpoint_list": [
                      {
                         "ip_type": "DHCP"
                      }
                   ],
                   "subnet_reference": {
                      "kind": "subnet",
                      "name": "$NTX_SUBNET_NAME",
                      "uuid": "$NTX_SUBNET_UUID"
                   }
                }
             ],
             "guest_tools": {
                "nutanix_guest_tools": {
                   "state": "ENABLED",
                   "iso_mount_state": "MOUNTED"
                }
             }
          },
          "cluster_reference": {
             "kind": "cluster",
             "name": "$NTX_CLUSTER_NAME",
             "uuid": "$NTX_CLUSTER_UUID"
          }
       },
       "api_version": "3.1.0",
       "metadata": {
          "kind": "vm"
       }
    }
    EOF

    <host_name> 替换为主机的名称。

  16. 引导每个 Nutanix 虚拟机:

    $ curl -k -u <user>:'<password>' -X 'POST' \
      'https://<domain-or-ip>:<port>/api/nutanix/v3/vms' \
      -H 'accept: application/json' \
      -H 'Content-Type: application/json' \
      -d @./<vm_config_file_name> | jq '.metadata.uuid'

    <user> 替换为 Nutanix 用户名。将 '<password>' 替换为 Nutanix 密码。将 <domain-or-ip> 替换为 Nutanix plaform 的域名或 IP 地址。将 <port> 替换为 Nutanix 服务器的端口。端口默认为 9440。将 <vm_config_file_name> 替换为虚拟机配置文件的名称。

  17. 将返回的虚拟机 UUID 分配给配置文件中的唯一环境变量:

    $ cat << EOF >> ~/nutanix-cluster-env.sh
    export NTX_MASTER_0_UUID=<uuid>
    EOF

    <uuid> 替换为虚拟机返回的 UUID。

    注意

    环境变量必须具有每个虚拟机的唯一名称。

  18. 等待 Assisted Installer 发现每个虚拟机,并已通过验证。

    $ curl -s -X GET "https://api.openshift.com/api/assisted-install/v2/clusters/$CLUSTER_ID"
    --header "Content-Type: application/json"
    -H "Authorization: Bearer $API_TOKEN"
    | jq '.enabled_host_count'
  19. 修改集群定义以启用与 Nutanix 集成:

    $ curl https://api.openshift.com/api/assisted-install/v2/clusters/${CLUSTER_ID} \
    -X PATCH \
    -H "Authorization: Bearer ${API_TOKEN}" \
    -H "Content-Type: application/json" \
    -d '
    {
        "platform_type":"nutanix"
    }
    ' | jq
  20. 继续安装过程。

13.3. Nutanix 安装后配置

按照以下步骤完成并验证 OpenShift Container Platform 与 Nutanix 云供应商的集成。

先决条件

  • Assisted Installer 成功完成安装集群。
  • 集群连接到 console.redhat.com
  • 您可以访问 Red Hat OpenShift Container Platform 命令行界面。

13.3.1. 更新 Nutanix 配置设置

使用 Assisted Installer 在 Nutanix 平台上安装 OpenShift Container Platform 后,您必须手动更新以下 Nutanix 配置设置:

  • <prismcentral_username& gt; : Nutanix Prism Central username。
  • <prismcentral_password& gt; : Nutanix Prism Central 密码。
  • <prismcentral_address& gt; : Nutanix Prism Central 地址。
  • <prismcentral_port>: Nutanix Prism Central 端口。
  • <prismelement_username& gt; : Nutanix Prism Element 用户名。
  • <prismelement_password& gt; : Nutanix Prism Element 密码。
  • <prismelement_address& gt; : Nutanix Prism Element 地址。
  • <prismelement_port>: Nutanix Prism Element 端口。
  • <prismelement_clustername>: Nutanix Prism Element 集群名称。
  • <nutanix_storage_container& gt; : Nutanix Prism storage 容器。

流程

  1. 在 OpenShift Container Platform 命令行界面中,更新 Nutanix 集群配置设置:

    $ oc patch infrastructure/cluster --type=merge --patch-file=/dev/stdin <<-EOF
    {
      "spec": {
        "platformSpec": {
          "nutanix": {
            "prismCentral": {
              "address": "<prismcentral_address>",
              "port": <prismcentral_port>
            },
            "prismElements": [
              {
                "endpoint": {
                  "address": "<prismelement_address>",
                  "port": <prismelement_port>
                },
                "name": "<prismelement_clustername>"
              }
            ]
          },
          "type": "Nutanix"
        }
      }
    }
    EOF

    输出示例

    infrastructure.config.openshift.io/cluster patched

    如需了解更多详细信息,请参阅在 Nutanix 上创建机器集

  2. 创建 Nutanix secret:

    $ cat <<EOF | oc create -f -
    apiVersion: v1
    kind: Secret
    metadata:
       name: nutanix-credentials
       namespace: openshift-machine-api
    type: Opaque
    stringData:
      credentials: |
    [{"type":"basic_auth","data":{"prismCentral":{"username":"${<prismcentral_username>}","password":"${<prismcentral_password>}"},"prismElements":null}}]
    EOF

    输出示例

    secret/nutanix-credentials created

  3. 安装 OpenShift Container Platform 版本 4.13 或更高版本时,更新 Nutanix 云供应商配置:

    1. 获取 Nutanix 云供应商配置 YAML 文件:

      $ oc get cm cloud-provider-config -o yaml -n openshift-config > cloud-provider-config-backup.yaml
    2. 创建配置文件的备份:

      $ cp cloud-provider-config_backup.yaml cloud-provider-config.yaml
    3. 打开配置 YAML 文件:

      $ vi cloud-provider-config.yaml
    4. 编辑配置 YAML 文件,如下所示:

      kind: ConfigMap
      apiVersion: v1
      metadata:
        name: cloud-provider-config
        namespace: openshift-config
      data:
        config: |
          {
          	"prismCentral": {
          		"address": "<prismcentral_address>",
          		"port":<prismcentral_port>,
          		"credentialRef": {
          		   "kind": "Secret",
          		   "name": "nutanix-credentials",
          		   "namespace": "openshift-cloud-controller-manager"
          		}
          	},
          	"topologyDiscovery": {
          		"type": "Prism",
          		"topologyCategories": null
          	},
          	"enableCustomLabeling": true
          }
    5. 应用配置更新:

      $ oc apply -f cloud-provider-config.yaml

      输出示例

      Warning: resource configmaps/cloud-provider-config is missing the kubectl.kubernetes.io/last-applied-configuration annotation which is required by oc apply. oc apply should only be used on resources created declaratively by either oc create --save-config or oc apply. The missing annotation will be patched automatically.
      
      configmap/cloud-provider-config configured

13.3.2. 创建 Nutanix CSI Operator 组

为 Nutanix CSI Operator 创建 Operator 组。

注意

有关 operator 组和相关概念的描述,请参阅附加资源 中的常见 Operator Framework 术语

流程

  1. 打开 Nutanix CSI Operator Group YAML 文件:

    $ vi openshift-cluster-csi-drivers-operator-group.yaml
  2. 编辑 YAML 文件,如下所示:

    apiVersion: operators.coreos.com/v1
    kind: OperatorGroup
    metadata:
      generateName: openshift-cluster-csi-drivers
      namespace: openshift-cluster-csi-drivers
    spec:
      targetNamespaces:
      - openshift-cluster-csi-drivers
      upgradeStrategy: Default
  3. 创建 Operator 组:

    $ oc create -f openshift-cluster-csi-drivers-operator-group.yaml

    输出示例

    operatorgroup.operators.coreos.com/openshift-cluster-csi-driversjw9cd created

13.3.3. 安装 Nutanix CSI Operator

Kubernetes 的 Nutanix Container Storage Interface (CSI) Operator 部署和管理 Nutanix CSI 驱动程序。

注意

有关通过 Red Hat OpenShift Container Platform 执行此步骤的步骤,请参阅附加资源 中的 Nutanix CSI Operator 文档中的 安装 Operator 部分。

流程

  1. 获取 Nutanix CSI Operator YAML 文件的参数值:

    1. 检查 Nutanix CSI Operator 是否存在:

      $ oc get packagemanifests | grep nutanix

      输出示例

      nutanixcsioperator   Certified Operators   129m

    2. 将 Operator 的默认频道分配给 BASH 变量:

      $ DEFAULT_CHANNEL=$(oc get packagemanifests nutanixcsioperator -o jsonpath={.status.defaultChannel})
    3. 将 Operator 的起始集群服务版本(CSV)分配给 BASH 变量:

      $ STARTING_CSV=$(oc get packagemanifests nutanixcsioperator -o jsonpath=\{.status.channels[*].currentCSV\})
    4. 将订阅的目录源分配给 BASH 变量:

      $ CATALOG_SOURCE=$(oc get packagemanifests nutanixcsioperator -o jsonpath=\{.status.catalogSource\})
    5. 将 Nutanix CSI Operator 源命名空间分配给 BASH 变量:

      $ SOURCE_NAMESPACE=$(oc get packagemanifests nutanixcsioperator -o jsonpath=\{.status.catalogSourceNamespace\})
  2. 使用 BASH 变量创建 Nutanix CSI Operator YAML 文件:

    $ cat << EOF > nutanixcsioperator.yaml
    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: nutanixcsioperator
      namespace: openshift-cluster-csi-drivers
    spec:
      channel: $DEFAULT_CHANNEL
      installPlanApproval: Automatic
      name: nutanixcsioperator
      source: $CATALOG_SOURCE
      sourceNamespace: $SOURCE_NAMESPACE
      startingCSV: $STARTING_CSV
    EOF
  3. 创建 CSI Nutanix Operator:

    $ oc apply -f nutanixcsioperator.yaml

    输出示例

    subscription.operators.coreos.com/nutanixcsioperator created

  4. 运行以下命令,直到 Operator 订阅状态更改为 AtLatestKnown。这表明已创建了 Operator 订阅,可能需要一些时间。

    $ oc get subscription nutanixcsioperator -n openshift-cluster-csi-drivers -o 'jsonpath={..status.state}'

13.3.4. 部署 Nutanix CSI 存储驱动程序

Kubernetes 的 Nutanix Container Storage Interface (CSI)驱动程序为有状态应用程序提供可扩展和持久性存储。

注意

有关执行 Red Hat OpenShift Container Platform 的步骤,请参阅附加资源 中的使用 Nutanix CSI Operator 文档中的使用 Operator 安装 CSI Driver 部分。

流程

  1. 创建 NutanixCsiStorage 资源来部署驱动程序:

    $ cat <<EOF | oc create -f -
    apiVersion: crd.nutanix.com/v1alpha1
    kind: NutanixCsiStorage
    metadata:
      name: nutanixcsistorage
      namespace: openshift-cluster-csi-drivers
    spec: {}
    EOF

    输出示例

    snutanixcsistorage.crd.nutanix.com/nutanixcsistorage created

  2. 为 CSI 存储驱动程序创建一个 Nutanix secret YAML 文件:

    $ cat <<EOF | oc create -f -
    apiVersion: v1
    kind: Secret
    metadata:
      name: ntnx-secret
      namespace: openshift-cluster-csi-drivers
    stringData:
      # prism-element-ip:prism-port:admin:password
      key: <prismelement_address:prismelement_port:prismcentral_username:prismcentral_password> 1
    EOF
    注意
    1
    使用实际值替换这些参数,同时保持相同的格式。

    输出示例

    secret/nutanix-secret created

13.3.5. 验证安装后配置

运行以下命令以验证配置。

流程

  1. 验证您可以创建一个存储类:

    $ cat <<EOF | oc create -f -
    kind: StorageClass
    apiVersion: storage.k8s.io/v1
    metadata:
      name: nutanix-volume
      annotations:
        storageclass.kubernetes.io/is-default-class: 'true'
    provisioner: csi.nutanix.com
    parameters:
      csi.storage.k8s.io/fstype: ext4
      csi.storage.k8s.io/provisioner-secret-namespace: openshift-cluster-csi-drivers
      csi.storage.k8s.io/provisioner-secret-name: ntnx-secret
      storageContainer: <nutanix_storage_container> 1
      csi.storage.k8s.io/controller-expand-secret-name: ntnx-secret
      csi.storage.k8s.io/node-publish-secret-namespace: openshift-cluster-csi-drivers
      storageType: NutanixVolumes
      csi.storage.k8s.io/node-publish-secret-name: ntnx-secret
      csi.storage.k8s.io/controller-expand-secret-namespace: openshift-cluster-csi-drivers
    reclaimPolicy: Delete
    allowVolumeExpansion: true
    volumeBindingMode: Immediate
    EOF
    注意
    1
    从 Nutanix 配置中获取 <nutanix_storage_container>,例如 SelfServiceContainer。

    输出示例

    storageclass.storage.k8s.io/nutanix-volume created

  2. 验证您可以创建 Nutanix 持久性卷声明(PVC):

    1. 创建持久性卷声明(PVC):

      $ cat <<EOF | oc create -f -
      kind: PersistentVolumeClaim
      apiVersion: v1
      metadata:
        name: nutanix-volume-pvc
        namespace: openshift-cluster-csi-drivers
        annotations:
          volume.beta.kubernetes.io/storage-provisioner: csi.nutanix.com
          volume.kubernetes.io/storage-provisioner: csi.nutanix.com
        finalizers:
          - kubernetes.io/pvc-protection
      spec:
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 1Gi
        storageClassName: nutanix-volume
        volumeMode: Filesystem
      EOF

      输出示例

      persistentvolumeclaim/nutanix-volume-pvc created

    2. 验证持久性卷声明(PVC)状态为 Bound:

      $ oc get pvc -n openshift-cluster-csi-drivers

      输出示例

      NAME                 STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS     AGE
      nutanix-volume-pvc   Bound                                        nutanix-volume   52s

第 14 章 可选:在 vSphere 上安装

如果在 vSphere 上安装 OpenShift Container Platform,辅助安装程序可以将 OpenShift Container Platform 集群与 vSphere 平台集成,这会将 Machine API 公开给 vSphere 并启用自动扩展。

14.1. 在 vSphere 中添加主机

您可以使用在线 vSphere 客户端或 govc vSphere CLI 工具将主机添加到 Assisted Installer 集群。以下流程演示了使用 govc CLI 工具添加主机。要使用在线 vSphere 客户端,请参阅 vSphere 的文档。

要使用 vSphere govc CLI 在 vSphere 中添加主机,请从 Assisted Installer 生成发现镜像 ISO。最小发现镜像 ISO 是默认设置。此镜像仅包含使用网络引导主机所需的内容。在引导时会下载大多数内容。ISO 镜像大小为 100MB。

完成后,您必须为 vSphere 平台创建镜像并创建 vSphere 虚拟机。

先决条件

  • 您使用 vSphere 7.0.2 或更高版本。
  • 已安装并配置了 vSphere govc CLI 工具。
  • 在 vSphere 中,已将 clusterSet disk.enableUUID 设置为 true
  • 您已在 Assisted Installer UI 中创建了一个集群,或者
  • 您有:

    • 使用 API 创建辅助安装程序集群配置集和基础架构环境。
    • 在 shell 中导出您的基础架构环境 ID 作为 $INFRA_ENV_ID
    • 完成配置。

流程

  1. 如果要使用 ignition 文件引导,请配置发现镜像。
  2. 从 Assisted Installer UI 生成并下载 ISO。

    1. Host discovery 中,点 Add hosts 按钮并选择安装介质。
    2. 选择 Minimal image file: Provision with virtual media 以下载一个较小的镜像,该镜像会获取引导所需的数据。
    3. 添加 SSH 公钥,以便您可以以 core 用户身份连接到 vSphere 虚拟机。通过登录到集群主机,您可以在安装过程中为您提供调试信息。

      1. 如果您在本地计算机上没有现有的 SSH 密钥对,请按照 为集群节点 SSH 访问生成密钥对 的步骤进行操作。
      2. SSH 公钥 字段中,单击 Browse 以上传包含 SSH 公钥的 id_rsa.pub 文件。或者,将文件拖放到文件管理器的字段中。要查看文件管理器中的文件,请在菜单中选择 Show hidden files
    4. 可选: 如果集群主机位于需要使用代理的防火墙后面,请选择 Configure cluster-wide proxy settings。输入代理服务器的 HTTP 和 HTTPS URL 的用户名、密码、IP 地址和端口。
    5. 可选: 如果集群主机位于带有重新加密 man-in-the-middle (MITM) 代理的网络中,或者集群需要信任证书用于容器镜像 registry,请选择 Configure cluster-wide trusted certificate 并添加额外的证书。
    6. 可选:如果要使用 ignition 文件引导它,请配置发现镜像。如需了解更多详细信息,请参阅配置发现镜像
    7. Generate Discovery ISO
    8. 复制 发现 ISO URL
    9. 下载发现 ISO:

      $ wget - O vsphere-discovery-image.iso <discovery_url>

      <discovery_url> 替换为上一步中的 URL。

  3. 在命令行中,关闭并销毁任何预先存在的虚拟机:

    $ for VM in $(/usr/local/bin/govc ls /<datacenter>/vm/<folder_name>)
    do
     	/usr/local/bin/govc vm.power -off $VM
     	/usr/local/bin/govc vm.destroy $VM
    done

    <datacenter> 替换为数据中心的名称。将 <folder_name> 替换为虚拟机清单文件夹的名称。

  4. 从数据存储中删除预先存在的 ISO 镜像(如果存在):

    $ govc datastore.rm -ds <iso_datastore> <image>

    <iso_datastore> 替换为数据存储的名称。使用 ISO 镜像的名称替换 image

  5. 上传辅助安装程序发现 ISO:

    $ govc datastore.upload -ds <iso_datastore>  vsphere-discovery-image.iso

    <iso_datastore> 替换为数据存储的名称。

    注意

    集群中的所有节点都必须从发现镜像引导。

  6. 引导三个 control plane (master) 节点:

    $ govc vm.create -net.adapter <network_adapter_type> \
                     -disk.controller <disk_controller_type> \
                     -pool=<resource_pool> \
                     -c=16 \
                     -m=32768 \
                     -disk=120GB \
                     -disk-datastore=<datastore_file> \
                     -net.address="<nic_mac_address>" \
                     -iso-datastore=<iso_datastore> \
                     -iso="vsphere-discovery-image.iso" \
                     -folder="<inventory_folder>" \
                     <hostname>.<cluster_name>.example.com

    详情请参阅 vm.create

    注意

    示例中演示了 control plane 节点所需的最小所需资源。

  7. 至少引导两个 worker 节点:

    $ govc vm.create -net.adapter <network_adapter_type> \
                     -disk.controller <disk_controller_type> \
                     -pool=<resource_pool> \
                     -c=4 \
                     -m=8192 \
                     -disk=120GB \
                     -disk-datastore=<datastore_file> \
                     -net.address="<nic_mac_address>" \
                     -iso-datastore=<iso_datastore> \
                     -iso="vsphere-discovery-image.iso" \
                     -folder="<inventory_folder>" \
                     <hostname>.<cluster_name>.example.com

    详情请参阅 vm.create

    注意

    示例中演示了 worker 节点所需的最小所需资源。

  8. 确保虚拟机正在运行:

    $  govc ls /<datacenter>/vm/<folder_name>

    <datacenter> 替换为数据中心的名称。将 <folder_name> 替换为虚拟机清单文件夹的名称。

  9. 2 分钟后,关闭虚拟机:

    $ for VM in $(govc ls /<datacenter>/vm/<folder_name>)
    do
         govc vm.power -s=true $VM
    done

    <datacenter> 替换为数据中心的名称。将 <folder_name> 替换为虚拟机清单文件夹的名称。

  10. disk.enableUUID 设置为 TRUE

    $ for VM in $(govc ls /<datacenter>/vm/<folder_name>)
    do
         govc vm.change -vm $VM -e disk.enableUUID=TRUE
    done

    <datacenter> 替换为数据中心的名称。将 <folder_name> 替换为虚拟机清单文件夹的名称。

    注意

    您必须在所有节点上将 disk.enableUUID 设置为 TRUE,才能使用 vSphere 启用自动扩展。

  11. 重启虚拟机:

    $  for VM in $(govc ls /<datacenter>/vm/<folder_name>)
    do
         govc vm.power -on=true $VM
    done

    <datacenter> 替换为数据中心的名称。将 <folder_name> 替换为虚拟机清单文件夹的名称。

  12. 返回到 Assisted Installer 用户界面,并等待 Assisted Installer 发现主机,每个都处于 Ready 状态。
  13. 使用 Integrate with your virtualization platform 滑块启用与 vSphere 的集成。
  14. 如果需要,选择角色。
  15. Networking 中,取消选中 Allocate IPs via DHCP server
  16. 设置 API VIP 地址。
  17. 设置 Ingress VIP 地址。
  18. 继续安装过程。

14.2. 使用 CLI 进行 vSphere 安装后配置

在启用了平台集成功能的 vSphere 上使用 Assisted Installer 安装 OpenShift Container Platform 集群后,您必须手动更新以下 vSphere 配置设置:

  • vCenter 用户名
  • vCenter 密码
  • vCenter 地址
  • vCenter 集群
  • datacenter
  • datastore
  • folder

先决条件

流程

  1. 为 vCenter 生成 base64 编码的用户名和密码:

    $ echo -n "<vcenter_username>" | base64 -w0

    <vcenter_username> 替换为您的 vCenter 用户名。

    $ echo -n "<vcenter_password>" | base64 -w0

    <vcenter_password> 替换为您的 vCenter 密码。

  2. 备份 vSphere 凭证:

    $ oc get secret vsphere-creds -o yaml -n kube-system > creds_backup.yaml
  3. 编辑 vSphere 凭证:

    $ cp creds_backup.yaml vsphere-creds.yaml
    $ vi vsphere-creds.yaml
    apiVersion: v1
    data:
      <vcenter_address>.username: <vcenter_username_encoded>
      <vcenter_address>.password: <vcenter_password_encoded>
    kind: Secret
    metadata:
      annotations:
        cloudcredential.openshift.io/mode: passthrough
      creationTimestamp: "2022-01-25T17:39:50Z"
      name: vsphere-creds
      namespace: kube-system
      resourceVersion: "2437"
      uid: 06971978-e3a5-4741-87f9-2ca3602f2658
    type: Opaque

    <vcenter_address> 替换为 vCenter 地址。将 <vcenter_username_encoded> 替换为 vSphere 用户名的 base64 编码版本。将 <vcenter_password_encoded> 替换为 vSphere 密码的 base64 编码版本。

  4. 替换 vSphere 凭证:

    $ oc replace -f vsphere-creds.yaml
  5. 重新部署 kube-controller-manager pod:

    $ oc patch kubecontrollermanager cluster -p='{"spec": {"forceRedeploymentReason": "recovery-'"$( date --rfc-3339=ns )"'"}}' --type=merge
  6. 备份 vSphere 云供应商配置:

    $ oc get cm cloud-provider-config -o yaml -n openshift-config > cloud-provider-config_backup.yaml
  7. 编辑云供应商配置:

    $ cloud-provider-config_backup.yaml cloud-provider-config.yaml
    $ vi cloud-provider-config.yaml
    apiVersion: v1
    data:
      config: |
        [Global]
        secret-name = "vsphere-creds"
        secret-namespace = "kube-system"
        insecure-flag = "1"
    
        [Workspace]
        server = "<vcenter_address>"
        datacenter = "<datacenter>"
        default-datastore = "<datastore>"
        folder = "/<datacenter>/vm/<folder>"
    
        [VirtualCenter "<vcenter_address>"]
        datacenters = "<datacenter>"
    kind: ConfigMap
    metadata:
      creationTimestamp: "2022-01-25T17:40:49Z"
      name: cloud-provider-config
      namespace: openshift-config
      resourceVersion: "2070"
      uid: 80bb8618-bf25-442b-b023-b31311918507

    <vcenter_address> 替换为 vCenter 地址。将 <datacenter> 替换为数据中心的名称。将 <datastore> 替换为数据存储的名称。将 <folder> 替换为包含集群虚拟机的文件夹。

  8. 应用云供应商配置:

    $ oc apply -f cloud-provider-config.yaml
  9. 使用 uninitialized 污点为集群加污点:

    重要

    如果要安装 OpenShift Container Platform 4.13 或更高版本,请执行以下的第 9 步到第 12 步。

    1. 识别要加污点的节点:

      $ oc get nodes
    2. 对每个节点运行以下命令:

      $ oc adm taint node <node_name> node.cloudprovider.kubernetes.io/uninitialized=true:NoSchedule

      <node_name> 替换为节点的名称。

    示例

    $ oc get nodes
    NAME                STATUS   ROLES                  AGE   VERSION
    master-0   Ready    control-plane,master   45h   v1.26.3+379cd9f
    master-1   Ready    control-plane,master   45h   v1.26.3+379cd9f
    worker-0   Ready    worker                 45h   v1.26.3+379cd9f
    worker-1   Ready    worker                 45h   v1.26.3+379cd9f
    master-2   Ready    control-plane,master   45h   v1.26.3+379cd9f
    
    $ oc adm taint node master-0 node.cloudprovider.kubernetes.io/uninitialized=true:NoSchedule
    $ oc adm taint node master-1 node.cloudprovider.kubernetes.io/uninitialized=true:NoSchedule
    $ oc adm taint node master-2 node.cloudprovider.kubernetes.io/uninitialized=true:NoSchedule
    $ oc adm taint node worker-0 node.cloudprovider.kubernetes.io/uninitialized=true:NoSchedule
    $ oc adm taint node worker-1 node.cloudprovider.kubernetes.io/uninitialized=true:NoSchedule

  10. 备份基础架构配置:

    $ oc get infrastructures.config.openshift.io -o yaml > infrastructures.config.openshift.io.yaml.backup
  11. 编辑基础架构配置:

    $ cp infrastructures.config.openshift.io.yaml.backup infrastructures.config.openshift.io.yaml
    $ vi infrastructures.config.openshift.io.yaml
    apiVersion: v1
    items:
    - apiVersion: config.openshift.io/v1
      kind: Infrastructure
      metadata:
        creationTimestamp: "2023-05-07T10:19:55Z"
        generation: 1
        name: cluster
        resourceVersion: "536"
        uid: e8a5742c-6d15-44e6-8a9e-064b26ab347d
      spec:
        cloudConfig:
          key: config
          name: cloud-provider-config
        platformSpec:
          type: VSphere
          vsphere:
            failureDomains:
            - name: assisted-generated-failure-domain
              region: assisted-generated-region
              server: <vcenter_address>
              topology:
                computeCluster: /<data_center>/host/<vcenter_cluster>
                datacenter: <data_center>
                datastore: /<data_center>/datastore/<datastore>
                folder: "/<data_center>/path/to/folder"
                networks:
                - "VM Network"
                resourcePool: /<data_center>/host/<vcenter_cluster>/Resources
              zone: assisted-generated-zone
            nodeNetworking:
              external: {}
              internal: {}
            vcenters:
            - datacenters:
              - <data_center>
              server: <vcenter_address>
    
    kind: List
    metadata:
      resourceVersion: ""

    <vcenter_address> 替换为您的 vCenter 地址。将 <datacenter> 替换为 vCenter 数据中心的名称。将 <datastore> 替换为 vCenter 数据存储的名称。将 <folder> 替换为包含集群虚拟机的文件夹。将 <vcenter_cluster> 替换为安装 OpenShift Container Platform 的 vSphere vCenter 集群。

  12. 应用基础架构配置:

    $ oc apply -f infrastructures.config.openshift.io.yaml --overwrite=true

14.3. 使用 UI 进行 vSphere 安装后配置

在启用了平台集成功能的 vSphere 上使用 Assisted Installer 安装 OpenShift Container Platform 集群后,您必须手动更新以下 vSphere 配置设置:

  • vCenter 地址
  • vCenter 集群
  • vCenter 用户名
  • vCenter 密码
  • 数据中心
  • 默认数据存储
  • 虚拟机文件夹

先决条件

流程

  1. 在 Administrator 视角中,进入到 Home → Overview
  2. Status 下,点 vSphere connection 打开 vSphere 连接配置
  3. vCenter 字段中,输入 vSphere vCenter 服务器的网络地址。这可以是域名,也可以是 IP 地址。它会出现在 vSphere Web 客户端 URL 中,例如 https://[your_vCenter_address]/ui
  4. vCenter cluster 字段中,输入安装 OpenShift Container Platform 的 vSphere vCenter 集群名称。

    重要

    如果安装了 OpenShift Container Platform 4.13 或更高版本,则此步骤是必需的。

  5. Username 字段中,输入 vSphere vCenter 用户名。
  6. Password 字段中输入您的 vSphere vCenter 密码。

    警告

    系统将用户名和密码存储在集群的 kube-system 命名空间中的 vsphere-creds secret 中。不正确的 vCenter 用户名或密码使集群节点不可调度。

  7. Datacenter 字段中,输入 vSphere 数据中心的名称,其中包含用于托管集群的虚拟机;例如,SDDC-Datacenter
  8. Default data store 字段中,输入存储持久数据卷的 vSphere 数据存储;例如 /SDDC-Datacenter/datastore/datastorename

    警告

    在保存配置后,更新 vSphere 数据中心或默认数据存储会分离任何活跃的 vSphere PersistentVolume

  9. Virtual Machine Folder 字段中,输入包含集群虚拟机的数据中心文件夹;例如,/SDDC-Datacenter/vm/ci-ln-hjg4vg2-c61657-t2gzr。要使 OpenShift Container Platform 安装成功,组成集群的所有虚拟机都必须位于单个数据中心文件夹中。
  10. Save Configuration。这会更新 openshift-config 命名空间中的 cloud-provider-config 文件,并启动配置过程。
  11. 重新打开 vSphere 连接配置,再展开 Monitored operators 面板。检查 Operator 的状态是否为 ProgressingHealthy

验证

连接配置过程更新 Operator 状态和 control plane 节点。这大约需要一小时才能完成。在配置过程中,节点将重新引导。以前绑定的 PersistentVolumeClaims 对象可能会断开连接。

按照以下步骤监控配置过程。

  1. 检查配置过程是否已成功完成:

    1. 在 OpenShift Container Platform Administrator 视角中,进入到 Home → Overview
    2. Status 下点 Operators。等待所有操作器状态从 Progressing 变为 All succeededFailed 状态表示配置失败。
    3. Status 下,点 Control Plane。等待所有 Control Pane 组件的响应率返回到 100%。Failed control plane 组件表示配置失败。

    失败表示至少一个连接设置不正确。更改 vSphere 连接配置中的设置,然后再次保存配置。

  2. 通过执行以下步骤来检查您是否可以绑定 PersistentVolumeClaims 对象:

    1. 使用以下 YAML 创建 StorageClass 对象:

      kind: StorageClass
      apiVersion: storage.k8s.io/v1
      metadata:
       name: vsphere-sc
      provisioner: kubernetes.io/vsphere-volume
      parameters:
       datastore: YOURVCENTERDATASTORE
       diskformat: thin
      reclaimPolicy: Delete
      volumeBindingMode: Immediate
    2. 使用以下 YAML 创建 PersistentVolumeClaims 对象:

      kind: PersistentVolumeClaim
      apiVersion: v1
      metadata:
       name: test-pvc
       namespace: openshift-config
       annotations:
         volume.beta.kubernetes.io/storage-provisioner: kubernetes.io/vsphere-volume
       finalizers:
         - kubernetes.io/pvc-protection
      spec:
       accessModes:
         - ReadWriteOnce
       resources:
         requests:
          storage: 10Gi
       storageClassName: vsphere-sc
       volumeMode: Filesystem

    具体步骤请参阅 OpenShift Container Platform 文档中的 动态置备。要排除 PersistentVolumeClaims 对象的问题,请进入到 OpenShift Container Platform UI 的 Administrator 视角中的 StoragePersistentVolumeClaims

第 15 章 故障排除

有些情况下,辅助安装程序无法开始安装,或者集群无法正确安装。在这些事件中,了解可能的故障模式以及如何对故障进行故障排除非常有用。

15.1. 先决条件

  • 您已使用 API 创建基础架构环境,或者已使用 UI 创建集群。

15.2. 发现 ISO 问题故障排除

Assisted Installer 使用 ISO 镜像来运行将主机注册到集群的代理,并在尝试安装 OpenShift 前执行硬件和网络验证。您可以按照以下步骤排除与主机发现相关的问题。

使用发现 ISO 镜像启动主机后,辅助安装程序发现主机并在 Assisted Service UI 中显示它。

如需了解更多详细信息,请参阅配置发现镜像

15.3. 最小 ISO 镜像

当虚拟介质连接的带宽有限时,应使用最小 ISO 镜像。它只包括使用联网引导主机所需的内容。在引导时会下载大多数内容。与 1GB 相比,生成的 ISO 镜像的大小大约为 100MB,用于完整的 ISO 镜像。

15.3.1. 故障排除最小 ISO 引导失败

如果您的环境需要静态网络配置来访问 Assisted Installer 服务,则该配置中的任何问题可能会阻止 Minimal ISO 正确引导。如果引导屏幕显示主机已无法下载根文件系统镜像,请验证任何其他网络配置是否正确。切换到完整 ISO 镜像还允许更轻松地调试。

rootfs 下载失败示例

screenshot of failing root file system image download

15.4. 验证发现代理是否正在运行

先决条件

  • 您已使用 API 创建基础架构环境,或使用 UI 创建集群。
  • 已使用基础架构环境发现 ISO 引导主机,主机无法注册。
  • 有到主机的 ssh 访问权限。
  • 在生成发现 ISO 前,在"添加主机"对话框中提供了 SSH 公钥,以便您可以在无需密码的情况下通过 SSH 连接到机器。

流程

  1. 验证您的主机已开机。
  2. 如果您选择了 DHCP 网络,检查 DHCP 服务器是否已启用。
  3. 如果您选择了 静态 IP、网桥和绑定网络,请检查您的配置是否正确。
  4. 验证您可以使用 SSH、一个控制台(如 BMC)或虚拟机控制台来访问主机机器:

    $ ssh core@<host_ip_address>

    如果没有存储在默认目录中,您可以使用 -i 参数指定私钥文件。

    $ ssh -i <ssh_private_key_file> core@<host_ip_address>

    如果您没有 ssh 到主机,则主机在启动过程中会失败,或者无法配置网络。

    登录后,您应该看到这个信息:

    登录示例

    screenshot of assisted iso login message 如果没有看到这个信息,这意味着主机没有使用 assisted-installer ISO 引导。确保正确配置了引导顺序(主机应该从 live-ISO 启动一次)。

  5. 检查代理服务日志:

    $ sudo journalctl -u agent.service

    在以下示例中,错误表示存在网络问题:

    代理服务日志的代理服务日志截图示例

    screenshot of agent service log

    如果拉取代理镜像出现错误,请检查代理设置。验证主机是否已连接到网络。您可以使用 nmcli 来获取有关网络配置的额外信息。

15.5. 验证代理可以访问 assisted-service

先决条件

  • 您已使用 API 创建基础架构环境,或使用 UI 创建集群。
  • 已使用基础架构环境发现 ISO 引导主机,主机无法注册。
  • 您验证了发现代理正在运行。

流程

  • 检查代理日志以验证代理可以访问 Assisted Service:

    $ sudo journalctl TAG=agent

    以下示例中的错误表示代理无法访问 Assisted Service。

    代理日志示例

    screenshot of the agent log failing to access the Assisted Service

    检查您为集群配置的代理设置。如果配置,代理必须允许访问 Assisted Service URL。

15.6. 更正主机的引导顺序

当作为发现镜像一部分的安装完成后,辅助安装程序将重启主机。  主机必须从其安装磁盘引导,才能继续组成集群。  如果您没有正确配置主机的引导顺序,它将从另一个磁盘启动,这会中断安装。

如果主机再次引导发现镜像,辅助安装程序将立即检测到此事件,并将主机的状态设置为 Installing Pending User Action。  或者,如果 Assisted Installer 没有检测到主机已在分配的时间内引导了正确的磁盘,它也将设置此主机状态。

流程

  • 重启主机并设置其引导顺序以从安装磁盘引导。如果您没有选择安装磁盘,辅助安装程序为您选择一个。要查看所选安装磁盘,请点击以展开主机清单中的主机信息,并检查哪个磁盘具有"安装磁盘"角色。

15.7. 修复部分成功安装

有些情况下,辅助安装程序声明安装成功,即使它遇到错误:

  • 如果您请求安装 OLM operator 且一个或多个无法安装,请登录到集群的控制台来修复失败。
  • 如果您请求安装多个 worker 节点,且至少有一个无法安装,但至少两个成功,请将失败的 worker 添加到安装的集群。

法律通告

Copyright © 2023 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.