×

您可以创建不同的计算机器集合以在您的Amazon Web Services (AWS)上的OpenShift Container Platform集群中服务于特定目的。例如,您可以创建基础架构机器集合和相关的机器,以便您可以将支持的工作负载移动到新机器。

您只能在Machine API可运行的集群中使用高级机器管理和扩展功能。具有用户预配基础架构的集群需要额外的验证和配置才能使用Machine API。

基础架构平台类型为none的集群无法使用Machine API。即使连接到集群的计算机器安装在支持此功能的平台上,此限制仍然适用。此参数安装后无法更改。

要查看集群的平台类型,请运行以下命令

$ oc get infrastructure cluster -o jsonpath='{.status.platform}'

AWS上计算机器集合自定义资源的示例YAML

示例YAML定义了一个在us-east-1a Amazon Web Services (AWS)本地区域中运行的计算机器集合,并创建标记为node-role.kubernetes.io/<role>: ""的节点。

在此示例中,<infrastructure_id>是基于您在预配集群时设置的集群ID的基础架构ID标签,<role>是要添加的节点标签。

apiVersion: machine.openshift.io/v1beta1
kind: MachineSet
metadata:
  labels:
    machine.openshift.io/cluster-api-cluster: <infrastructure_id> (1)
  name: <infrastructure_id>-<role>-<zone> (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>-<zone>
  template:
    metadata:
      labels:
        machine.openshift.io/cluster-api-cluster: <infrastructure_id>
        machine.openshift.io/cluster-api-machine-role: <role> (3)
        machine.openshift.io/cluster-api-machine-type: <role>
        machine.openshift.io/cluster-api-machineset: <infrastructure_id>-<role>-<zone>
    spec:
      metadata:
        labels:
          node-role.kubernetes.io/<role>: ""
      providerSpec:
        value:
          ami:
            id: ami-046fe691f52a953f9 (4)
          apiVersion: machine.openshift.io/v1beta1
          blockDevices:
            - ebs:
                iops: 0
                volumeSize: 120
                volumeType: gp2
          credentialsSecret:
            name: aws-cloud-credentials
          deviceIndex: 0
          iamInstanceProfile:
            id: <infrastructure_id>-worker-profile
          instanceType: m6i.large
          kind: AWSMachineProviderConfig
          placement:
            availabilityZone: <zone> (6)
            region: <region> (7)
          securityGroups:
            - filters:
                - name: tag:Name
                  values:
                    - <infrastructure_id>-node
            - filters:
                - name: tag:Name
                  values:
                    - <infrastructure_id>-lb
          subnet:
            filters:
              - name: tag:Name
                values:
                  - <infrastructure_id>-private-<zone> (8)
          tags:
            - name: kubernetes.io/cluster/<infrastructure_id>
              value: owned
            - name: <custom_tag_name> (5)
              value: <custom_tag_value>
          userDataSecret:
            name: worker-user-data
1 指定基于您在预配集群时设置的集群ID的基础架构ID。如果您安装了OpenShift CLI,则可以通过运行以下命令获取基础架构ID
$ oc get -o jsonpath='{.status.infrastructureName}{"\n"}' infrastructure cluster
2 指定基于集群ID的基础架构ID、角色节点标签和区域。
3 指定要添加的角色节点标签。
4 为您的AWS区域中的OpenShift Container Platform节点指定有效的Red Hat Enterprise Linux CoreOS (RHCOS) Amazon Machine Image (AMI)。如果您想使用AWS Marketplace镜像,则必须完成来自AWS Marketplace的OpenShift Container Platform订阅以获取您所在区域的AMI ID。
$ oc -n openshift-machine-api \
    -o jsonpath='{.spec.template.spec.providerSpec.value.ami.id}{"\n"}' \
    get machineset/<infrastructure_id>-<role>-<zone>
5 可选:为您的集群指定自定义标签数据。例如,您可以通过指定Email:[email protected]name:value对来添加管理员联系电子邮件地址。

自定义标签也可以在安装过程中通过install-config.yml文件指定。如果install-config.yml文件和机器集包含具有相同name数据的标签,则机器集中的标签值优先于install-config.yml文件中的标签值。

6 指定区域,例如us-east-1a
7 指定区域,例如us-east-1
8 指定基础设施ID和区域。

创建计算机器集

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

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

  • 安装OpenShift CLI (oc)。

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

步骤
  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
  4. 如果您需要在其他可用区中使用计算机器集,请重复此过程以创建更多计算机器集。

验证
  • 通过运行以下命令查看计算机器集列表

    $ oc get machineset -n openshift-machine-api
    示例输出
    NAME                                DESIRED   CURRENT   READY   AVAILABLE   AGE
    agl030519-vplxk-infra-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值将匹配。如果计算机器集不可用,请等待几分钟,然后再次运行该命令。

为集群自动伸缩器标记 GPU 机器集

您可以使用机器集标签来指示集群自动伸缩器可以使用哪些机器来部署支持 GPU 的节点。

先决条件
  • 您的集群使用集群自动伸缩器。

步骤
  • 在您想要创建机器的机器集上,集群自动伸缩器将使用这些机器来部署支持 GPU 的节点,添加cluster-api/accelerator标签

    apiVersion: machine.openshift.io/v1beta1
    kind: MachineSet
    metadata:
      name: machine-set-name
    spec:
      template:
        spec:
          metadata:
            labels:
              cluster-api/accelerator: nvidia-t4 (1)
    1 指定您选择的标签,该标签由字母数字字符、-_.组成,并以字母数字字符开头和结尾。例如,您可以使用nvidia-t4来表示 Nvidia T4 GPU,或使用nvidia-a10g来表示 A10G GPU。

    您必须为ClusterAutoscaler CR 中的spec.resourceLimits.gpus.type参数指定此标签的值。有关更多信息,请参阅“集群自动伸缩器资源定义”。

使用机器集将机器分配给弹性结构适配器实例的放置组

您可以配置机器集以在现有 AWS 放置组中的弹性结构适配器 (EFA) 实例上部署机器。

EFA 实例不需要放置组,您可以将放置组用于配置 EFA 以外的目的。此示例同时使用两者来演示可以提高指定放置组内机器网络性能的配置。

先决条件
  • 您已在 AWS 控制台中创建了一个放置组。

    确保您创建的放置组类型的规则和限制与您的预期用例兼容。

步骤
  1. 在文本编辑器中,打开现有机器集的 YAML 文件或创建一个新的 YAML 文件。

  2. 编辑providerSpec字段下的以下行

    apiVersion: machine.openshift.io/v1beta1
    kind: MachineSet
    # ...
    spec:
      template:
        spec:
          providerSpec:
            value:
              instanceType: <supported_instance_type> (1)
              networkInterfaceType: EFA (2)
              placement:
                availabilityZone: <zone> (3)
                region: <region> (4)
              placementGroupName: <placement_group> (5)
              placementGroupPartition: <placement_group_partition_number> (6)
    # ...
    1 指定支持 EFA的实例类型。
    2 指定EFA网络接口类型。
    3 指定区域,例如us-east-1a
    4 指定区域,例如us-east-1
    5 指定要在此处部署机器的现有 AWS 放置组的名称。
    6 可选:指定要在此处部署机器的现有 AWS 放置组的分区号。
验证
  • 在 AWS 控制台中,查找机器集创建的机器,并验证机器属性中的以下内容:

    • 放置组字段的值与您为机器集中的placementGroupName参数指定的值相同。

    • 分区号字段的值与您为机器集中的placementGroupPartition参数指定的值相同。

    • 接口类型字段指示它使用 EFA。

Amazon EC2 实例元数据服务的机器集选项

您可以使用机器集创建使用特定版本的 Amazon EC2 实例元数据服务 (IMDS) 的机器。机器集可以创建允许同时使用 IMDSv1 和IMDSv2的机器,或者创建需要使用 IMDSv2 的机器。

仅在使用 OpenShift Container Platform 4.7 或更高版本创建的 AWS 集群上支持使用 IMDSv2。

要使用您首选的 IMDS 配置部署新的计算机器,请使用适当的值创建一个计算机器集 YAML 文件。当机器集规模扩大时,您还可以编辑现有机器集以使用您首选的 IMDS 配置创建新机器。

在配置机器集以创建需要 IMDSv2 的机器之前,请确保与 AWS 元数据服务交互的任何工作负载都支持 IMDSv2。

使用机器集配置 IMDS

您可以通过添加或编辑机器机器集 YAML 文件中metadataServiceOptions.authentication的值来指定是否需要使用 IMDSv2。

先决条件
  • 要使用 IMDSv2,您的 AWS 集群必须使用 OpenShift Container Platform 4.7 或更高版本创建。

步骤
  • providerSpec字段下添加或编辑以下行

    providerSpec:
      value:
        metadataServiceOptions:
          authentication: Required (1)
    1 要需要 IMDSv2,请将参数值设置为Required。要允许同时使用 IMDSv1 和 IMDSv2,请将参数值设置为Optional。如果未指定值,则允许使用 IMDSv1 和 IMDSv2。

将机器作为专用实例部署的机器集

您可以创建一个在 AWS 上运行的机器集,该机器集将机器部署为专用实例。专用实例在专用于单个客户的硬件上的虚拟私有云 (VPC) 中运行。这些 Amazon EC2 实例在主机硬件级别是物理隔离的。即使实例属于链接到单个付费账户的不同 AWS 账户,专用实例的隔离仍然存在。但是,如果其他非专用实例属于同一 AWS 账户,则它们可以与专用实例共享硬件。

机器 API 支持具有公共或专用租用的实例。具有公共租用的实例运行在共享硬件上。公共租用是默认租用。具有专用租用的实例运行在单租户硬件上。

使用机器集创建专用实例

您可以使用机器 API 集成运行由专用实例支持的机器。在您的机器集 YAML 文件中设置tenancy字段以在 AWS 上启动专用实例。

步骤
  • providerSpec字段下指定专用租用

    providerSpec:
      placement:
        tenancy: dedicated

将机器部署为抢占实例的机器集

您可以通过创建在 AWS 上运行的计算机器集来节省成本,该机器集将机器部署为非保证的抢占实例。抢占实例利用未使用的 AWS EC2 容量,并且比按需实例更便宜。您可以将抢占实例用于可以容忍中断的工作负载,例如批处理或无状态的水平可扩展工作负载。

AWS EC2 随时可以终止抢占实例。发生中断时,AWS 会向用户发出两分钟的警告。当 AWS 发出终止警告时,OpenShift Container Platform 开始从受影响的实例中删除工作负载。

使用抢占实例时,可能会由于以下原因发生中断:

  • 实例价格超过您的最高价格

  • 对抢占实例的需求增加

  • 抢占实例的供应减少

当 AWS 终止实例时,在抢占实例节点上运行的终止处理程序会删除机器资源。为了满足计算机器集replicas数量,计算机器集将创建一个请求抢占实例的机器。

使用计算机器集创建抢占实例

您可以通过将spotMarketOptions添加到您的计算机器集 YAML 文件来在 AWS 上启动抢占实例。

步骤
  • providerSpec字段下添加以下行

    providerSpec:
      value:
        spotMarketOptions: {}

    您可以选择设置spotMarketOptions.maxPrice字段来限制抢占实例的成本。例如,您可以设置maxPrice: '2.50'

    如果设置了maxPrice,则此值将用作每小时的最高抢占价格。如果未设置,则最高价格默认为按需实例价格。

    强烈建议使用默认的按需价格作为maxPrice值,并且不要为抢占实例设置最高价格。

向现有的 OpenShift Container Platform 集群添加 GPU 节点

您可以复制和修改默认的计算机器集配置,以创建支持 GPU 的机器集和 AWS EC2 云提供商的机器。

有关支持的实例类型的更多信息,请参阅以下 NVIDIA 文档:

步骤
  1. 通过运行以下命令查看现有节点、机器和机器集。请注意,每个节点都是具有特定 AWS 区域和 OpenShift Container Platform 角色的机器定义的实例。

    $ oc get nodes
    示例输出
    NAME                                        STATUS   ROLES                  AGE     VERSION
    ip-10-0-52-50.us-east-2.compute.internal    Ready    worker                 3d17h   v1.30.3
    ip-10-0-58-24.us-east-2.compute.internal    Ready    control-plane,master   3d17h   v1.30.3
    ip-10-0-68-148.us-east-2.compute.internal   Ready    worker                 3d17h   v1.30.3
    ip-10-0-68-68.us-east-2.compute.internal    Ready    control-plane,master   3d17h   v1.30.3
    ip-10-0-72-170.us-east-2.compute.internal   Ready    control-plane,master   3d17h   v1.30.3
    ip-10-0-74-50.us-east-2.compute.internal    Ready    worker                 3d17h   v1.30.3
  2. 通过运行以下命令查看openshift-machine-api命名空间中存在的机器和机器集。每个计算机器集都与 AWS 区域内的不同可用区相关联。安装程序会自动在可用区之间负载均衡计算机器。

    $ oc get machinesets -n openshift-machine-api
    示例输出
    NAME                                        DESIRED   CURRENT   READY   AVAILABLE   AGE
    preserve-dsoc12r4-ktjfc-worker-us-east-2a   1         1         1       1           3d11h
    preserve-dsoc12r4-ktjfc-worker-us-east-2b   2         2         2       2           3d11h
  3. 通过运行以下命令查看openshift-machine-api命名空间中存在的机器。目前,每个机器集只有一个计算机器,尽管可以扩展计算机器集以在特定区域和区域中添加节点。

    $ oc get machines -n openshift-machine-api | grep worker
    示例输出
    preserve-dsoc12r4-ktjfc-worker-us-east-2a-dts8r      Running   m5.xlarge   us-east-2   us-east-2a   3d11h
    preserve-dsoc12r4-ktjfc-worker-us-east-2b-dkv7w      Running   m5.xlarge   us-east-2   us-east-2b   3d11h
    preserve-dsoc12r4-ktjfc-worker-us-east-2b-k58cw      Running   m5.xlarge   us-east-2   us-east-2b   3d11h
  4. 通过运行以下命令复制一个现有的计算MachineSet定义并将结果输出到 JSON 文件。这将成为支持 GPU 的计算机器集定义的基础。

    $ oc get machineset preserve-dsoc12r4-ktjfc-worker-us-east-2a -n openshift-machine-api -o json > <output_file.json>
  5. 编辑 JSON 文件,并对新的MachineSet定义进行以下更改:

    • worker替换为gpu。这将是新机器集的名称。

    • 将新MachineSet定义的实例类型更改为g4dn,其中包括 NVIDIA Tesla T4 GPU。要了解有关 AWS g4dn 实例类型的更多信息,请参阅加速计算

      $ jq .spec.template.spec.providerSpec.value.instanceType preserve-dsoc12r4-ktjfc-worker-gpu-us-east-2a.json
      
      "g4dn.xlarge"

      <output_file.json>文件保存为preserve-dsoc12r4-ktjfc-worker-gpu-us-east-2a.json

  6. 更新preserve-dsoc12r4-ktjfc-worker-gpu-us-east-2a.json中的以下字段:

    • .metadata.name为包含gpu的名称。

    • .spec.selector.matchLabels["machine.openshift.io/cluster-api-machineset"]以匹配新的.metadata.name

    • .spec.template.metadata.labels["machine.openshift.io/cluster-api-machineset"]以匹配新的.metadata.name

    • .spec.template.spec.providerSpec.value.instanceTypeg4dn.xlarge

  7. 要验证您的更改,请运行以下命令执行原始计算定义和新的支持 GPU 的节点定义的diff

    $ oc -n openshift-machine-api get preserve-dsoc12r4-ktjfc-worker-us-east-2a -o json | diff preserve-dsoc12r4-ktjfc-worker-gpu-us-east-2a.json -
    示例输出
    10c10
    
    < "name": "preserve-dsoc12r4-ktjfc-worker-gpu-us-east-2a",
    ---
    > "name": "preserve-dsoc12r4-ktjfc-worker-us-east-2a",
    
    21c21
    
    < "machine.openshift.io/cluster-api-machineset": "preserve-dsoc12r4-ktjfc-worker-gpu-us-east-2a"
    ---
    > "machine.openshift.io/cluster-api-machineset": "preserve-dsoc12r4-ktjfc-worker-us-east-2a"
    
    31c31
    
    < "machine.openshift.io/cluster-api-machineset": "preserve-dsoc12r4-ktjfc-worker-gpu-us-east-2a"
    ---
    > "machine.openshift.io/cluster-api-machineset": "preserve-dsoc12r4-ktjfc-worker-us-east-2a"
    
    60c60
    
    < "instanceType": "g4dn.xlarge",
    ---
    > "instanceType": "m5.xlarge",
  8. 通过运行以下命令创建支持 GPU 的计算机器集:

    $ oc create -f preserve-dsoc12r4-ktjfc-worker-gpu-us-east-2a.json
    示例输出
    machineset.machine.openshift.io/preserve-dsoc12r4-ktjfc-worker-gpu-us-east-2a created
验证
  1. 通过运行以下命令查看您创建的机器集:

    $ oc -n openshift-machine-api get machinesets | grep gpu

    MachineSet 副本计数设置为1,因此会自动创建一个新的Machine对象。

    示例输出
    preserve-dsoc12r4-ktjfc-worker-gpu-us-east-2a   1         1         1       1           4m21s
  2. 通过运行以下命令查看机器集创建的Machine对象:

    $ oc -n openshift-machine-api get machines | grep gpu
    示例输出
    preserve-dsoc12r4-ktjfc-worker-gpu-us-east-2a    running    g4dn.xlarge   us-east-2   us-east-2a  4m36s

请注意,无需为节点指定命名空间。节点定义是集群范围的。

部署节点功能发现 Operator

创建支持 GPU 的节点后,您需要发现支持 GPU 的节点,以便可以对其进行调度。为此,请安装节点功能发现 (NFD) Operator。NFD Operator 可识别节点中的硬件设备功能。它解决了识别和编目基础架构节点中的硬件资源的普遍问题,以便可以将其提供给 OpenShift Container Platform。

步骤
  1. 从 OpenShift Container Platform 控制台中的**OperatorHub**安装节点功能发现 Operator。

  2. 在**OperatorHub**中安装 NFD Operator 后,从已安装的 Operators 列表中选择**节点功能发现**,然后选择**创建实例**。这将在openshift-nfd命名空间中安装nfd-masternfd-worker Pod,每个计算节点一个nfd-worker Pod。

  3. 通过运行以下命令验证 Operator 是否已安装并正在运行:

    $ oc get pods -n openshift-nfd
    示例输出
    NAME                                       READY    STATUS     RESTARTS   AGE
    
    nfd-controller-manager-8646fcbb65-x5qgk    2/2      Running 7  (8h ago)   1d
  4. 在控制台中浏览到已安装的 Operator,然后选择**创建节点功能发现**。

  5. 选择**创建**以构建 NFD 自定义资源。这会在openshift-nfd命名空间中创建 NFD Pod,这些 Pod 会轮询 OpenShift Container Platform 节点以获取硬件资源并对其进行编目。

验证
  1. 成功构建后,通过运行以下命令验证 NFD Pod 是否在每个节点上运行:

    $ oc get pods -n openshift-nfd
    示例输出
    NAME                                       READY   STATUS      RESTARTS        AGE
    nfd-controller-manager-8646fcbb65-x5qgk    2/2     Running     7 (8h ago)      12d
    nfd-master-769656c4cb-w9vrv                1/1     Running     0               12d
    nfd-worker-qjxb2                           1/1     Running     3 (3d14h ago)   12d
    nfd-worker-xtz9b                           1/1     Running     5 (3d14h ago)   12d

    NFD Operator 使用供应商 PCI ID 来识别节点中的硬件。NVIDIA 使用 PCI ID 10de

  2. 通过运行以下命令查看 NFD Operator 发现的 NVIDIA GPU:

    $ oc describe node ip-10-0-132-138.us-east-2.compute.internal | egrep 'Roles|pci'
    示例输出
    Roles: worker
    
    feature.node.kubernetes.io/pci-1013.present=true
    
    feature.node.kubernetes.io/pci-10de.present=true
    
    feature.node.kubernetes.io/pci-1d0f.present=true

    GPU启用节点的节点特征列表中出现了10de。这意味着NFD操作符已正确识别出来自GPU启用MachineSet的节点。