1.2. 在 Azure 中创建 MachineSet

您可以在 Microsoft Azure 上的 OpenShift Container Platform 集群中创建不同的 MachineSet 来满足特定目的。例如,您可以创建基础架构 MachineSet 和相关的 Machine,以便将支持型工作负载转移到新 Machine 上。

1.2.1. Machine API 概述

Machine API 将基于上游 Cluster API 项目的主要资源与自定义 OpenShift Container Platform 资源相结合。

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

两种主要资源分别是:

Machine
描述节点主机的基本单元。机器具有 providerSpec,用于描述为不同云平台提供的计算节点的类型。例如,Amazon Web Services (AWS) 上的 worker 节点的机器类型可能会定义特定的机器类型和所需的元数据。
MachineSet
机器的群组。MachineSet 适用于机器,ReplicaSet 则适用于 Pod。如果需要更多机器或必须缩减规模,则可以更改 MachineSet 的 replicas 字段来满足您的计算需求。

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

MachineAutoscaler
此资源可自动扩展云中的机器。您可以为指定 MachineSet 中的节点设置最小和最大扩展界限,MachineAutoscaler 就会维护此范围内的节点。ClusterAutoscaler 对象存在后,MachineAutoscaler 对象生效。ClusterAutoscaler 和 MachineAutoscaler 资源都由 ClusterAutoscalerOperator 提供。
ClusterAutoscaler
此资源基于上游 ClusterAutoscaler 项目。在 OpenShift Container Platform 实现中,它通过扩展 MachineSet API 来与 Machine API 集成。您可以为核心、节点、内存和 GPU 等资源设置集群范围的扩展限制。您可以设置优先级,使集群对 Pod 进行优先级排序,以便不针对不太重要的 Pod 使新节点上线。您还可以设置 ScalingPolicy,从而能按比例扩展节点,但不按比例缩减节点。
MachineHealthCheck

此资源可检测机器何时处于不健康状态并将其删除,然后在支持的平台上生成新的机器。

注意

在版本 4.2 中,MachineHealthCheck 是一项技术预览功能

在 OpenShift Container Platform 版本 3.11 中,您无法轻松地推出多区架构,因为集群不负责管理机器置备。自 OpenShift Container Platform 版本 4.1 起,此过程变得更加容易。每个 MachineSet 限定在一个区域,因此安装程序可以代表您将 MachineSet 分发到多个可用区。然后,由于您的计算是动态的,因此在面对区域故障时,您始终都有一个区域来应对必须重新平衡机器的情况。自动扩展器在集群生命周期内尽可能提供平衡。

1.2.2. Azure 上 MachineSet 自定义资源的 YAML 示例

此 YAML 示例定义了一个在 centralus 地区(region)的 1 Microsoft Azure 区域(zone)中运行的 MachineSet,并创建了通过 node-role.kubernetes.io/<role>: "" 标记的节点。

在本例中,<infrastructureID> 是基础架构 ID 标签,该标签基于您在置备集群时设定的集群 ID,而 <role> 则是要添加的节点标签。

apiVersion: machine.openshift.io/v1beta1
kind: MachineSet
metadata:
  labels:
    machine.openshift.io/cluster-api-cluster: <infrastructureID> 1
    machine.openshift.io/cluster-api-machine-role: <role> 2
    machine.openshift.io/cluster-api-machine-type: <role> 3
  name: <infrastructureID>-<role>-<region> 4
  namespace: openshift-machine-api
spec:
  replicas: 1
  selector:
    matchLabels:
      machine.openshift.io/cluster-api-cluster: <infrastructureID> 5
      machine.openshift.io/cluster-api-machineset: <infrastructureID>-<role>-<region> 6
  template:
    metadata:
      creationTimestamp: null
      labels:
        machine.openshift.io/cluster-api-cluster: <infrastructureID> 7
        machine.openshift.io/cluster-api-machine-role: <role> 8
        machine.openshift.io/cluster-api-machine-type: <role> 9
        machine.openshift.io/cluster-api-machineset: <infrastructureID>-<role>-<region> 10
    spec:
      metadata:
        creationTimestamp: null
        labels:
          node-role.kubernetes.io/<role>: "" 11
      providerSpec:
        value:
          apiVersion: azureproviderconfig.openshift.io/v1beta1
          credentialsSecret:
            name: azure-cloud-credentials
            namespace: openshift-machine-api
          image:
            offer: ""
            publisher: ""
            resourceID: /resourceGroups/<infrastructureID>-rg/providers/Microsoft.Compute/images/<infrastructureID>
            sku: ""
            version: ""
          internalLoadBalancer: ""
          kind: AzureMachineProviderSpec
          location: centralus
          managedIdentity: <infrastructureID>-identity 12
          metadata:
            creationTimestamp: null
          natRule: null
          networkResourceGroup: ""
          osDisk:
            diskSizeGB: 128
            managedDisk:
              storageAccountType: Premium_LRS
            osType: Linux
          publicIP: false
          publicLoadBalancer: ""
          resourceGroup: <infrastructureID>-rg 13
          sshPrivateKey: ""
          sshPublicKey: ""
          subnet: <infrastructureID>-<role>-subnet 14 15
          userDataSecret:
            name: <role>-user-data 16
          vmSize: Standard_D2s_v3
          vnet: <infrastructureID>-vnet 17
          zone: "1" 18
1 5 7 12 13 14 17
指定基于置备集群时所设置的集群 ID 的基础架构 ID。如果已安装 OpenShift CLI 和 jq 软件包,您可以通过运行以下命令来获取基础架构 ID:
$ oc get -o jsonpath='{.status.infrastructureName}{"\n"}' infrastructure cluster
2 3 8 9 11 15 16
指定要添加的节点标签。
4 6 10
指定基础架构 ID、节点标签和地区。
18
指定您所在地区(region)内要放置 Machine 的区域 (zone)。确保您的地区支持您指定的区域。

1.2.3. 创建 MachineSet

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

先决条件

  • 部署 OpenShift Container Platform 集群。
  • 安装 OpenShift 命令行界面 (CLI),通常称为 oc
  • 以具有 cluster-admin 权限的用户身份登录 oc

流程

  1. 如示例所示,创建一个包含 MachineSet 自定义资源示例的新 YAML 文件,并将其命名为 <file_name>.yaml

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

    1. 如果不确定要为特定字段设置哪个值,您可以从集群中检查现有的 MachineSet。

      $ 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. 检查特定 MachineSet 的值:

      $ oc get machineset <machineset_name> -n \
           openshift-machine-api -o yaml
      
      ....
      
      template:
          metadata:
            labels:
              machine.openshift.io/cluster-api-cluster: agl030519-vplxk 1
              machine.openshift.io/cluster-api-machine-role: worker 2
              machine.openshift.io/cluster-api-machine-type: worker
              machine.openshift.io/cluster-api-machineset: agl030519-vplxk-worker-us-east-1a
      1
      集群 ID。
      2
      默认节点标签。
  2. 创建新 MachineSet

    $ oc create -f <file_name>.yaml
  3. 查看 MachineSet 列表:

    $ 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

    当新 MachineSet 可用时,DESIREDCURRENT 的值会匹配。如果 MachineSet 不可用,请等待几分钟,然后重新运行命令。

  4. 有新的 MachineSet 可用后,检查机器及其引用的节点的状态:

    $ oc describe machine <name> -n openshift-machine-api

    例如:

    $ oc describe machine agl030519-vplxk-infra-us-east-1a -n openshift-machine-api
    
    status:
      addresses:
      - address: 10.0.133.18
        type: InternalIP
      - address: ""
        type: ExternalDNS
      - address: ip-10-0-133-18.ec2.internal
        type: InternalDNS
      lastUpdated: "2019-05-03T10:38:17Z"
      nodeRef:
        kind: Node
        name: ip-10-0-133-18.ec2.internal
        uid: 71fb8d75-6d8f-11e9-9ff3-0e3f103c7cd8
      providerStatus:
        apiVersion: awsproviderconfig.openshift.io/v1beta1
        conditions:
        - lastProbeTime: "2019-05-03T10:34:31Z"
          lastTransitionTime: "2019-05-03T10:34:31Z"
          message: machine successfully created
          reason: MachineCreationSucceeded
          status: "True"
          type: MachineCreation
        instanceId: i-09ca0701454124294
        instanceState: running
        kind: AWSMachineProviderStatus
  5. 查看新节点,并确认新节点具有您指定的标签:

    $ oc get node <node_name> --show-labels

    查看命令输出,并确认 node-role.kubernetes.io/<your_label> 列在 LABELS 列表中。

注意

对 MachineSet 的任何更改都不会应用到 MachineSet 拥有的现有机器。例如,对现有 MachineSet 编辑或添加的标签不会传播到与该 MachineSet 关联的现有机器和节点。

后续步骤

如果需要其他可用区中的 MachineSet,请重复此过程来创建更多 MachineSet。