在 Azure Arc 启用的 AKS 中使用 PowerShell 进行群集自动缩放

适用于:Azure Stack HCI 22H2 上的 AKS、Windows Server 上的 AKS

可以使用 PowerShell 启用自动缩放程序,并管理 Arc 启用的 AKS 中目标群集中节点池的自动缩放。还可以使用 PowerShell 配置和管理群集自动缩放。

创建新的 AksHciAutoScalerConfig 对象

若要创建新的 AksHciAutoScalerConfig 对象以 New-AksHciCluster 传入 或 Set-AksHciCluster 命令,请使用以下命令:

New-AksHciAutoScalerProfile -Name asp1 -AutoScalerProfileConfig @{ "min-node-count"=2; "max-node-count"=7; 'scale-down-unneeded-time'='1m'}

可以在创建群集时提供 autoscalerconfig 对象。 该对象包含自动缩放程序的参数。 有关参数信息,请参阅 如何使用自动缩放程序配置文件

更改现有的 AksHciAutoScalerConfig 配置文件对象

更新现有 AksHciAutoScalerConfig 配置文件 对象时,使用该对象的群集将更新为使用新参数。

Set-AksHciAutoScalerProfile -name myProfile -autoScalerProfileConfig @{ "max-node-count"=5; "min-node-count"=2 }

可以更新 autoscalerconfig 对象,该对象包含自动缩放程序的参数。 有关参数信息,请参阅 如何使用自动缩放程序配置文件

为新群集启用自动缩放

若要在所有新建的节点池上自动启用自动缩放,请结合 New-AksHciCluster 命令使用以下参数:

New-AksHciCluster -name mycluster -enableAutoScaler -autoScalerProfileName myAutoScalerProfile

在现有群集上启用自动缩放

若要在现有群集上每个新建的节点池上自动启用自动缩放,请将 参数与 命令一起使用enableAutoScalerSet-AksHciCluster

Set-AksHciCluster -Name <string> [-enableAutoScaler <boolean>] [-autoScalerProfileName <String>] 

在现有节点池上启用自动缩放

若要在现有节点池上启用自动缩放,请将 参数与 命令一起使用autoScalerSet-AksHciNodePool

Set-AksHciNodePool -clusterName <Your-Cluster-Name> -name <Your-NodePool-Name> -autoScaler $true

禁用自动缩放

若要在现有群集上所有现有节点池和新创建的节点池上禁用自动缩放,请使用 Set-AksHciCluster 命令将 设置为 enableAutoScaler false:

Set-AksHciCluster -Name <string> -enableAutoScaler $false

有效使用水平自动缩放程序

将群集和节点池配置为自动缩放后,可以将工作负荷配置为同时以使用水平自动缩放程序功能的方式进行缩放。

有两种main方法可用于工作负荷缩放:

  • Kubernetes 水平 Pod 自动缩放程序:根据负载特征,水平 Pod 自动缩放程序 (也称为 水平自动缩放程序) 将应用程序部署的 Pod 缩放到 Kubernetes 群集中的可用节点。 如果没有更多节点可供计划,水平自动缩放程序将实例化一个计划 Pod 的新节点。 如果应用程序负载下降,节点将再次缩减。
  • Kubernetes 节点反关联规则:Kubernetes 部署的反关联规则可以指定不能在同一节点上缩放一组 Pod,并且需要其他节点来缩放工作负载。 结合应用程序实例的负载特征或目标 Pod 数,水平自动缩放程序会实例化节点池中的新节点以满足请求。 如果应用程序需求下降,水平自动缩放程序将再次纵向缩减节点池。

本节包含一些示例。

水平 Pod 自动缩放程序

先决条件:

  • 已安装由 Arc 启用的 AKS。
  • 目标群集已安装并连接到 Azure。
  • 部署了一个 Linux 节点池,其中至少有一个活动的 Linux 工作器节点。
  • 如前所述,在目标群集和 Linux 节点池上启用了水平节点自动缩放程序。

我们使用 Kubernetes 水平 Pod 自动缩放程序演练示例 来演示水平 Pod 自动缩放程序的工作原理。

若要使水平 Pod 自动缩放程序正常工作,必须在目标群集中部署指标服务器组件。

若要将指标服务器部署到名为 mycluster的目标群集,请运行以下命令:

Get-AksHciCredential -name mycluster
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

部署 Kubernetes 指标服务器后,可以将应用程序部署到用于缩放的节点池。 本示例使用 Kubernetes 社区网站中的测试应用程序。

kubectl apply -f https://k8s.io/examples/application/php-apache.yaml
deployment.apps/php-apache created
service/php-apache created

此命令创建基于 Apache Web 服务器的 PHP 应用程序的部署,该应用程序将向调用客户端返回“确定”消息。

接下来,配置水平 Pod 自动缩放程序,以在当前 Pod 的 CPU 使用率达到 50% 时计划新的 Pod,并从 1 个 Pod 扩展到 50 个 Pod。

kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
horizontalpodautoscaler.autoscaling/php-apache autoscaled

可以通过运行以下命令检查新制作的水平 Pod 自动缩放程序的当前状态:

kubectl get hpa
NAME         REFERENCE                     TARGET    MINPODS   MAXPODS   REPLICAS   AGE
php-apache   Deployment/php-apache/scale   0% / 50%  1         10        1          18s

最后,增加 Web 服务器上的负载以查看其横向扩展。打开新的 PowerShell 窗口,并运行以下命令:

kubectl run -i --tty load-generator --rm --image=busybox:1.28 --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"

如果返回到上一个 PowerShell 窗口并运行以下命令,应会看到 Pod 数量在短时间内发生更改:

kubectl get hpa php-apache --watch
NAME         REFERENCE                     TARGET      MINPODS   MAXPODS   REPLICAS   AGE
php-apache   Deployment/php-apache/scale   305% / 50%  1         10        1          3m

在此示例中,Pod 数从 1 更改为 7,如下所示:

NAME         REFERENCE                     TARGET      MINPODS   MAXPODS   REPLICAS   AGE
php-apache   Deployment/php-apache/scale   305% / 50%  1         10        7          3m

如果这不足以触发节点自动缩放程序,因为所有 Pod 都适合一个节点,请打开更多 PowerShell 窗口并运行更多负载生成器命令。 请确保在每次运行命令时更改要创建的 Pod 的名称。 例如,使用 load-generator-2 而不是 load-generator,如以下命令中所示。

kubectl run -i --tty load-generator-2 --rm --image=busybox:1.28 --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"

然后检查使用以下命令实例化的节点数:

kubectl get nodes
NAME              STATUS   ROLES                  AGE    VERSION
moc-laondkmydzp   Ready    control-plane,master   3d4h   v1.22.4
moc-lorl6k76q01   Ready    <none>                 3d4h   v1.22.4
moc-lorl4323d02   Ready    <none>                   9m   v1.22.4
moc-lorl43bc3c3   Ready    <none>                   2m   v1.22.4

若要watch缩减,请按 CTRL-C 结束负载生成器 Pod 并关闭与其关联的 PowerShell 窗口。 大约 30 分钟后,应会看到 Pod 数下降。 大约 30 分钟后,取消预配节点。

有关 Kubernetes 水平 Pod 自动缩放程序的详细信息,请参阅 水平 Pod 自动缩放

节点相关性规则

可以使用节点关联规则,使 Kubernetes 计划程序能够基于节点的某些特征,仅在群集或节点池中的一组特定节点上运行 Pod。 若要显示水平节点自动缩放程序的功能,可以使用相同的规则来确保每个节点上仅运行给定 Pod 的一个实例。

先决条件:

  • 已安装 AKS Arc。
  • 目标群集已安装并连接到 Azure。
  • 部署了一个 Linux 节点池,其中至少有一个活动的 Linux 辅助角色节点。
  • 如前所述,在目标群集和 Linux 节点池上启用了水平节点自动缩放程序。

创建包含以下内容的 YAML 文件,并将其作为 node-anti-affinity.yaml 保存在本地文件夹中。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis-cache
spec:
  selector:
    matchLabels:
      app: store
  replicas: 4
  template:
    metadata:
      labels:
        app: store
    spec:
      nodeSelector:
        kubernetes.io/os: linux
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - store
            topologyKey: "kubernetes.io/hostname"
      containers:
      - name: redis-server
        image: redis:3.2-alpine

打开 PowerShell 窗口,并加载目标群集的凭据。 在此示例中,群集名为 mycluster

Get-AksHciCredential -name mycluster

现在,将 YAML 文件应用到目标群集:

kubectl apply -f node-anti-affinity.yaml

几分钟后,可以使用以下命令检查新节点是否已联机:

kubectl get nodes
NAME              STATUS   ROLES                  AGE    VERSION
moc-laondkmydzp   Ready    control-plane,master   3d4h   v1.22.4
moc-lorl6k76q01   Ready    <none>                 3d4h   v1.22.4
moc-lorl4323d02   Ready    <none>                   9m   v1.22.4
moc-lorl43bc3c3   Ready    <none>                   9m   v1.22.4
moc-lorl44ef56c   Ready    <none>                   9m   v1.22.4

若要删除节点,请使用以下命令删除 redis 服务器的部署:

kubectl delete -f node-anti-affinity.yaml

有关 Kubernetes Pod 相关性规则的详细信息,请参阅 将 Pod 分配到节点

排查水平自动缩放程序的问题

为目标群集启用水平 Pod 自动缩放程序后,在管理群集中创建名为 <cluster_name>-cluster-autoscaler 的新 Kubernetes 部署。 此部署监视目标群集,以确保有足够的工作器节点用于计划 pod。

下面是调试与自动缩放程序相关的问题的一些不同方法:

  • 管理群集上运行的群集自动缩放程序 Pod 收集有关它如何做出缩放决策、需要启动或删除的节点数以及它可能遇到的任何常规错误的有用信息。 自动缩放程序将此信息保存到日志。 运行以下命令以访问日志:

    kubectl --kubeconfig $(Get-AksHciConfig).Kva.kubeconfig logs -l app=<cluster_name>-cluster-autoscaler
    
  • 云操作员日志记录管理群集中的 Kubernetes 事件,这有助于了解何时为群集和节点池启用或禁用自动缩放程序。 可以通过运行以下命令来查看这些内容:

    kubectl --kubeconfig $(Get-AksHciConfig).Kva.kubeconfig get events
    
  • 群集自动缩放程序部署将在它管理的目标群集中创建一个 configmap。 这 configmap 包含有关自动缩放程序的状态群集范围级别和每个节点池的信息。 针对目标群集运行以下命令以查看状态:

    注意

    确保已运行 Get-AksHciCredentials -Name <clustername> 来检索 kubeconfig 信息,以访问有问题的目标群集。

    kubectl --kubeconfig ~\.kube\config get configmap cluster-autoscaler-status -o yaml
    
  • 群集自动缩放程序在缩放群集的节点池时记录有关群集自动缩放程序状态 configmap 的事件。 可以通过对目标群集运行以下命令来查看这些日志:

    kubectl --kubeconfig ~\.kube\config describe configmap cluster-autoscaler-status
    
  • 如果无法计划 pod,群集自动缩放程序会在做出缩放决定时在目标群集中的 pod 上发出事件。 运行以下命令以查看 pod 上的事件:

    kubectl --kubeconfig ~\.kube\config describe pod <pod_name>
    

PowerShell 参考

有关支持群集自动缩放的 PowerShell cmdlet,请参阅以下参考页:

后续步骤