搜索

2.2. 在 AWS 上创建计算机器集

download PDF

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

重要

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

具有基础架构平台类型 none 的集群无法使用 Machine API。即使附加到集群的计算机器安装在支持该功能的平台上,也会应用这个限制。在安装后无法更改此参数。

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

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

2.2.1. AWS 上计算机器设置自定义资源的 YAML 示例

YAML 示例定义了一个在 us-east-1a Amazon Web Services (AWS) Local Zone 中运行的计算机器集,并创建通过 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> 3
      machine.openshift.io/cluster-api-machineset: <infrastructure_id>-<role>-<zone> 4
  template:
    metadata:
      labels:
        machine.openshift.io/cluster-api-cluster: <infrastructure_id> 5
        machine.openshift.io/cluster-api-machine-role: <role> 6
        machine.openshift.io/cluster-api-machine-type: <role> 7
        machine.openshift.io/cluster-api-machineset: <infrastructure_id>-<role>-<zone> 8
    spec:
      metadata:
        labels:
          node-role.kubernetes.io/<role>: "" 9
      providerSpec:
        value:
          ami:
            id: ami-046fe691f52a953f9 10
          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 11
          instanceType: m6i.large
          kind: AWSMachineProviderConfig
          placement:
            availabilityZone: <zone> 12
            region: <region> 13
          securityGroups:
            - filters:
                - name: tag:Name
                  values:
                    - <infrastructure_id>-worker-sg 14
          subnet:
            filters:
              - name: tag:Name
                values:
                  - <infrastructure_id>-private-<zone> 15
          tags:
            - name: kubernetes.io/cluster/<infrastructure_id> 16
              value: owned
            - name: <custom_tag_name> 17
              value: <custom_tag_value> 18
          userDataSecret:
            name: worker-user-data
1 3 5 11 14 16
指定基于置备集群时所设置的集群 ID 的基础架构 ID。如果已安装 OpenShift CLI,您可以通过运行以下命令来获取基础架构 ID:
$ oc get -o jsonpath='{.status.infrastructureName}{"\n"}' infrastructure cluster
2 4 8
指定基础架构 ID、角色节点标签和区域。
6 7 9
指定要添加的角色节点标签。
10
为 OpenShift Container Platform 节点的 AWS 区域指定有效的 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>
17 18
可选:为集群指定自定义标签数据。例如,您可以通过指定 Email:admin-email@example.comname:value 对来添加管理员的电子邮件地址。
注意

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

12
指定区域,如 us-east-1a
13
指定区域,如 us-east-1
15
指定基础架构 ID 和区域。

2.2.2. 创建计算机器集

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

先决条件

  • 部署一个 OpenShift Container Platform 集群。
  • 安装 OpenShift CLI(oc)。
  • 以具有 cluster-admin 权限的用户身份登录 oc

流程

  1. 创建一个包含计算机器集自定义资源(CR)示例的新 YAML 文件,并将其命名为 <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 的值会匹配。如果 compute 机器集不可用,请等待几分钟,然后再次运行命令。

2.2.3. 使用机器集,为 Elastic Fabric Adapter 实例分配机器到放置组

您可以配置机器集,在现有 AWS PG 中的 Elastic Fabric Adapter (EFA) 实例上部署机器。

EFA 实例不需要放置组,您可以使用放置组作为配置 EFA 以外的目的。本例使用这两者来演示能够提高指定放置组内机器的网络性能的配置。

先决条件

  • 您在 AWS 控制台中创建了放置组。

    注意

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

流程

  1. 在文本编辑器中,为现有机器集打开 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
    # ...
    1
    指定支持 EFA 的实例类型。
    2
    指定 EFA 网络接口类型。
    3
    指定区域,如 us-east-1a
    4
    指定区域,如 us-east-1
    5
    指定要部署机器的现有 AWS PG 的名称。

验证

  • 在 AWS 控制台中,找到机器集创建的机器,并在机器属性中验证以下内容:

    • placement group 字段具有您为机器集中的 placementGroupName 参数指定的值。
    • 接口类型字段表示它使用 EFA。

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

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

注意

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

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

重要

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

2.2.4.1. 使用机器集配置 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。

2.2.5. 将机器部署为 Dedicated 实例的机器集

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

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

2.2.5.1. 使用机器集创建 Dedicated 实例

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

流程

  • providerSpec 字段中指定专用租户:

    providerSpec:
      placement:
        tenancy: dedicated

2.2.6. 将机器部署为 Spot 实例的机器集

您可以通过创建一个在 AWS 上运行的计算机器集来节约成本,该机器集将机器部署为非保障的 Spot 实例。Spo 实例使用未使用的 AWS EC2 容量,且比按需(On-Demand)实例的成本要低。您可以将 Spot 实例用于可容许中断的工作负载,如批处理或无状态工作负载、横向可扩展工作负载。

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

使用 Spot 实例时可能会因为以下原因造成中断:

  • 实例价格超过您的最大价格
  • Spot 实例的需求增加
  • Spot 实例的提供减少

当 AWS 终止实例时,Spot 实例节点上运行的终止处理器会删除机器资源。为了满足计算机器设置 副本数量,计算机器会创建一个请求 Spot 实例的机器。

2.2.6.1. 使用计算机器集创建 Spot 实例

您可以通过在计算机器设置 YAML 文件中添加 SpotMarketOptions,在 AWS 上启动 Spot 实例。

流程

  • providerSpec 字段中添加以下行:

    providerSpec:
      value:
        spotMarketOptions: {}

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

    如果设置了 maxPrice,则将此值用作每小时最大即时价格。如果没有设置,则默认使用最大价格收费,以达到按需处理的实例价格。

    注意

    强烈建议您使用默认的 On-Demand 价格作为 maxPrice 值,不要为 Spot 实例设置最大价格。

2.2.7. 将 GPU 节点添加到现有 OpenShift Container Platform 集群中

您可以复制并修改默认计算机器集配置,以便为 AWS EC2 云供应商创建启用了 GPU 的机器集和机器。

有关支持的实例类型的更多信息,请参阅以下 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.29.4
    ip-10-0-58-24.us-east-2.compute.internal    Ready    control-plane,master   3d17h   v1.29.4
    ip-10-0-68-148.us-east-2.compute.internal   Ready    worker                 3d17h   v1.29.4
    ip-10-0-68-68.us-east-2.compute.internal    Ready    control-plane,master   3d17h   v1.29.4
    ip-10-0-72-170.us-east-2.compute.internal   Ready    control-plane,master   3d17h   v1.29.4
    ip-10-0-74-50.us-east-2.compute.internal    Ready    worker                 3d17h   v1.29.4

  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.instanceType 替换为 g4dn.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

请注意,不需要为节点指定命名空间。节点定义是在集群范围之内。

2.2.8. 部署 Node Feature Discovery Operator

创建启用了 GPU 的节点后,您需要发现启用了 GPU 的节点,以便调度它。为此,请安装 Node Feature Discovery (NFD) Operator。NFD Operator 识别节点中的硬件设备功能。它解决了在基础架构节点中识别和目录硬件资源的一般问题,以便 OpenShift Container Platform 可以使用它们。

流程

  1. 在 OpenShift Container Platform 控制台中,从 OperatorHub 安装 Node Feature Discovery Operator。
  2. 将 NFD Operator 安装到 OperatorHub 后,从已安装的 Operator 列表中选择 Node Feature Discovery,然后选择 Create instance。这会在 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. 浏览到控制台中的已安装的 Oerator,再选择 Create Node Feature Discovery
  5. 选择 Create 以构建 NFD 自定义资源。这会在 openshift-nfd 命名空间中创建 NFD 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

    10de 会出现在启用了 GPU 的节点的节点功能列表中。这意味着 NFD Operator 可以正确地识别启用了 GPU 的 MachineSet 的节点。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.