×

关于将 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 服务证书请求的有效性并批准它们的方法。

准备云镜像

需要 Amazon 机器镜像 (AMI),因为 AWS 无法直接使用各种镜像格式。您可以使用 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 |
+---------------------------+-----------------------------------------------------+------------------------+
其他资源

准备运行 playbook 的机器

在将使用 Red Hat Enterprise Linux (RHEL) 作为操作系统的计算机器添加到 OpenShift Container Platform 4.17 集群之前,必须准备一台 RHEL 8 机器来运行一个 Ansible playbook,该 playbook 将新节点添加到集群。这台机器不是集群的一部分,但必须能够访问它。

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

  • 以具有 cluster-admin 权限的用户身份登录。

步骤
  1. 确保集群的 kubeconfig 文件和用于安装集群的安装程序都在 RHEL 8 机器上。完成此操作的一种方法是使用与安装集群相同的机器。

  2. 配置机器以访问您计划用作计算机器的所有 RHEL 主机。您可以使用公司允许的任何方法,包括带有 SSH 代理的堡垒机或 VPN。

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

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

  4. 如果您尚未注册,请将机器注册到 RHSM 并附加一个具有 OpenShift 订阅的池。

    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. 启用 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"
  6. 安装所需的软件包,包括 openshift-ansible

    # yum install openshift-ansible openshift-clients jq

    openshift-ansible 软件包提供安装程序实用程序并引入将 RHEL 计算节点添加到集群所需的其它软件包,例如 Ansible、playbook 和相关的配置文件。openshift-clients 提供 oc CLI,而 jq 软件包则改善了命令行上 JSON 输出的显示。

准备 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> 标签标记所有现有安全组,否则 Elastic Load Balancing (ELB) 将无法创建负载均衡器。

将 RHEL 计算机器添加到您的集群

您可以将使用 Red Hat Enterprise Linux 作为操作系统的计算机器添加到 OpenShift Container Platform 4.17 集群。

先决条件
  • 您已在运行 playbook 的机器上安装了所需的软件包并进行了必要的配置。

  • 您已准备好用于安装的 RHEL 主机。

步骤

在您已准备好的将运行 playbook 的机器上执行以下步骤

  1. 创建一个名为 /<path>/inventory/hosts 的 Ansible 清单文件,该文件定义您的计算机器主机和所需变量

    [all:vars]
    ansible_user=root (1)
    #ansible_become=True (2)
    
    openshift_kubeconfig_path="~/.kube/config" (3)
    
    [new_workers] (4)
    mycluster-rhel8-0.example.com
    mycluster-rhel8-1.example.com
    1 指定在远程计算机器上运行 Ansible 任务的用户名称。
    2 如果您没有为 ansible_user 指定 root,则必须将 ansible_become 设置为 True 并为用户分配 sudo 权限。
    3 指定集群 kubeconfig 文件的路径和文件名。
    4 列出要添加到集群中的每个 RHEL 机器。您必须为每个主机提供完全限定域名。此名称是集群用于访问机器的主机名,因此请设置正确的公共或私有名称以访问机器。
  2. 导航到 Ansible playbook 目录

    $ cd /usr/share/ansible/openshift-ansible
  3. 运行 playbook

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

批准机器的证书签名请求

将机器添加到集群时,会为每个添加的机器生成两个待处理的证书签名请求 (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 execoc rshoc logs 命令将无法成功,因为 API 服务器连接到 kubelet 时需要服务证书。任何联系 Kubelet 端点的操作都需要此证书批准到位。该方法必须监视新的 CSR,确认 CSR 是由system:nodesystem: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 之前,某些 Operators 可能会不可用。

  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 主机文件所需的 parameters

在将 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 文件的本地目录的路径和文件名。

配置文件的路径和名称。

可选:从集群中删除 RHCOS 计算机器

将 Red Hat Enterprise Linux (RHEL) 计算机器添加到集群后,您可以选择删除 Red Hat Enterprise Linux CoreOS (RHCOS) 计算机器以释放资源。

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

步骤
  1. 查看机器列表并记录 RHCOS 计算机器的节点名称

    $ oc get nodes -o wide
  2. 对于每个 RHCOS 计算机器,删除节点

    1. 通过运行oc adm cordon命令将节点标记为不可调度。

      $ oc adm cordon <node_name> (1)
      1 指定其中一台 RHCOS 计算机器的节点名称。
    2. 从节点中排空所有 Pod

      $ oc adm drain <node_name> --force --delete-emptydir-data --ignore-daemonsets (1)
      1 指定您已隔离的 RHCOS 计算机器的节点名称。
    3. 删除节点

      $ oc delete nodes <node_name> (1)
      1 指定您已排空的 RHCOS 计算机器的节点名称。
  3. 查看计算机器列表,确保仅保留 RHEL 节点

    $ oc get nodes -o wide
  4. 从集群计算机器的负载均衡器中删除 RHCOS 机器。您可以删除虚拟机或重新映像 RHCOS 计算机器的物理硬件。