×

OpenShift Container Platform同时支持通过Ignition进行集群范围和每台机器的配置,这允许对操作系统进行任意分区和文件内容更改。一般来说,如果Red Hat Enterprise Linux (RHEL)中记录了配置文件,则通过Ignition修改它受支持。

有两种方法可以部署机器配置更改

  • 创建包含在清单文件中的机器配置,以便在openshift-install期间启动集群。

  • 创建通过机器配置操作器传递给正在运行的OpenShift Container Platform节点的机器配置。

此外,修改参考配置(例如,在安装裸机节点时传递给coreos-installer的Ignition配置)允许进行每台机器的配置。这些更改目前对机器配置操作器不可见。

以下部分描述了您可能希望以这种方式在节点上配置的功能。

使用Butane创建机器配置

机器配置用于通过指示机器如何创建用户和文件系统、设置网络、安装systemd单元等等来配置控制平面和工作机器。

由于修改机器配置可能很困难,您可以使用Butane配置为您创建机器配置,从而使节点配置变得更容易。

关于Butane

Butane是一个命令行实用程序,OpenShift Container Platform使用它来提供方便的简写语法来编写机器配置,以及执行机器配置的其他验证。Butane接受的Butane配置文件的格式在OpenShift Butane配置规范中定义。

安装Butane

您可以安装Butane工具 (butane) 以从命令行界面创建OpenShift Container Platform机器配置。您可以通过下载相应的二进制文件在Linux、Windows或macOS上安装butane

Butane版本与旧版本以及Fedora CoreOS配置转换器 (FCCT) 向后兼容。

步骤
  1. 导航到Butane镜像下载页面 https://mirror.openshift.com/pub/openshift-v4/clients/butane/.

  2. 获取butane二进制文件

    1. 对于最新版本的Butane,将最新的butane镜像保存到您的当前目录

      $ curl https://mirror.openshift.com/pub/openshift-v4/clients/butane/latest/butane --output butane
    2. 可选:对于您正在安装Butane的特定类型的架构,例如aarch64或ppc64le,请指示相应的URL。例如

      $ curl https://mirror.openshift.com/pub/openshift-v4/clients/butane/latest/butane-aarch64 --output butane
  3. 使下载的二进制文件可执行

    $ chmod +x butane
  4. butane二进制文件移动到PATH上的目录。

    要检查您的PATH,请打开终端并执行以下命令

    $ echo $PATH
验证步骤
  • 您现在可以通过运行butane命令来使用Butane工具

    $ butane <butane_file>

使用Butane创建MachineConfig对象

您可以使用Butane生成MachineConfig对象,以便在安装时或通过机器配置操作器配置工作节点或控制平面节点。

先决条件
  • 您已安装butane实用程序。

步骤
  1. 创建一个Butane配置文件。以下示例创建一个名为99-worker-custom.bu的文件,该文件将系统控制台配置为显示内核调试消息,并指定chrony时间服务的自定义设置

    variant: openshift
    version: 4.17.0
    metadata:
      name: 99-worker-custom
      labels:
        machineconfiguration.openshift.io/role: worker
    openshift:
      kernel_arguments:
        - loglevel=7
    storage:
      files:
        - path: /etc/chrony.conf
          mode: 0644
          overwrite: true
          contents:
            inline: |
              pool 0.rhel.pool.ntp.org iburst
              driftfile /var/lib/chrony/drift
              makestep 1.0 3
              rtcsync
              logdir /var/log/chrony

    99-worker-custom.bu文件设置为为工作节点创建机器配置。要在控制平面节点上部署,请将角色从worker更改为master。要同时执行两者,您可以使用不同的文件名重复整个过程,用于两种类型的部署。

  2. 将上一步创建的文件提供给 Butane,以创建一个MachineConfig对象。

    $ butane 99-worker-custom.bu -o ./99-worker-custom.yaml

    系统会为您创建一个MachineConfig对象YAML文件,供您完成机器配置。

  3. 保存 Butane 配置,以便将来需要更新MachineConfig对象。

  4. 如果集群尚未运行,请生成清单文件并将MachineConfig对象YAML文件添加到openshift目录。如果集群已运行,请按如下方式应用该文件:

    $ oc create -f 99-worker-custom.yaml

添加第一天启动内核参数

虽然通常建议将修改内核参数作为第二天活动,但您可能希望在初始集群安装期间将内核参数添加到所有主节点或工作节点。以下是一些您可能希望在集群安装期间添加内核参数的原因,以便它们在系统首次启动之前生效:

  • 您需要在系统启动之前进行一些低级网络配置。

  • 您想禁用某个功能,例如 SELinux,以便它在系统首次启动时不会对其产生影响。

    不支持在生产环境中禁用 RHCOS 上的 SELinux。一旦在节点上禁用了 SELinux,必须在重新包含到生产集群之前重新配置它。

要将内核参数添加到主节点或工作节点,您可以创建一个MachineConfig对象并将该对象注入到集群设置期间 Ignition 使用的清单文件集中。

有关可在启动时传递给 RHEL 8 内核的参数列表,请参阅Kernel.org 内核参数。最好仅在需要完成初始 OpenShift Container Platform 安装时才使用此过程添加内核参数。

步骤
  1. 切换到包含安装程序的目录,并为集群生成 Kubernetes 清单。

    $ ./openshift-install create manifests --dir <installation_directory>
  2. 决定是否要将内核参数添加到工作节点或控制平面节点。

  3. openshift目录中,创建一个文件(例如,99-openshift-machineconfig-master-kargs.yaml)来定义一个MachineConfig对象以添加内核设置。此示例将loglevel=7内核参数添加到控制平面节点。

    $ cat << EOF > 99-openshift-machineconfig-master-kargs.yaml
    apiVersion: machineconfiguration.openshift.io/v1
    kind: MachineConfig
    metadata:
      labels:
        machineconfiguration.openshift.io/role: master
      name: 99-openshift-machineconfig-master-kargs
    spec:
      kernelArguments:
        - loglevel=7
    EOF

    您可以将master更改为worker,以改为将内核参数添加到工作节点。创建单独的 YAML 文件以添加到主节点和工作节点。

现在您可以继续创建集群。

向节点添加内核模块

对于大多数常用硬件,Linux 内核包含在计算机启动时使用该硬件所需的设备驱动程序模块。但是,对于某些硬件,Linux 中没有可用的模块。因此,您必须找到一种方法向每个主机计算机提供这些模块。此过程描述了如何在 OpenShift Container Platform 集群中的节点上执行此操作。

首次按照这些说明部署内核模块时,该模块将可用于当前内核。如果安装了新的内核,kmods-via-containers 软件将重建并部署该模块,以便该模块的兼容版本可用于新内核。

此功能能够使模块在每个节点上保持更新的方式是:

  • 向每个节点添加一个 systemd 服务,该服务在启动时启动,以检测是否安装了新内核,并且

  • 如果检测到新内核,则该服务将重建模块并将其安装到内核。

有关此过程所需软件的信息,请参阅kmods-via-containers github 站点。

需要牢记一些重要问题:

  • 此过程为技术预览版。

  • 软件工具和示例尚未以官方 RPM 形式提供,目前只能从过程中提到的非官方github.com站点获取。

  • 您可能通过这些过程添加的第三方内核模块不受 Red Hat 支持。

  • 在此过程中,构建内核模块所需的软件部署在 RHEL 8 容器中。请记住,当节点获得新内核时,每个节点上的模块都会自动重建。因此,每个节点都需要访问包含重建模块所需的内核和相关软件包的yum存储库。最好使用有效的 RHEL 订阅提供此内容。

构建和测试内核模块容器

在将内核模块部署到 OpenShift Container Platform 集群之前,您可以在单独的 RHEL 系统上测试该过程。收集内核模块的源代码、KVC 框架和 kmod-via-containers 软件。然后构建和测试模块。要在 RHEL 8 系统上执行此操作,请执行以下操作:

步骤
  1. 注册 RHEL 8 系统

    # subscription-manager register
  2. 将订阅附加到 RHEL 8 系统

    # subscription-manager attach --auto
  3. 安装构建软件和容器所需的软件

    # yum install podman make git -y
  4. 克隆kmod-via-containers存储库

    1. 为存储库创建一个文件夹

      $ mkdir kmods; cd kmods
    2. 克隆存储库

      $ git clone https://github.com/kmods-via-containers/kmods-via-containers
  5. 在您的 RHEL 8 构建主机上安装 KVC 框架实例以测试模块。这将添加一个kmods-via-container systemd 服务并加载它。

    1. 切换到kmod-via-containers目录

      $ cd kmods-via-containers/
    2. 安装 KVC 框架实例

      $ sudo make install
    3. 重新加载 systemd 管理器配置

      $ sudo systemctl daemon-reload
  6. 获取内核模块源代码。源代码可能用于构建您无法控制但由他人提供的第三方模块。您将需要类似于kvc-simple-kmod示例中显示的内容,可以将其克隆到您的系统,如下所示:

    $ cd .. ; git clone https://github.com/kmods-via-containers/kvc-simple-kmod
  7. 在此示例中,编辑配置文件simple-kmod.conf文件,并将 Dockerfile 的名称更改为Dockerfile.rhel

    1. 切换到kvc-simple-kmod目录

      $ cd kvc-simple-kmod
    2. 重命名 Dockerfile

      $ cat simple-kmod.conf
      Dockerfile 示例
      KMOD_CONTAINER_BUILD_CONTEXT="https://github.com/kmods-via-containers/kvc-simple-kmod.git"
      KMOD_CONTAINER_BUILD_FILE=Dockerfile.rhel
      KMOD_SOFTWARE_VERSION=dd1a7d4
      KMOD_NAMES="simple-kmod simple-procfs-kmod"
  8. 为您的内核模块创建一个[email protected]实例,在此示例中为simple-kmod

    $ sudo make install
  9. 启用[email protected]实例。

    $ sudo kmods-via-containers build simple-kmod $(uname -r)
  10. 启用并启动 systemd 服务。

    $ sudo systemctl enable [email protected] --now
    1. 查看服务状态。

      $ sudo systemctl status [email protected]
      示例输出
      [email protected] - Kmods Via Containers - simple-kmod
         Loaded: loaded (/etc/systemd/system/[email protected];
                enabled; vendor preset: disabled)
         Active: active (exited) since Sun 2020-01-12 23:49:49 EST; 5s ago...
  11. 要确认内核模块已加载,请使用lsmod命令列出模块。

    $ lsmod | grep simple_
    示例输出
    simple_procfs_kmod     16384  0
    simple_kmod            16384  0
  12. 可选。使用其他方法检查simple-kmod示例是否有效。

    • 使用dmesg在内核环形缓冲区中查找“Hello world”消息。

      $ dmesg | grep 'Hello world'
      示例输出
      [ 6420.761332] Hello world from simple_kmod.
    • 检查/procsimple-procfs-kmod的值。

      $ sudo cat /proc/simple-procfs-kmod
      示例输出
      simple-procfs-kmod number = 0
    • 运行spkut命令以从模块获取更多信息。

      $ sudo spkut 44
      示例输出
      KVC: wrapper simple-kmod for 4.18.0-147.3.1.el8_1.x86_64
      Running userspace wrapper using the kernel module container...
      + podman run -i --rm --privileged
         simple-kmod-dd1a7d4:4.18.0-147.3.1.el8_1.x86_64 spkut 44
      simple-procfs-kmod number = 0
      simple-procfs-kmod number = 44

将来,系统启动时,此服务将检查是否正在运行新的内核。如果存在新内核,则服务会构建新版本的内核模块,然后加载它。如果模块已构建,则只需加载它。

向 OpenShift Container Platform 预配内核模块

根据 OpenShift Container Platform 集群首次启动时是否必须安装内核模块,您可以通过以下两种方式之一设置内核模块的部署:

  • 在集群安装时预配内核模块(第一天):您可以将内容创建为一个MachineConfig对象,并通过将其与一组清单文件一起包含来提供给openshift-install

  • 通过 Machine Config Operator 预配内核模块(第二天):如果您可以在集群启动并运行后添加内核模块,则可以通过 Machine Config Operator (MCO) 部署内核模块软件。

无论哪种情况,每个节点都需要能够在检测到新内核时获取内核包和相关的软件包。您可以通过几种方式设置每个节点以获取该内容。

  • 为每个节点提供 RHEL 授权。

  • 从现有的 RHEL 主机(位于/etc/pki/entitlement目录)获取 RHEL 授权,并将它们复制到构建 Ignition 配置时提供的其他文件所在的同一位置。

  • 在 Dockerfile 中,添加指向包含内核和其他包的yum存储库的指针。这必须包括根据需要匹配新安装的内核的新内核包。

通过 MachineConfig 对象预配内核模块

通过使用MachineConfig对象打包内核模块软件,您可以将该软件在安装时或通过 Machine Config Operator 传递给工作节点或控制平面节点。

步骤
  1. 注册 RHEL 8 系统

    # subscription-manager register
  2. 将订阅附加到 RHEL 8 系统

    # subscription-manager attach --auto
  3. 安装构建软件所需的软件

    # yum install podman make git -y
  4. 创建一个目录来托管内核模块和工具

    $ mkdir kmods; cd kmods
  5. 获取kmods-via-containers软件

    1. 克隆kmods-via-containers存储库

      $ git clone https://github.com/kmods-via-containers/kmods-via-containers
    2. 克隆kvc-simple-kmod存储库

      $ git clone https://github.com/kmods-via-containers/kvc-simple-kmod
  6. 获取您的模块软件。在此示例中,使用kvc-simple-kmod

  7. 创建一个 fakeroot 目录,并使用前面克隆的存储库填充要通过 Ignition 传递的文件。

    1. 创建目录

      $ FAKEROOT=$(mktemp -d)
    2. 切换到kmod-via-containers目录

      $ cd kmods-via-containers
    3. 安装 KVC 框架实例

      $ make install DESTDIR=${FAKEROOT}/usr/local CONFDIR=${FAKEROOT}/etc/
    4. 切换到kvc-simple-kmod目录

      $ cd ../kvc-simple-kmod
    5. 创建实例

      $ make install DESTDIR=${FAKEROOT}/usr/local CONFDIR=${FAKEROOT}/etc/
  8. 通过运行以下命令克隆 fakeroot 目录,将所有符号链接替换为其目标的副本:

    $ cd .. && rm -rf kmod-tree && cp -Lpr ${FAKEROOT} kmod-tree
  9. 创建一个 Butane 配置文件99-simple-kmod.bu,该文件嵌入内核模块树并启用 systemd 服务。

    有关 Butane 的信息,请参见“使用 Butane 创建机器配置”。

    variant: openshift
    version: 4.17.0
    metadata:
      name: 99-simple-kmod
      labels:
        machineconfiguration.openshift.io/role: worker (1)
    storage:
      trees:
        - local: kmod-tree
    systemd:
      units:
        - name: [email protected]
          enabled: true
    1 要在控制平面节点上部署,请将worker更改为master。要在控制平面节点和工作节点上部署,请对每种节点类型执行以下其余说明。
  10. 使用 Butane 生成一个机器配置 YAML 文件99-simple-kmod.yaml,其中包含要传递的文件和配置。

    $ butane 99-simple-kmod.bu --files-dir . -o 99-simple-kmod.yaml
  11. 如果集群尚未启动,请生成清单文件并将此文件添加到openshift目录。如果集群已运行,请按如下方式应用该文件:

    $ oc create -f 99-simple-kmod.yaml

    您的节点将启动[email protected]服务,并将加载内核模块。

  12. 要确认内核模块是否已加载,您可以登录到节点(使用oc debug node/,然后chroot /host)。要列出模块,请使用lsmod命令。

    $ lsmod | grep simple_
    示例输出
    simple_procfs_kmod     16384  0
    simple_kmod            16384  0

在安装过程中加密和镜像磁盘

在 OpenShift Container Platform 安装期间,您可以在集群节点上启用引导磁盘加密和镜像。

关于磁盘加密

您可以在安装时为控制平面节点和计算节点上的引导磁盘启用加密。OpenShift Container Platform 支持可信平台模块 (TPM) v2 和 Tang 加密模式。

TPM v2

这是首选模式。TPM v2 将密码存储在服务器上的安全加密处理器中。您可以使用此模式来防止在将磁盘从服务器移除后解密集群节点上的引导磁盘数据。

Tang

Tang 和 Clevis 是服务器和客户端组件,它们启用基于网络的磁盘加密 (NBDE)。您可以将集群节点上的引导磁盘数据绑定到一个或多个 Tang 服务器。这将防止解密数据,除非节点位于可以访问 Tang 服务器的安全网络上。Clevis 是一个自动解密框架,用于在客户端实现解密。

仅在用户预配的基础架构上的裸机和 vSphere 安装中支持使用 Tang 加密模式加密磁盘。

在早期版本的 Red Hat Enterprise Linux CoreOS (RHCOS) 中,磁盘加密是通过在 Ignition 配置中指定/etc/clevis.json来配置的。在使用 OpenShift Container Platform 4.7 或更高版本创建的集群中,不支持该文件。请使用以下步骤配置磁盘加密。

启用 TPM v2 或 Tang 加密模式后,RHCOS 引导磁盘将使用 LUKS2 格式加密。

此功能

  • 适用于安装程序预配的基础架构、用户预配的基础架构和 Assisted Installer 部署

  • 对于 Assisted Installer 部署

    • 每个集群只能有一种加密方法,Tang 或 TPM

    • 可以在某些节点或所有节点上启用加密

    • 没有 Tang 阈值;所有服务器都必须有效且可运行

    • 加密仅适用于安装磁盘,而不适用于工作负载磁盘

  • 仅在 Red Hat Enterprise Linux CoreOS (RHCOS) 系统上受支持

  • 在清单安装阶段设置磁盘加密,从首次启动开始加密写入磁盘的所有数据

  • 无需用户干预即可提供密码

  • 使用 AES-256-XTS 加密,如果启用 FIPS 模式,则使用 AES-256-CBC 加密

配置加密阈值

在 OpenShift Container Platform 中,您可以指定对多个 Tang 服务器的要求。您还可以同时配置 TPM v2 和 Tang 加密模式。这仅在存在 TPM 安全加密处理器并且可以通过安全网络访问 Tang 服务器时才启用引导磁盘数据解密。

您可以在 Butane 配置中使用threshold属性来定义解密发生所需的 TPM v2 和 Tang 加密条件的最小数量。

当通过声明的条件的任何组合达到指定的值时,就会满足阈值。在离线预配的情况下,离线服务器是使用包含的广告访问的,并且仅当在线服务器的数量不满足设置的阈值时才使用该提供的广告。

例如,以下配置中threshold值为2可以通过访问两个 Tang 服务器(离线服务器可用作备份)或通过访问 TPM 安全加密处理器和一个 Tang 服务器来达到。

磁盘加密的 Butane 配置示例
variant: openshift
version: 4.17.0
metadata:
  name: worker-storage
  labels:
    machineconfiguration.openshift.io/role: worker
boot_device:
  layout: x86_64 (1)
  luks:
    tpm2: true (2)
    tang: (3)
      - url: http://tang1.example.com:7500
        thumbprint: jwGN5tRFK-kF6pIX89ssF3khxxX
      - url: http://tang2.example.com:7500
        thumbprint: VCJsvZFjBSIHSldw78rOrq7h2ZF
      - url: http://tang3.example.com:7500
        thumbprint: PLjNyRdGw03zlRoGjQYMahSZGu9
        advertisement: "{\"payload\": \"...\", \"protected\": \"...\", \"signature\": \"...\"}" (4)
    threshold: 2 (5)
openshift:
  fips: true
1 将此字段设置为集群节点的指令集体系结构。一些示例包括x86_64aarch64ppc64le
2 如果您要使用可信平台模块 (TPM) 来加密根文件系统,请包含此字段。
3 如果您要使用一个或多个 Tang 服务器,请包含此部分。
4 可选:包含此字段以进行离线预配。Ignition 将预配 Tang 服务器绑定,而不是在运行时从服务器获取广告。这允许服务器在预配时不可用。
5 指定解密发生所需的 TPM v2 和 Tang 加密条件的最小数量。

默认的threshold值为1。如果在配置中包含多个加密条件但未指定阈值,则只要满足任何一个条件,即可进行解密。

如果需要使用 TPM v2 *和* Tang 进行解密,则threshold属性的值必须等于所述 Tang 服务器总数加一。如果threshold值较低,则可以使用单一加密模式达到阈值。例如,如果将tpm2设置为true并指定两个 Tang 服务器,则即使 TPM 安全加密处理器不可用,也可以通过访问两个 Tang 服务器来满足阈值 2

关于磁盘镜像

在控制平面和工作节点上安装 OpenShift Container Platform 期间,您可以启用引导磁盘和其他磁盘到两个或多个冗余存储设备的镜像。只要有一个设备可用,节点在存储设备故障后仍可继续运行。

镜像不支持替换故障磁盘。重新配置节点以将镜像恢复到原始的、非降级的状态。

对于用户提供的基础设施部署,镜像仅在 RHCOS 系统上可用。镜像支持适用于使用 BIOS 或 UEFI 引导的x86_64节点和ppc64le节点。

配置磁盘加密和镜像

您可以在 OpenShift Container Platform 安装期间启用和配置加密和镜像。

先决条件
  • 您已在安装节点上下载了 OpenShift Container Platform 安装程序。

  • 您已在安装节点上安装了 Butane。

    Butane 是 OpenShift Container Platform 使用的命令行实用程序,它提供方便的简写语法来编写和验证机器配置。更多信息,请参见“使用 Butane 创建机器配置”。

  • 您可以访问一台 Red Hat Enterprise Linux (RHEL) 8 机器,该机器可用于生成 Tang 交换密钥的指纹。

步骤
  1. 如果要使用 TPM v2 加密集群,请检查是否需要为每个节点的主机固件中启用 TPM v2 加密。大多数戴尔系统都需要此操作。请查看您特定系统的说明书。

  2. 如果要使用 Tang 加密集群,请按照以下准备步骤操作

    1. 设置 Tang 服务器或访问现有服务器。有关说明,请参见 基于网络的磁盘加密

    2. 如果尚未安装,请在 RHEL 8 机器上安装clevis软件包。

      $ sudo yum install clevis
    3. 在 RHEL 8 机器上,运行以下命令以生成交换密钥的指纹。将http://tang1.example.com:7500替换为您的 Tang 服务器的 URL

      $ clevis-encrypt-tang '{"url":"http://tang1.example.com:7500"}' < /dev/null > /dev/null (1)
      1 在此示例中,tangd.socket在 Tang 服务器的 7500 端口上监听。

      clevis-encrypt-tang 命令生成交换密钥的指纹。在此步骤中,不会将数据传递给加密命令;此处/dev/null作为输入而不是纯文本。加密的输出也发送到/dev/null,因为此过程不需要它。

      示例输出
      The advertisement contains the following signing keys:
      
      PLjNyRdGw03zlRoGjQYMahSZGu9 (1)
      
      1 交换密钥的指纹。

      当显示Do you wish to trust these keys? [ynYN]提示时,输入Y

    4. 可选:用于离线 Tang 配置

      1. 使用curl命令从服务器获取广告。将http://tang2.example.com:7500替换为您的 Tang 服务器的 URL

        $ curl -f http://tang2.example.com:7500/adv > adv.jws && cat adv.jws
        预期输出
        {"payload": "eyJrZXlzIjogW3siYWxnIjogIkV", "protected": "eyJhbGciOiJFUzUxMiIsImN0eSI", "signature": "ADLgk7fZdE3Yt4FyYsm0pHiau7Q"}
      2. 向 Clevis 提供广告文件以进行加密

        $ clevis-encrypt-tang '{"url":"http://tang2.example.com:7500","adv":"adv.jws"}' < /dev/null > /dev/null
    5. 如果节点配置了静态 IP 地址,请运行coreos-installer iso customize --dest-karg-append或在安装 RHCOS 节点时使用coreos-installer --append-karg选项来设置已安装系统的 IP 地址。附加ip=和其他网络所需的参数。

      一些配置静态 IP 的方法不会在第一次启动后影响 initramfs,并且不适用于 Tang 加密。这些方法包括coreos-installer --copy-network选项、coreos-installer iso customize --network-keyfile选项和coreos-installer pxe customize --network-keyfile选项,以及在安装过程中向实时 ISO 或 PXE 映像的内核命令行添加ip=参数。静态 IP 配置不正确会导致节点的第二次启动失败。

  3. 在安装节点上,更改到包含安装程序的目录并生成集群的 Kubernetes 清单

    $ ./openshift-install create manifests --dir <installation_directory> (1)
    1 <installation_directory>替换为您要将安装文件存储到的目录的路径。
  4. 创建一个 Butane 配置文件来配置磁盘加密、镜像或两者。例如,要为计算节点配置存储,请创建一个$HOME/clusterconfig/worker-storage.bu文件。

    引导设备的 Butane 配置示例
    variant: openshift
    version: 4.17.0
    metadata:
      name: worker-storage (1)
      labels:
        machineconfiguration.openshift.io/role: worker (1)
    boot_device:
      layout: x86_64 (2)
      luks: (3)
        tpm2: true (4)
        tang: (5)
          - url: http://tang1.example.com:7500 (6)
            thumbprint: PLjNyRdGw03zlRoGjQYMahSZGu9 (7)
          - url: http://tang2.example.com:7500
            thumbprint: VCJsvZFjBSIHSldw78rOrq7h2ZF
            advertisement: "{"payload": "eyJrZXlzIjogW3siYWxnIjogIkV", "protected": "eyJhbGciOiJFUzUxMiIsImN0eSI", "signature": "ADLgk7fZdE3Yt4FyYsm0pHiau7Q"}" (8)
        threshold: 1 (9)
      mirror: (10)
        devices: (11)
          - /dev/sda
          - /dev/sdb
    openshift:
      fips: true (12)
    1 对于控制平面配置,请在这两个位置将worker替换为master
    2 将此字段设置为集群节点的指令集体系结构。一些示例包括x86_64aarch64ppc64le
    3 如果要加密根文件系统,请包含此部分。更多详细信息,请参见“关于磁盘加密”。
    4 如果您要使用可信平台模块 (TPM) 来加密根文件系统,请包含此字段。
    5 如果您要使用一个或多个 Tang 服务器,请包含此部分。
    6 指定 Tang 服务器的 URL。在此示例中,tangd.socket在 Tang 服务器的 7500 端口上监听。
    7 指定交换密钥指纹,该指纹是在之前的步骤中生成的。
    8 可选:以有效的 JSON 格式指定离线 Tang 服务器的广告。
    9 指定必须满足的 TPM v2 和 Tang 加密条件的最小数量才能进行解密。默认值为1。有关此主题的更多信息,请参见“配置加密阈值”。
    10 如果要镜像引导磁盘,请包含此部分。更多详细信息,请参见“关于磁盘镜像”。
    11 列出应包含在引导磁盘镜像中的所有磁盘设备,包括将安装 RHCOS 的磁盘。
    12 包含此指令可在集群上启用 FIPS 模式。

    要为集群启用 FIPS 模式,必须从配置为在 FIPS 模式下运行的 Red Hat Enterprise Linux (RHEL) 计算机运行安装程序。有关在 RHEL 上配置 FIPS 模式的更多信息,请参见 在 FIPS 模式下安装系统。如果要配置节点以同时使用磁盘加密和镜像,则必须在同一个 Butane 配置文件中配置这两个功能。如果要在启用 FIPS 模式的节点上配置磁盘加密,则必须在同一个 Butane 配置文件中包含fips指令,即使在单独的清单中也启用了 FIPS 模式。

  5. 从相应的 Butane 配置文件创建控制平面或计算节点清单,并将其保存到<installation_directory>/openshift目录。例如,要为计算节点创建清单,请运行以下命令

    $ butane $HOME/clusterconfig/worker-storage.bu -o <installation_directory>/openshift/99-worker-storage.yaml

    对于每个需要磁盘加密或镜像的节点类型,重复此步骤。

  6. 保存 Butane 配置文件,以防将来需要更新清单。

  7. 继续进行 OpenShift Container Platform 安装的其余部分。

    您可以在安装期间监控 RHCOS 节点上的控制台日志,以查找与磁盘加密或镜像相关的错误消息。

    如果配置了其他数据分区,除非明确请求加密,否则它们不会被加密。

验证

安装 OpenShift Container Platform 后,您可以验证集群节点上是否启用了引导磁盘加密或镜像。

  1. 从安装主机使用调试 Pod 访问集群节点

    1. 启动节点的调试 Pod,例如

      $ oc debug node/compute-1
    2. /host设置为调试 shell 中的根目录。调试 Pod 将节点的根文件系统挂载到 Pod 内的/host。通过将根目录更改为/host,您可以运行节点上可执行路径中包含的二进制文件。

      # chroot /host

      运行 Red Hat Enterprise Linux CoreOS (RHCOS) 的 OpenShift Container Platform 集群节点是不可变的,并且依赖于 Operators 来应用集群更改。不建议使用 SSH 访问集群节点。但是,如果 OpenShift Container Platform API 不可用,或者目标节点上的kubelet无法正常工作,则oc操作将受到影响。在这种情况下,可以使用ssh core@<node>.<cluster_name>.<base_domain>代替访问节点。

  2. 如果您配置了启动盘加密,请验证其是否已启用。

    1. 在调试 shell 中,查看节点上根映射的状态。

      # cryptsetup status root
      示例输出
      /dev/mapper/root is active and is in use.
        type:    LUKS2 (1)
        cipher:  aes-xts-plain64 (2)
        keysize: 512 bits
        key location: keyring
        device:  /dev/sda4 (3)
        sector size:  512
        offset:  32768 sectors
        size:    15683456 sectors
        mode:    read/write
      1 加密格式。启用 TPM v2 或 Tang 加密模式时,RHCOS 启动盘将使用 LUKS2 格式加密。
      2 用于加密 LUKS2 卷的加密算法。如果启用 FIPS 模式,则使用aes-cbc-essiv:sha256密码。
      3 包含加密 LUKS2 卷的设备。如果启用了镜像,则该值将表示软件镜像设备,例如/dev/md126
    2. 列出绑定到加密设备的 Clevis 插件。

      # clevis luks list -d /dev/sda4 (1)
      1 指定在上一步输出的device字段中列出的设备。
      示例输出
      1: sss '{"t":1,"pins":{"tang":[{"url":"http://tang.example.com:7500"}]}}' (1)
      
      1 在示例输出中,Tang 插件由/dev/sda4设备的 Shamir’s Secret Sharing (SSS) Clevis 插件使用。
  3. 如果您配置了镜像,请验证其是否已启用。

    1. 在调试 shell 中,列出节点上的软件 RAID 设备。

      # cat /proc/mdstat
      示例输出
      Personalities : [raid1]
      md126 : active raid1 sdb3[1] sda3[0] (1)
      	  393152 blocks super 1.0 [2/2] [UU]
      
      md127 : active raid1 sda4[0] sdb4[1] (2)
      	  51869632 blocks super 1.2 [2/2] [UU]
      
      unused devices: <none>
      1 /dev/md126软件 RAID 镜像设备使用集群节点上的/dev/sda3/dev/sdb3磁盘设备。
      2 /dev/md127软件 RAID 镜像设备使用集群节点上的/dev/sda4/dev/sdb4磁盘设备。
    2. 查看上一步命令输出中列出的每个软件 RAID 设备的详细信息。以下示例列出了/dev/md126设备的详细信息。

      # mdadm --detail /dev/md126
      示例输出
      /dev/md126:
                 Version : 1.0
           Creation Time : Wed Jul  7 11:07:36 2021
              Raid Level : raid1 (1)
              Array Size : 393152 (383.94 MiB 402.59 MB)
           Used Dev Size : 393152 (383.94 MiB 402.59 MB)
            Raid Devices : 2
           Total Devices : 2
             Persistence : Superblock is persistent
      
             Update Time : Wed Jul  7 11:18:24 2021
                   State : clean (2)
          Active Devices : 2 (3)
         Working Devices : 2 (3)
          Failed Devices : 0 (4)
           Spare Devices : 0
      
      Consistency Policy : resync
      
                    Name : any:md-boot (5)
                    UUID : ccfa3801:c520e0b5:2bee2755:69043055
                  Events : 19
      
          Number   Major   Minor   RaidDevice State
             0     252        3        0      active sync   /dev/sda3 (6)
             1     252       19        1      active sync   /dev/sdb3 (6)
      
      1 指定设备的 RAID 级别。raid1表示 RAID 1 磁盘镜像。
      2 指定 RAID 设备的状态。
      3 指出处于活动状态并正常工作的底层磁盘设备的数量。
      4 指出处于故障状态的底层磁盘设备的数量。
      5 软件 RAID 设备的名称。
      6 提供有关软件 RAID 设备使用的底层磁盘设备的信息。
    3. 列出挂载在软件 RAID 设备上的文件系统。

      # mount | grep /dev/md
      示例输出
      /dev/md127 on / type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,prjquota)
      /dev/md127 on /etc type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,prjquota)
      /dev/md127 on /usr type xfs (ro,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,prjquota)
      /dev/md127 on /sysroot type xfs (ro,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,prjquota)
      /dev/md127 on /var type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,prjquota)
      /dev/md127 on /var/lib/containers/storage/overlay type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,prjquota)
      /dev/md127 on /var/lib/kubelet/pods/e5054ed5-f882-4d14-b599-99c050d4e0c0/volume-subpaths/etc/tuned/1 type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,prjquota)
      /dev/md127 on /var/lib/kubelet/pods/e5054ed5-f882-4d14-b599-99c050d4e0c0/volume-subpaths/etc/tuned/2 type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,prjquota)
      /dev/md127 on /var/lib/kubelet/pods/e5054ed5-f882-4d14-b599-99c050d4e0c0/volume-subpaths/etc/tuned/3 type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,prjquota)
      /dev/md127 on /var/lib/kubelet/pods/e5054ed5-f882-4d14-b599-99c050d4e0c0/volume-subpaths/etc/tuned/4 type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,prjquota)
      /dev/md127 on /var/lib/kubelet/pods/e5054ed5-f882-4d14-b599-99c050d4e0c0/volume-subpaths/etc/tuned/5 type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,prjquota)
      /dev/md126 on /boot type ext4 (rw,relatime,seclabel)

      在示例输出中,/boot文件系统挂载在/dev/md126软件 RAID 设备上,根文件系统挂载在/dev/md127上。

  4. 对每种 OpenShift Container Platform 节点类型重复验证步骤。

其他资源

配置启用 RAID 的数据卷

您可以启用软件 RAID 分区以提供外部数据卷。OpenShift Container Platform 支持 RAID 0、RAID 1、RAID 4、RAID 5、RAID 6 和 RAID 10,以实现数据保护和容错。有关更多详细信息,请参阅“关于磁盘镜像”。

OpenShift Container Platform 4.17 不支持安装驱动器上的软件 RAID。

先决条件
  • 您已在安装节点上下载了 OpenShift Container Platform 安装程序。

  • 您已在安装节点上安装 Butane。

    Butane 是 OpenShift Container Platform 使用的命令行实用程序,它提供方便的简写语法来编写机器配置,以及执行机器配置的附加验证。有关更多信息,请参阅“使用 Butane 创建机器配置”部分。

步骤
  1. 创建一个 Butane 配置,使用软件 RAID 配置数据卷。

    • 要在与镜像启动盘相同的磁盘上使用 RAID 1 配置数据卷,请创建一个$HOME/clusterconfig/raid1-storage.bu文件,例如

      镜像启动盘上的 RAID 1
      variant: openshift
      version: 4.17.0
      metadata:
        name: raid1-storage
        labels:
          machineconfiguration.openshift.io/role: worker
      boot_device:
        mirror:
          devices:
            - /dev/disk/by-id/scsi-3600508b400105e210000900000490000
            - /dev/disk/by-id/scsi-SSEAGATE_ST373453LW_3HW1RHM6
      storage:
        disks:
          - device: /dev/disk/by-id/scsi-3600508b400105e210000900000490000
            partitions:
              - label: root-1
                size_mib: 25000 (1)
              - label: var-1
          - device: /dev/disk/by-id/scsi-SSEAGATE_ST373453LW_3HW1RHM6
            partitions:
              - label: root-2
                size_mib: 25000 (1)
              - label: var-2
        raid:
          - name: md-var
            level: raid1
            devices:
              - /dev/disk/by-partlabel/var-1
              - /dev/disk/by-partlabel/var-2
        filesystems:
          - device: /dev/md/md-var
            path: /var
            format: xfs
            wipe_filesystem: true
            with_mount_unit: true
      1 向启动盘添加数据分区时,建议最小值为 25000 MiB。如果未指定值,或者指定的值小于建议的最小值,则生成的根文件系统将太小,并且将来重新安装 RHCOS 可能会覆盖数据分区的开头。
    • 要在辅助磁盘上使用 RAID 1 配置数据卷,请创建一个$HOME/clusterconfig/raid1-alt-storage.bu文件,例如

      辅助磁盘上的 RAID 1
      variant: openshift
      version: 4.17.0
      metadata:
        name: raid1-alt-storage
        labels:
          machineconfiguration.openshift.io/role: worker
      storage:
        disks:
          - device: /dev/sdc
            wipe_table: true
            partitions:
              - label: data-1
          - device: /dev/sdd
            wipe_table: true
            partitions:
              - label: data-2
        raid:
          - name: md-var-lib-containers
            level: raid1
            devices:
              - /dev/disk/by-partlabel/data-1
              - /dev/disk/by-partlabel/data-2
        filesystems:
          - device: /dev/md/md-var-lib-containers
            path: /var/lib/containers
            format: xfs
            wipe_filesystem: true
            with_mount_unit: true
  2. 从上一步创建的 Butane 配置创建 RAID 清单,并将其保存到<installation_directory>/openshift目录。例如,要为计算节点创建清单,请运行以下命令:

    $ butane $HOME/clusterconfig/<butane_config>.bu -o <installation_directory>/openshift/<manifest_name>.yaml (1)
    1 <butane_config><manifest_name>替换为上一步中的文件名。例如,辅助磁盘为raid1-alt-storage.buraid1-alt-storage.yaml
  3. 保存 Butane 配置,以防将来需要更新清单。

  4. 继续进行 OpenShift Container Platform 安装的其余部分。

配置 Intel® Virtual RAID on CPU (VROC) 数据卷

Intel® VROC 是一种混合 RAID 类型,其中某些维护工作卸载到硬件,但对操作系统显示为软件 RAID。

以下过程配置启用 Intel® VROC 的 RAID1。

先决条件
  • 您的系统启用了 Intel® Volume Management Device (VMD)。

步骤
  1. 通过运行以下命令创建 Intel® Matrix Storage Manager (IMSM) RAID 容器:

    $ mdadm -CR /dev/md/imsm0 -e \
      imsm -n2 /dev/nvme0n1 /dev/nvme1n1 (1)
    1 RAID 设备名称。在此示例中,列出了两个设备。如果您提供两个以上的设备名称,则必须调整-n标志。例如,列出三个设备将使用标志-n3
  2. 在容器内创建 RAID1 存储。

    1. 通过运行以下命令在真正的 RAID1 卷前面创建一个虚拟 RAID0 卷:

      $ mdadm -CR /dev/md/dummy -l0 -n2 /dev/imsm0 -z10M --assume-clean
    2. 通过运行以下命令创建真正的 RAID1 阵列:

      $ mdadm -CR /dev/md/coreos -l1 -n2 /dev/imsm0
    3. 停止 RAID0 和 RAID1 成员阵列,并使用以下命令删除虚拟 RAID0 阵列:

      $ mdadm -S /dev/md/dummy \
        mdadm -S /dev/md/coreos \
        mdadm --kill-subarray=0 /dev/md/imsm0
    4. 通过运行以下命令重新启动 RAID1 阵列:

      $ mdadm -A /dev/md/coreos /dev/md/imsm0
  3. 在 RAID1 设备上安装 RHCOS。

    1. 通过运行以下命令获取 IMSM 容器的 UUID:

      $ mdadm --detail --export /dev/md/imsm0
    2. 安装 RHCOS 并包含rd.md.uuid内核参数,方法是运行以下命令:

      $ coreos-installer install /dev/md/coreos \
        --append-karg rd.md.uuid=<md_UUID> (1)
        ...
      1 IMSM 容器的 UUID。

      包含安装 RHCOS 所需的任何其他coreos-installer参数。

配置 chrony 时间服务

您可以通过修改chrony.conf文件的内容并将这些内容作为机器配置传递给您的节点,来设置 chrony 时间服务(chronyd)使用的时钟服务器和相关设置。

步骤
  1. 创建一个包含chrony.conf文件内容的 Butane 配置。例如,要在工作节点上配置 chrony,请创建一个99-worker-chrony.bu文件。

    有关 Butane 的信息,请参见“使用 Butane 创建机器配置”。

    variant: openshift
    version: 4.17.0
    metadata:
      name: 99-worker-chrony (1)
      labels:
        machineconfiguration.openshift.io/role: worker (1)
    storage:
      files:
      - path: /etc/chrony.conf
        mode: 0644 (2)
        overwrite: true
        contents:
          inline: |
            pool 0.rhel.pool.ntp.org iburst (3)
            driftfile /var/lib/chrony/drift
            makestep 1.0 3
            rtcsync
            logdir /var/log/chrony
    1 在控制平面节点上,在这两个位置将worker替换为master
    2 在机器配置文件中为mode字段指定八进制值模式。创建文件并应用更改后,mode将转换为十进制值。您可以使用命令oc get mc <mc-name> -o yaml检查 YAML 文件。
    3 指定任何有效且可访问的时间源,例如您的 DHCP 服务器提供的源。或者,您可以指定以下任何 NTP 服务器:1.rhel.pool.ntp.org2.rhel.pool.ntp.org3.rhel.pool.ntp.org
  2. 使用 Butane 生成一个MachineConfig对象文件99-worker-chrony.yaml,其中包含要传递给节点的配置。

    $ butane 99-worker-chrony.bu -o 99-worker-chrony.yaml
  3. 可以通过两种方式之一应用配置

    • 如果集群尚未运行,在生成清单文件后,将MachineConfig对象文件添加到<installation_directory>/openshift目录,然后继续创建集群。

    • 如果集群已经在运行,请应用该文件。

      $ oc apply -f ./99-worker-chrony.yaml

其他资源