练习 - 在 AKS 群集上配置多个节点并使缩放为零

已完成

借助 Azure Kubernetes 服务,你可创建不同的节点池,从而将特定工作负载与每个节点池中运行的节点进行匹配。

回顾无人机追踪的示例,你的团队开发了一项新的预测建模服务,它可在极端天气条件下处理飞行路线信息并创建最佳飞行路线。 此服务需要基于 GPU 的虚拟机 (VM) 支持,并且仅在一周中的特定日期运行。 团队希望确保在服务未运行时不使用 VMS。

在这里,你将创建一个 Azure Kubernetes 服务 (AKS) 托管的 Kubernetes 群集。 下一步,配置该群集,使其支持多个节点池,并允许群集缩放节点池中的节点。 然后,添加第二个节点池以支持具有动态节点计数的用户工作负载。 最后,将节点计数缩减为零,以减少 AKS 群集中使用的节点的成本。

创建新的资源组

  1. 使用 Azure 帐户登录 Azure Cloud Shell。 选择 Cloud Shell 的 Bash 版本。

  2. 在本模块中的所有练习中,你将重复使用你在这里创建的值。 保存输出以供将来使用。

  3. 选择要托管资源组的区域。 后续练习中的功能在所有区域中都不可用。 为此,建议使用 eastus 区域。 如果选择使用其他值,请更改 REGION_NAME 的值。

    运行以下命令来注册变量:

    REGION_NAME=eastus
    RESOURCE_GROUP=rg-akscostsaving
    AKS_CLUSTER_NAME=akscostsaving-$RANDOM
    

    提示

    可以使用“复制”按钮将命令复制到剪贴板。 要粘贴,请右键单击 Cloud Shell 终端中的新行,然后选择“粘贴”,或使用 Shift+Insert 键盘快捷方式(在 macOS 上为 ⌘+V)。

    可通过运行 echo 命令检查每个值;例如 echo $REGION_NAME

  4. 记下你的 AKS_CLUSTER_NAME。 在整个练习中,此值稍后用于群集的清理和配置设置。

    echo $AKS_CLUSTER_NAME
    
  5. 新建一个名为“rg-akscostsaving”的资源组。 在此资源组中部署在这些练习中创建的所有资源。 完成本模块后,使用单个资源组可以更轻松地清理资源。

    az group create \
        --name $RESOURCE_GROUP \
        --location $REGION_NAME
    

创建 AKS 群集

创建资源组后,可以在该组中创建 AKS 群集。 第一步是在所选区域中获取 Kubernetes 的版本。 此版本设置为配置群集。

  1. 若要获取 Kubernetes 版本,请运行 az aks get-versions 命令。 下面的查询返回非预览版 Kubernetes。 将该值存储在名为 VERSION 的 Bash 变量中。 若要检索并存储版本号,请运行以下命令:

    VERSION=$(az aks get-versions \
        --location $REGION_NAME \
        --query "values[?isPreview==null].version | [-1]" \
        --output tsv)
    echo $VERSION
    
  2. 运行 az aks create 命令以创建 AKS 群集。 群集使用系统节点池中的两个节点。 此命令可能需要几分钟时间才能完成。

    az aks create \
        --resource-group $RESOURCE_GROUP \
        --name $AKS_CLUSTER_NAME \
        --location $REGION_NAME \
        --kubernetes-version $VERSION \
        --node-count 2 \
        --load-balancer-sku standard \
        --vm-set-type VirtualMachineScaleSets \
        --generate-ssh-keys
    

    az aks create 命令具有多个参数,这些参数可用于精确配置 Kubernetes 群集。 在群集中为缩放和多个节点池配置正确的支持时,有两个重要的参数:

    参数和值 描述
    --load-balancer-sku standard AKS 中支持的默认负载均衡器为 basic。 使用多个节点池时不支持 basic 负载均衡器。 将值设置为 standard
    --vm-set-type VirtualMachineScaleSets 若要使用 AKS 中的缩放功能,需要虚拟机规模集。 此参数会启用对规模集的支持。

    请注意,使用 --node-count 2 参数在默认节点池中配置了两个节点。 回想一下之前描述的内容:基本系统服务跨此系统节点池运行。 很重要的一点是,生产群集至少要使用 --node-count 3 才能确保群集运行的可靠性。 在本练习中,为了成本考虑,我们在这里只使用两个节点。

  3. 运行 az aks nodepool list 命令,列出新群集中的节点池:

    az aks nodepool list --resource-group $RESOURCE_GROUP --cluster-name $AKS_CLUSTER_NAME
    

    下面是该命令输出的示例:

    [
      {
        "agentPoolType": "VirtualMachineScaleSets",
        "availabilityZones": null,
        "count": 2,
        "enableAutoScaling": null,
        "enableNodePublicIp": false,
        "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/rg-akscostsaving/providers/Microsoft.ContainerService/managedClusters/akscostsaving-17835/agentPools/nodepool1",
        "mode": "System",
        "name": "nodepool1",
        ...
        "type": "Microsoft.ContainerService/managedClusters/agentPools",
        "upgradeSettings": null,
        "vmSize": "Standard_DS2_v2",
        "vnetSubnetId": null
      }
    ]
    

    请注意,节点池的 mode 设置为 Systemname 将自动进行分配。

添加节点池

  1. 你的群集只有一个节点池。 运行 az aks nodepool add 命令,以添加第二个节点池。 运行此步骤中的命令,以创建一个包含 3 个节点且名为 batchprocpl 的用户节点池。 请记住,节点池名称必须以小写字母开头,并且仅包含字母数字字符。 对于 Linux 节点池,节点池名称限制为 12 个字符;对于 Windows 节点池,则限制为 6 个字符。

    运行以下命令:

    az aks nodepool add \
        --resource-group $RESOURCE_GROUP \
        --cluster-name $AKS_CLUSTER_NAME \
        --name batchprocpl \
        --node-count 2
    
  2. 运行 az aks nodepool list 命令,列出新群集中的新节点池:

    az aks nodepool list --resource-group $RESOURCE_GROUP --cluster-name $AKS_CLUSTER_NAME
    

    下面是该命令输出的示例:

    [
      {
        "agentPoolType": "VirtualMachineScaleSets",
        "availabilityZones": null,
        "count": 2,
        "enableAutoScaling": null,
        "enableNodePublicIp": false,
        "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/rg-akscostsaving/providers/Microsoft.ContainerService/managedClusters/akscostsaving-17835/agentPools/batchprocpl",
        "mode": "User",
        "name": "batchprocpl",
        ...
        "type": "Microsoft.ContainerService/managedClusters/agentPools",
        "upgradeSettings": {
          "maxSurge": null
        },
        "vmSize": "Standard_DS2_v2",
        "vnetSubnetId": null
      },
      {
        "agentPoolType": "VirtualMachineScaleSets",
        "availabilityZones": null,
        "count": 2,
        "enableAutoScaling": null,
        "enableNodePublicIp": false,
        "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/rg-akscostsaving/providers/Microsoft.ContainerService/managedClusters/akscostsaving-17835/agentPools/nodepool1",
        "mode": "System",
        "name": "nodepool1",
        ...
        "type": "Microsoft.ContainerService/managedClusters/agentPools",
        "upgradeSettings": null,
        "vmSize": "Standard_DS2_v2",
        "vnetSubnetId": null
      }
    ]
    

    请注意,新节点池的 mode 设置为 Username 设置为 batchprocpl

将节点池节点计数缩放到零

运行 az aks nodepool scale 命令,以手动缩放节点池中的节点。

运行 az aks nodepool scale 命令,并使用 --node-count 参数将节点计数值设置为 0。

下面是该命令的示例:

az aks nodepool scale \
    --resource-group $RESOURCE_GROUP \
    --cluster-name $AKS_CLUSTER_NAME \
    --name batchprocpl \
    --node-count 0

下面是该命令输出的示例:

{
  "agentPoolType": "VirtualMachineScaleSets",
  "availabilityZones": null,
  "count": 0,
  "enableAutoScaling": null,
  "enableNodePublicIp": false,
  "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/rg-akscostsaving/providers/Microsoft.ContainerService/managedClusters/akscostsaving-17835/agentPools/batchprocpl",
  "maxCount": null,
  "maxPods": 110,
  "minCount": null,
  "mode": "User",
  "name": "batchprocpl",
  "nodeImageVersion": "AKSUbuntu-1604-2020.06.10",
  "nodeLabels": null,
  "nodeTaints": null,
  "orchestratorVersion": "1.17.9",
  "osDiskSizeGb": 128,
  "osType": "Linux",
  "provisioningState": "Succeeded",
  "proximityPlacementGroupId": null,
  "resourceGroup": "rg-akscostsaving",
  "scaleSetEvictionPolicy": null,
  "scaleSetPriority": null,
  "spotMaxPrice": null,
  "tags": null,
  "type": "Microsoft.ContainerService/managedClusters/agentPools",
  "upgradeSettings": {
    "maxSurge": null
  },
  "vmSize": "Standard_DS2_v2",
  "vnetSubnetId": null
}

请注意,节点池 count 参数值设置为 0,而 enableAutoScaling 值设置为 null。 若要计划工作负载,必须手动增加此节点池的节点计数,因为默认情况下不会自动创建节点。

配置 Kubernetes 上下文

在上一个命令的输出结果中,节点池计数设置为 0。 可运行 kubectl get nodes 命令来确认群集中的可用节点。

  1. 运行 kubectl,以与群集的 API 服务器进行交互。 你必须配置 Kubernetes 群集上下文,以允许 kubectl 进行连接。 上下文包含群集的地址、用户和命名空间。 运行 az aks get-credentials 命令,以在 Cloud Shell 中配置 Kubernetes 上下文。

    运行以下命令来检索群集凭据:

    az aks get-credentials \
        --resource-group $RESOURCE_GROUP \
        --name $AKS_CLUSTER_NAME
    

    下面是该命令输出的示例。

    Merged "akscostsaving-17835" as current context in /home/user/.kube/config
    
  2. 列出节点池中的节点。

    kubectl get nodes
    

    下面是该命令输出的示例:

    NAME                                STATUS   ROLES   AGE   VERSION
    aks-nodepool1-37990379-vmss000000   Ready    agent   32m   v1.17.9
    aks-nodepool1-37990379-vmss000001   Ready    agent   32m   v1.17.9
    

    请注意,尽管 az aks nodepool list 命令列出了两个节点池,但群集中只有两个可用节点,并且这两个节点都来自 nodepool1

若要在直接管理工作负载需求时优化 AKS 的成本,一个好的策略是:

  • 手动缩放节点池中的节点计数。
  • 将基于 NV 的成本较高的用户节点池缩放到零。

让我们看一下需要缩放节点的策略,但不直接控制需求。