×

关于向集群添加 RHEL 计算节点

在 OpenShift Container Platform 4.17 中,如果您在 `x86_64` 架构上使用用户预配或安装程序预配的基础架构安装,则可以选择在集群中使用 Red Hat Enterprise Linux (RHEL) 机器作为计算机器。您必须在集群中为控制平面机器使用 Red Hat Enterprise Linux CoreOS (RHCOS) 机器。

如果您选择在集群中使用 RHEL 计算机器,则您负责所有操作系统生命周期管理和维护。您必须执行系统更新、应用补丁并完成所有其他必需的任务。

对于安装程序预配的基础架构集群,您必须手动添加 RHEL 计算机器,因为安装程序预配的基础架构集群中的自动缩放默认情况下会添加 Red Hat Enterprise Linux CoreOS (RHCOS) 计算机器。

  • 因为从集群中的机器中删除 OpenShift Container Platform 需要销毁操作系统,所以您必须为添加到集群的任何 RHEL 机器使用专用硬件。

  • 添加到 OpenShift Container Platform 集群的所有 RHEL 机器上的交换内存都被禁用。您无法在这些机器上启用交换内存。

RHEL 计算节点的系统要求

OpenShift Container Platform 环境中的 Red Hat Enterprise Linux (RHEL) 计算机器主机必须满足以下最低硬件规格和系统级要求

  • 您必须在您的 Red Hat 帐户上拥有活动的 OpenShift Container Platform 订阅。如果没有,请联系您的销售代表了解更多信息。

  • 生产环境必须提供计算机器以支持您预期的工作负载。作为集群管理员,您必须计算预期的工作负载,并增加约 10% 的开销。对于生产环境,请分配足够的资源,以便节点主机故障不会影响您的最大容量。

  • 每个系统都必须满足以下硬件要求

    • 物理或虚拟系统,或在公共或私有 IaaS 上运行的实例。

    • 基本操作系统:使用 RHEL 8.8 或更高版本,并使用最小安装选项。

      不支持将 RHEL 7 计算机器添加到 OpenShift Container Platform 集群。

      如果您有在过去的 OpenShift Container Platform 版本中以前受支持的 RHEL 7 计算机器,则无法将它们升级到 RHEL 8。您必须部署新的 RHEL 8 主机,并且应删除旧的 RHEL 7 主机。有关更多信息,请参阅“删除节点”部分。

      有关 OpenShift Container Platform 中已弃用或删除的最新主要功能列表,请参阅 OpenShift Container Platform 发行说明中的“已弃用和删除的功能”部分。

    • 如果您在 FIPS 模式下部署了 OpenShift Container Platform,则必须在引导 RHEL 机器之前在其上启用 FIPS。请参阅 RHEL 8 文档中的 启用 FIPS 模式的 RHEL 8 系统安装

      要为您的集群启用 FIPS 模式,您必须从配置为在 FIPS 模式下运行的 Red Hat Enterprise Linux (RHEL) 计算机运行安装程序。有关在 RHEL 上配置 FIPS 模式的更多信息,请参阅 将 RHEL 切换到 FIPS 模式

      在 FIPS 模式下引导 Red Hat Enterprise Linux (RHEL) 或 Red Hat Enterprise Linux CoreOS (RHCOS) 时,OpenShift Container Platform 核心组件仅在 x86_64、ppc64le 和 s390x 架构上使用已提交给 NIST 以进行 FIPS 140-2/140-3 验证的 RHEL 加密库。

    • NetworkManager 1.0 或更高版本。

    • 1 个 vCPU。

    • 至少 8 GB RAM。

    • 包含/var/的文件系统至少需要 15 GB 的硬盘空间。

    • 包含/usr/local/bin/的文件系统至少需要 1 GB 的硬盘空间。

    • 包含其临时目录的文件系统至少需要 1 GB 的硬盘空间。临时系统目录根据 Python 标准库中 tempfile 模块定义的规则确定。

  • 每个系统必须满足系统提供商的任何其他要求。例如,如果您在 VMware vSphere 上安装了集群,则必须根据其存储指南配置磁盘,并且必须设置disk.enableUUID=true属性。

  • 每个系统必须能够使用可解析 DNS 的主机名访问集群的 API 端点。任何现有的网络安全访问控制都必须允许系统访问集群的 API 服务端点。

  • 对于在 Microsoft Azure 上安装的集群

    • 确保系统包含Standard_D8s_v3虚拟机的硬件要求。

    • 启用加速网络。加速网络使用单根 I/O 虚拟化 (SR-IOV) 为 Microsoft Azure VM 提供更直接的交换机路径。

证书签名请求管理

由于您的集群在使用您自己配置的基础设施时对自动机器管理的访问权限有限,因此您必须提供一种机制,用于在安装后批准集群证书签名请求 (CSR)。kube-controller-manager 只批准 kubelet 客户端 CSR。machine-approver 无法保证使用 kubelet 凭据请求的服务证书的有效性,因为它无法确认是正确的机器发出了请求。您必须确定并实现一种验证 kubelet 服务证书请求的有效性并批准它们的方法。

为您的云准备镜像

由于 AWS 无法直接使用各种镜像格式,因此需要 Amazon 机器镜像 (AMI)。您可以使用 Red Hat 提供的 AMI,也可以手动导入您自己的镜像。在配置 EC2 实例之前,必须存在 AMI。您必须列出 AMI ID,以便选择计算机器所需的正确 RHEL 版本。

列出 AWS 上最新的可用 RHEL 镜像

AMI ID 对应于 AWS 的原生启动镜像。由于必须在配置 EC2 实例之前存在 AMI,因此您需要在配置之前知道 AMI ID。AWS 命令行界面 (CLI) 用于列出可用的 Red Hat Enterprise Linux (RHEL) 镜像 ID。

先决条件
  • 您已安装 AWS CLI。

步骤
  • 使用此命令列出 RHEL 8.4 Amazon 机器镜像 (AMI)

    $ aws ec2 describe-images --owners 309956199498 \ (1)
    --query 'sort_by(Images, &CreationDate)[*].[CreationDate,Name,ImageId]' \ (2)
    --filters "Name=name,Values=RHEL-8.4*" \ (3)
    --region us-east-1 \ (4)
    --output table (5)
    
    1 --owners 命令选项根据帐户 ID 309956199498 显示 Red Hat 镜像。

    此帐户 ID 是显示 Red Hat 提供的镜像的 AMI ID 所必需的。

    2 --query 命令选项设置镜像的排序方式,参数为'sort_by(Images, &CreationDate)[*].[CreationDate,Name,ImageId]'。在这种情况下,镜像按创建日期排序,表格结构显示创建日期、镜像名称和 AMI ID。
    3 --filter 命令选项设置显示哪个版本的 RHEL。在此示例中,由于过滤器由"Name=name,Values=RHEL-8.4*"设置,则显示 RHEL 8.4 AMI。
    4 --region 命令选项设置存储 AMI 的区域。
    5 --output 命令选项设置结果的显示方式。

为 AWS 创建 RHEL 计算机器时,请确保 AMI 为 RHEL 8.4 或 8.5。

示例输出
------------------------------------------------------------------------------------------------------------
|                                              DescribeImages                                              |
+---------------------------+-----------------------------------------------------+------------------------+
|  2021-03-18T14:23:11.000Z |  RHEL-8.4.0_HVM_BETA-20210309-x86_64-1-Hourly2-GP2  |  ami-07eeb4db5f7e5a8fb |
|  2021-03-18T14:38:28.000Z |  RHEL-8.4.0_HVM_BETA-20210309-arm64-1-Hourly2-GP2   |  ami-069d22ec49577d4bf |
|  2021-05-18T19:06:34.000Z |  RHEL-8.4.0_HVM-20210504-arm64-2-Hourly2-GP2        |  ami-01fc429821bf1f4b4 |
|  2021-05-18T20:09:47.000Z |  RHEL-8.4.0_HVM-20210504-x86_64-2-Hourly2-GP2       |  ami-0b0af3577fe5e3532 |
+---------------------------+-----------------------------------------------------+------------------------+
其他资源

准备 RHEL 计算节点

在将 Red Hat Enterprise Linux (RHEL) 机器添加到 OpenShift Container Platform 集群之前,必须使用 Red Hat Subscription Manager (RHSM) 注册每个主机,附加活动的 OpenShift Container Platform 订阅,并启用所需的存储库。

  1. 在每个主机上,使用 RHSM 注册

    # subscription-manager register --username=<user_name> --password=<password>
  2. 从 RHSM 获取最新的订阅数据

    # subscription-manager refresh
  3. 列出可用的订阅

    # subscription-manager list --available --matches '*OpenShift*'
  4. 在先前命令的输出中,查找 OpenShift Container Platform 订阅的池 ID 并附加它

    # subscription-manager attach --pool=<pool_id>
  5. 禁用所有 yum 存储库

    1. 禁用所有启用的 RHSM 存储库

      # subscription-manager repos --disable="*"
    2. 列出剩余的 yum 存储库,并记下它们在repo id下的名称(如有)。

      # yum repolist
    3. 使用yum-config-manager禁用剩余的 yum 存储库

      # yum-config-manager --disable <repo_id>

      或者,禁用所有存储库

      # yum-config-manager --disable \*

      请注意,如果您有大量可用的存储库,这可能需要几分钟时间。

  6. 仅启用 OpenShift Container Platform 4.17 所需的存储库

    # subscription-manager repos \
        --enable="rhel-8-for-x86_64-baseos-rpms" \
        --enable="rhel-8-for-x86_64-appstream-rpms" \
        --enable="rhocp-4.17-for-rhel-8-x86_64-rpms" \
        --enable="fast-datapath-for-rhel-8-x86_64-rpms"
  7. 停止并禁用主机上的 firewalld

    # systemctl disable --now firewalld.service

    您以后不得启用 firewalld。如果您这样做,则无法访问工作程序上的 OpenShift Container Platform 日志。

将角色权限附加到 AWS 中的 RHEL 实例

使用浏览器中的 Amazon IAM 控制台,您可以选择所需的权限并将它们分配给工作节点。

步骤
  1. 从 AWS IAM 控制台创建您的所需 IAM 角色

  2. 将 IAM 角色附加到所需的工作节点。

其他资源

将 RHEL 工作节点标记为已拥有或共享

集群使用kubernetes.io/cluster/<clusterid>,Value=(owned|shared)标签的值来确定与 AWS 集群相关的资源的生命周期。

  • 如果应在销毁集群时销毁资源,则应添加owned标签值。

  • 如果资源在集群销毁后继续存在,则应添加shared标签值。此标记表示集群使用此资源,但资源有单独的所有者。

步骤
  • 对于 RHEL 计算机器,必须使用kubernetes.io/cluster/<clusterid>=ownedkubernetes.io/cluster/<cluster-id>=shared标记 RHEL 工作实例。

不要使用kubernetes.io/cluster/<name>,Value=<clusterid>标签标记所有现有安全组,否则弹性负载均衡 (ELB) 将无法创建负载均衡器。

向集群添加更多 RHEL 计算机器

您可以向 OpenShift Container Platform 4.17 集群添加更多使用 Red Hat Enterprise Linux (RHEL) 作为操作系统的计算机器。

先决条件
  • 您的 OpenShift Container Platform 集群已包含 RHEL 计算节点。

  • 用于将第一个 RHEL 计算机器添加到集群的hosts文件位于您用于运行 playbook 的机器上。

  • 您运行 playbook 的机器必须能够访问所有 RHEL 主机。您可以使用公司允许的任何方法,包括带有 SSH 代理的堡垒机或 VPN。

  • 集群的kubeconfig文件和用于安装集群的安装程序位于您用于运行 playbook 的机器上。

  • 您必须准备 RHEL 主机以进行安装。

  • 在您运行 playbook 的机器上配置一个用户,该用户具有对所有 RHEL 主机的 SSH 访问权限。

  • 如果您使用基于 SSH 密钥的身份验证,则必须使用 SSH 代理管理密钥。

  • 在运行 playbook 的机器上安装 OpenShift CLI(oc)。

步骤
  1. 打开 Ansible inventory 文件,路径为 /<path>/inventory/hosts,该文件定义了您的计算机器主机和所需变量。

  2. 将文件中的 [new_workers] 部分重命名为 [workers]

  3. 向文件中添加一个 [new_workers] 部分,并定义每个新主机的完全限定域名。该文件类似于以下示例

    [all:vars]
    ansible_user=root
    #ansible_become=True
    
    openshift_kubeconfig_path="~/.kube/config"
    
    [workers]
    mycluster-rhel8-0.example.com
    mycluster-rhel8-1.example.com
    
    [new_workers]
    mycluster-rhel8-2.example.com
    mycluster-rhel8-3.example.com

    在此示例中,mycluster-rhel8-0.example.commycluster-rhel8-1.example.com 机器位于集群中,您添加了 mycluster-rhel8-2.example.commycluster-rhel8-3.example.com 机器。

  4. 导航到 Ansible playbook 目录

    $ cd /usr/share/ansible/openshift-ansible
  5. 运行扩展 playbook

    $ ansible-playbook -i /<path>/inventory/hosts playbooks/scaleup.yml (1)
    1 对于 <path>,请指定您创建的 Ansible inventory 文件的路径。

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

将机器添加到集群时,会为每个添加的机器生成两个待处理的证书签名请求 (CSR)。您必须确认这些 CSR 已获批准,或者如有必要,自行批准它们。必须先批准客户端请求,然后才能批准服务器请求。

先决条件
  • 您已将机器添加到集群。

步骤
  1. 确认集群是否识别这些机器

    $ oc get nodes
    示例输出
    NAME      STATUS    ROLES   AGE  VERSION
    master-0  Ready     master  63m  v1.30.3
    master-1  Ready     master  63m  v1.30.3
    master-2  Ready     master  64m  v1.30.3

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

    在批准某些 CSR 之前,上述输出可能不包含计算节点(也称为工作节点)。

  2. 查看待处理的 CSR,并确保您看到为添加到集群的每台机器的客户端请求显示的状态为“待处理”或“已批准”。

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

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

  3. 如果 CSR 未获批准,则在您添加的所有机器的待处理 CSR 状态均为“待处理”后,请批准集群机器的 CSR

    由于 CSR 会自动轮换,因此请在将机器添加到集群后一小时内批准您的 CSR。如果您在一小时内未批准它们,证书将轮换,每个节点将存在两个以上的证书。您必须批准所有这些证书。批准客户端 CSR 后,Kubelet 会为服务证书创建辅助 CSR,这需要手动批准。然后,如果 Kubelet 请求具有相同参数的新证书,则 `machine-approver` 会自动批准后续的服务证书续订请求。

    对于在未启用机器 API 的平台(例如裸机和其他用户配置的基础设施)上运行的集群,您必须实现一种自动批准 kubelet 服务证书请求 (CSR) 的方法。如果未批准请求,则 `oc exec`、`oc rsh` 和 `oc logs` 命令将无法成功,因为 API 服务器连接到 kubelet 时需要服务证书。任何联系 Kubelet 端点的操作都需要此证书批准到位。该方法必须监视新的 CSR,确认 CSR 是由 `system:node` 或 `system:admin` 组中的 `node-bootstrapper` 服务帐户提交的,并确认节点的身份。

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

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

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

      在批准某些 CSR 之前,某些操作符可能不可用。

  4. 现在您的客户端请求已获批准,您必须查看添加到集群的每台机器的服务器请求

    $ oc get csr
    示例输出
    NAME        AGE     REQUESTOR                                                                   CONDITION
    csr-bfd72   5m26s   system:node:ip-10-0-50-126.us-east-2.compute.internal                       Pending
    csr-c57lv   5m26s   system:node:ip-10-0-95-157.us-east-2.compute.internal                       Pending
    ...
  5. 如果剩余的 CSR 未获批准且状态为“待处理”,请批准集群机器的 CSR

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

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

      $ oc get csr -o go-template='{{range .items}}{{if not .status}}{{.metadata.name}}{{"\n"}}{{end}}{{end}}' | xargs oc adm certificate approve
  6. 批准所有客户端和服务器 CSR 后,机器将具有“就绪”状态。通过运行以下命令来验证这一点

    $ oc get nodes
    示例输出
    NAME      STATUS    ROLES   AGE  VERSION
    master-0  Ready     master  73m  v1.30.3
    master-1  Ready     master  73m  v1.30.3
    master-2  Ready     master  74m  v1.30.3
    worker-0  Ready     worker  11m  v1.30.3
    worker-1  Ready     worker  11m  v1.30.3

    批准服务器 CSR 后,机器可能需要几分钟才能过渡到“就绪”状态。

其他信息

Ansible 主机文件所需的参数

在将 Red Hat Enterprise Linux (RHEL) 计算机器添加到集群之前,您必须在 Ansible 主机文件中定义以下参数。

参数 描述

ansible_user

允许基于 SSH 的身份验证且无需密码的 SSH 用户。如果您使用基于 SSH 密钥的身份验证,则必须使用 SSH 代理管理密钥。

系统上的用户名。默认值为 root

ansible_become

如果 ansible_user 的值不是 root,则必须将 ansible_become 设置为 True,并且您指定为 ansible_user 的用户必须配置为无密码 sudo 访问。

True。如果该值不是 True,则不要指定和定义此参数。

openshift_kubeconfig_path

指定包含集群 kubeconfig 文件的本地目录的路径和文件名。

配置文件的路径和名称。