×

您可以在 VMware vSphere 上的 OpenShift Container Platform 集群中创建一个 Windows `MachineSet` 对象来服务于特定目的。例如,您可以创建基础架构 Windows 机器集和相关的机器,以便您可以将支持 Windows 的工作负载迁移到新的 Windows 机器。

先决条件

  • 您已使用 Operator Lifecycle Manager (OLM) 安装了 Windows Machine Config Operator (WMCO)。

  • 您正在使用受支持的 Windows Server 作为操作系统镜像。

机器 API 概述

机器 API 是基于上游 Cluster API 项目和自定义 OpenShift Container Platform 资源的主要资源的组合。

对于 OpenShift Container Platform 4.17 集群,在集群安装完成后,机器 API 执行所有节点主机配置管理操作。由于此系统,OpenShift Container Platform 4.17 在公共或私有云基础架构之上提供了一种弹性、动态的配置方法。

两个主要资源是:

机器

描述节点主机的基本单元。机器具有 `providerSpec` 规范,该规范描述了为不同云平台提供的计算节点类型。例如,计算节点的机器类型可能会定义特定的机器类型和所需的元数据。

机器集

`MachineSet` 资源是计算机器的组。计算机器集与计算机器的关系,如同副本集与 Pod 的关系。如果您需要更多计算机器或必须缩减其规模,请更改 `MachineSet` 资源上的 `replicas` 字段以满足您的计算需求。

控制平面机器不能由计算机器集管理。

控制平面机器集为受支持的控制平面机器提供与计算机器集为计算机器提供的类似的管理功能。

更多信息,请参见“管理控制平面机器”。

以下自定义资源为您的集群添加更多功能:

机器自动缩放器

`MachineAutoscaler` 资源会自动缩放云中的计算机器。您可以为指定计算机器集中的节点设置最小和最大缩放边界,机器自动缩放器将维护该节点范围。

`MachineAutoscaler` 对象在 `ClusterAutoscaler` 对象存在后生效。`ClusterAutoscaler` 和 `MachineAutoscaler` 资源都由 `ClusterAutoscalerOperator` 对象提供。

集群自动缩放器

此资源基于上游集群自动缩放器项目。在 OpenShift Container Platform 实现中,它通过扩展计算机器集 API 与机器 API 集成。您可以使用集群自动缩放器以以下方式管理您的集群:

  • 设置集群范围内的资源缩放限制,例如核心、节点、内存和 GPU

  • 设置优先级,以便集群优先处理 Pod,并且不会为不太重要的 Pod 在线引入新节点

  • 设置缩放策略,以便您可以向上扩展节点,但不能向下扩展节点

机器健康检查

`MachineHealthCheck` 资源检测机器何时不健康,将其删除,并在受支持的平台上创建新机器。

在 OpenShift Container Platform 3.11 版本中,由于集群不管理机器配置,因此您无法轻松推出多区域架构。从 OpenShift Container Platform 4.1 版本开始,此过程更加容易。每个计算机器集都作用域到单个区域,因此安装程序代表您跨可用区域发送计算机器集。然后,由于您的计算是动态的,并且面对区域故障时,您始终拥有一个区域,以便您必须重新平衡机器。在没有多个可用区域的全球 Azure 区域中,您可以使用可用性集来确保高可用性。自动缩放器在集群的整个生命周期中提供尽力而为的平衡。

准备您的 vSphere 环境以用于 Windows 容器工作负载

您必须通过创建 vSphere Windows VM 黄金镜像并启用与 WMCO 内部 API 服务器的通信来准备您的 vSphere 环境以用于 Windows 容器工作负载。

创建 vSphere Windows VM 黄金镜像

创建一个 vSphere Windows 虚拟机 (VM) 黄金镜像。

先决条件
  • 您已创建一对私钥/公钥,用于在 OpenSSH 服务器中配置基于密钥的身份验证。私钥还必须配置在 Windows Machine Config Operator (WMCO) 命名空间中。这是允许 WMCO 与 Windows VM 通信所必需的。有关更多详细信息,请参见“为 Windows Machine Config Operator 配置密钥”部分。

在创建 Windows VM 时,在某些情况下必须使用 Microsoft PowerShell 命令。本指南中的 PowerShell 命令以 `PS C:\>` 前缀区分。

步骤
  1. 选择兼容的 Windows Server 版本。当前,Windows Machine Config Operator (WMCO) 稳定版本支持带有操作系统级容器网络补丁 KB5012637 的 Windows Server 2022 长期服务通道。

  2. 使用具有兼容 Windows Server 版本的 VM 黄金镜像在 vSphere 客户端中创建一个新的 VM。有关兼容版本的更多信息,请参见“Red Hat OpenShift 对 Windows 容器的支持发行说明”中的“Windows Machine Config Operator 先决条件”部分。

    您的 VM 的虚拟硬件版本必须满足 OpenShift Container Platform 的基础架构要求。有关更多信息,请参见 OpenShift Container Platform 文档中的“VMware vSphere 基础架构要求”部分。此外,您可以参考 VMware 关于 虚拟机硬件版本 的文档。

  3. 在 Windows VM 上安装并配置 VMware Tools 11.0.6 或更高版本。有关更多信息,请参见 VMware Tools 文档

  4. 在 Windows VM 上安装 VMware Tools 后,验证以下内容:

    1. `C:\ProgramData\VMware\VMware Tools\tools.conf` 文件存在,并包含以下条目:

      exclude-nics=

      如果 `tools.conf` 文件不存在,请使用未注释且设置为空值的 `exclude-nics` 选项创建它。

      此条目确保混合覆盖网络在 Windows VM 上生成的克隆 vNIC 不会被忽略。

    2. Windows VM 在 vCenter 中具有有效的 IP 地址

      C:\> ipconfig
    3. VMTools Windows 服务正在运行

      PS C:\> Get-Service -Name VMTools | Select Status, StartType
  5. 在 Windows VM 上安装并配置 OpenSSH 服务器。有关更多详细信息,请参见 Microsoft 关于 安装 OpenSSH 的文档。

  6. 为管理员用户设置 SSH 访问权限。请参见 Microsoft 关于 管理员用户 的文档来执行此操作。

    说明中使用的公钥必须与您稍后在保存密钥的 WMCO 命名空间中创建的私钥相对应。有关更多详细信息,请参见“为 Windows Machine Config Operator 配置密钥”部分。

  7. 您必须在 Windows VM 中创建一个新的防火墙规则,允许传入的容器日志连接。运行以下 PowerShell 命令以在 TCP 端口 10250 上创建防火墙规则:

    PS C:\> New-NetFirewallRule -DisplayName "ContainerLogsPort" -LocalPort 10250 -Enabled True -Direction Inbound -Protocol TCP -Action Allow -EdgeTraversalPolicy Allow
  8. 克隆 Windows 虚拟机,使其成为可重复使用的镜像。有关详细信息,请参阅 VMware 文档,了解如何克隆现有虚拟机

  9. 在克隆的 Windows 虚拟机中,运行Windows Sysprep 工具

    C:\> C:\Windows\System32\Sysprep\sysprep.exe /generalize /oobe /shutdown /unattend:<path_to_unattend.xml> (1)
    1 指定您的unattend.xml 文件的路径。

    对在 Windows 镜像上运行sysprep 命令的次数有限制。请参阅 Microsoft 的文档了解更多信息。

    提供了一个示例unattend.xml 文件,其中包含 WMCO 所需的所有更改。您必须修改此示例;不能直接使用。

    示例unattend.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <unattend xmlns="urn:schemas-microsoft-com:unattend">
       <settings pass="specialize">
          <component xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="Microsoft-Windows-International-Core" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
             <InputLocale>0409:00000409</InputLocale>
             <SystemLocale>en-US</SystemLocale>
             <UILanguage>en-US</UILanguage>
             <UILanguageFallback>en-US</UILanguageFallback>
             <UserLocale>en-US</UserLocale>
          </component>
          <component xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="Microsoft-Windows-Security-SPP-UX" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
             <SkipAutoActivation>true</SkipAutoActivation>
          </component>
          <component xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="Microsoft-Windows-SQMApi" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
             <CEIPEnabled>0</CEIPEnabled>
          </component>
          <component xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
             <ComputerName>winhost</ComputerName> (1)
          </component>
       </settings>
       <settings pass="oobeSystem">
          <component xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
             <AutoLogon>
                <Enabled>false</Enabled> (2)
             </AutoLogon>
             <OOBE>
                <HideEULAPage>true</HideEULAPage>
                <HideLocalAccountScreen>true</HideLocalAccountScreen>
                <HideOEMRegistrationScreen>true</HideOEMRegistrationScreen>
                <HideOnlineAccountScreens>true</HideOnlineAccountScreens>
                <HideWirelessSetupInOOBE>true</HideWirelessSetupInOOBE>
                <NetworkLocation>Work</NetworkLocation>
                <ProtectYourPC>1</ProtectYourPC>
                <SkipMachineOOBE>true</SkipMachineOOBE>
                <SkipUserOOBE>true</SkipUserOOBE>
             </OOBE>
             <RegisteredOrganization>Organization</RegisteredOrganization>
             <RegisteredOwner>Owner</RegisteredOwner>
             <DisableAutoDaylightTimeSet>false</DisableAutoDaylightTimeSet>
             <TimeZone>Eastern Standard Time</TimeZone>
             <UserAccounts>
                <AdministratorPassword>
                   <Value>MyPassword</Value> (3)
                   <PlainText>true</PlainText>
                </AdministratorPassword>
             </UserAccounts>
          </component>
       </settings>
    </unattend>
    1 指定ComputerName,它必须遵循Kubernetes 的命名规范。这些规范也适用于在创建新虚拟机时对生成的模板执行的访客操作系统自定义。
    2 禁用自动登录,以避免在启动时留下具有管理员权限的开放终端的安全问题。这是默认值,不得更改。
    3 MyPassword 占位符替换为管理员帐户的密码。这可以防止内置管理员帐户默认情况下具有空密码。请遵循 Microsoft 的密码选择最佳实践

    Sysprep 工具完成后,Windows 虚拟机将关闭电源。您不得再使用或开启此虚拟机。

  10. 将 Windows 虚拟机转换为vCenter 中的模板

启用与 vSphere 上 WMCO 的内部 API 服务器的通信

Windows 机器配置操作符 (WMCO) 从内部 API 服务器端点下载 Ignition 配置文件。您必须启用与内部 API 服务器的通信,以便您的 Windows 虚拟机 (VM) 可以下载 Ignition 配置文件,并且配置的虚拟机上的 kubelet 只能与内部 API 服务器通信。

先决条件
  • 您已在 vSphere 上安装集群。

步骤
  • 为指向外部 API 服务器 URL api.<cluster_name>.<base_domain>api-int.<cluster_name>.<base_domain> 添加新的 DNS 条目。这可以是 CNAME 或附加的 A 记录。

外部 API 端点已在 vSphere 上的初始集群安装过程中创建。

vSphere 上 Windows MachineSet 对象的示例 YAML

此示例 YAML 定义了在 VMware vSphere 上运行的 Windows MachineSet 对象,Windows 机器配置操作符 (WMCO) 可以对其做出反应。

apiVersion: machine.openshift.io/v1beta1
kind: MachineSet
metadata:
  labels:
    machine.openshift.io/cluster-api-cluster: <infrastructure_id> (1)
  name: <windows_machine_set_name> (2)
  namespace: openshift-machine-api
spec:
  replicas: 1
  selector:
    matchLabels:
      machine.openshift.io/cluster-api-cluster: <infrastructure_id> (1)
      machine.openshift.io/cluster-api-machineset: <windows_machine_set_name> (2)
  template:
    metadata:
      labels:
        machine.openshift.io/cluster-api-cluster: <infrastructure_id> (1)
        machine.openshift.io/cluster-api-machine-role: worker
        machine.openshift.io/cluster-api-machine-type: worker
        machine.openshift.io/cluster-api-machineset: <windows_machine_set_name> (2)
        machine.openshift.io/os-id: Windows (3)
    spec:
      metadata:
        labels:
          node-role.kubernetes.io/worker: "" (4)
      providerSpec:
        value:
          apiVersion: vsphereprovider.openshift.io/v1beta1
          credentialsSecret:
            name: vsphere-cloud-credentials
          diskGiB: 128 (5)
          kind: VSphereMachineProviderSpec
          memoryMiB: 16384
          network:
            devices:
            - networkName: "<vm_network_name>" (6)
          numCPUs: 4
          numCoresPerSocket: 1
          snapshot: ""
          template: <windows_vm_template_name> (7)
          userDataSecret:
            name: windows-user-data (8)
          workspace:
             datacenter: <vcenter_data_center_name> (9)
             datastore: <vcenter_datastore_name> (10)
             folder: <vcenter_vm_folder_path> (11)
             resourcePool: <vsphere_resource_pool> (12)
             server: <vcenter_server_ip> (13)
1 指定基于您配置集群时设置的集群 ID 的基础架构 ID。您可以通过运行以下命令获取基础架构 ID
$ oc get -o jsonpath='{.status.infrastructureName}{"\n"}' infrastructure cluster
2 指定 Windows 计算机器集名称。由于在 vSphere 中生成机器名称的方式,计算机器集名称不能超过 9 个字符。
3 将计算机器集配置为 Windows 机器。
4 将 Windows 节点配置为计算机器。
5 指定 vSphere 虚拟机磁盘 (VMDK) 的大小。

此参数不会设置 Windows 分区的大小。您可以使用unattend.xml 文件或使用所需磁盘大小创建 vSphere Windows 虚拟机 (VM) 黄金镜像来调整 Windows 分区大小。

6 指定要将计算机器集部署到的 vSphere VM 网络。此 VM 网络必须是集群中其他 Linux 计算机器所在的网络。
7 指定要使用的 vSphere VM 模板的完整路径,例如golden-images/windows-server-template。名称必须唯一。

不要指定原始 VM 模板。VM 模板必须保持关闭状态,并且必须克隆用于新的 Windows 机器。启动 VM 模板会将 VM 模板配置为平台上的 VM,这会阻止它用作计算机器集可以对其应用配置的模板。

8 当配置第一台 Windows 机器时,由 WMCO 创建windows-user-data。之后,所有后续计算机器集都可以使用windows-user-data
9 指定要在此处部署计算机器集的 vCenter 数据中心。
10 指定要在此处部署计算机器集的 vCenter 数据存储。
11 指定 vCenter 中 vSphere VM 文件夹的路径,例如/dc1/vm/user-inst-5ddjd
12 可选:指定 Windows 虚拟机的 vSphere 资源池。
13 指定 vCenter 服务器 IP 或完全限定域名。

创建计算机器集

除了安装程序创建的计算机器集之外,您还可以创建自己的计算机器集,以动态管理您选择的特定工作负载的机器计算资源。

先决条件
  • 部署 OpenShift Container Platform 集群。

  • 安装 OpenShift CLI (oc)。

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

  • 在断开连接的环境中,MachineSet 自定义资源 (CR) 中指定的镜像必须安装OpenSSH 服务器 v0.0.1.0

步骤
  1. 创建一个新的 YAML 文件,其中包含计算机器集自定义资源 (CR) 示例,并将其命名为<file_name>.yaml

    确保您设置了<clusterID><role> 参数值。

  2. 可选:如果您不确定为特定字段设置哪个值,您可以检查集群中现有的计算机器集。

    1. 要列出集群中的计算机器集,请运行以下命令

      $ oc get machinesets -n openshift-machine-api
      示例输出
      NAME                                DESIRED   CURRENT   READY   AVAILABLE   AGE
      agl030519-vplxk-worker-us-east-1a   1         1         1       1           55m
      agl030519-vplxk-worker-us-east-1b   1         1         1       1           55m
      agl030519-vplxk-worker-us-east-1c   1         1         1       1           55m
      agl030519-vplxk-worker-us-east-1d   0         0                             55m
      agl030519-vplxk-worker-us-east-1e   0         0                             55m
      agl030519-vplxk-worker-us-east-1f   0         0                             55m
    2. 要查看特定计算机器集自定义资源 (CR) 的值,请运行以下命令

      $ oc get machineset <machineset_name> \
        -n openshift-machine-api -o yaml
      示例输出
      apiVersion: machine.openshift.io/v1beta1
      kind: MachineSet
      metadata:
        labels:
          machine.openshift.io/cluster-api-cluster: <infrastructure_id> (1)
        name: <infrastructure_id>-<role> (2)
        namespace: openshift-machine-api
      spec:
        replicas: 1
        selector:
          matchLabels:
            machine.openshift.io/cluster-api-cluster: <infrastructure_id>
            machine.openshift.io/cluster-api-machineset: <infrastructure_id>-<role>
        template:
          metadata:
            labels:
              machine.openshift.io/cluster-api-cluster: <infrastructure_id>
              machine.openshift.io/cluster-api-machine-role: <role>
              machine.openshift.io/cluster-api-machine-type: <role>
              machine.openshift.io/cluster-api-machineset: <infrastructure_id>-<role>
          spec:
            providerSpec: (3)
              ...
      1 集群基础架构 ID。
      2 默认节点标签。

      对于具有用户预配基础架构的集群,计算机器集只能创建workerinfra 类型机器。

      3 计算机器集 CR 的<providerSpec> 部分中的值是特定于平台的。有关 CR 中<providerSpec> 参数的更多信息,请参阅您的提供程序的示例计算机器集 CR 配置。
  3. 通过运行以下命令创建MachineSet CR

    $ oc create -f <file_name>.yaml
验证
  • 运行以下命令查看计算机器集列表:

    $ oc get machineset -n openshift-machine-api
    示例输出
    NAME                                       DESIRED   CURRENT   READY   AVAILABLE   AGE
    agl030519-vplxk-windows-worker-us-east-1a  1         1         1       1           11m
    agl030519-vplxk-worker-us-east-1a          1         1         1       1           55m
    agl030519-vplxk-worker-us-east-1b          1         1         1       1           55m
    agl030519-vplxk-worker-us-east-1c          1         1         1       1           55m
    agl030519-vplxk-worker-us-east-1d          0         0                             55m
    agl030519-vplxk-worker-us-east-1e          0         0                             55m
    agl030519-vplxk-worker-us-east-1f          0         0                             55m

    当新的计算机器集可用时,DESIREDCURRENT 值将匹配。如果计算机器集不可用,请等待几分钟后再次运行该命令。

更多资源