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

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

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

创建新的 AksHciAutoScalerConfig 对象

若要创建新的 AksHciAutoScalerConfig 对象以传入 New-AksHciClusterSet-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 }

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

为新群集启用自动缩放

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

New-AksHciCluster -name mycluster -enableAutoScaler -autoScalerProfileName myAutoScalerProfile

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

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

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

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

若要在现有节点池上启用自动缩放,请使用 autoScaler 命令中的 Set-AksHciNodePool 参数:

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

禁用自动缩放

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

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

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

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

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

  • 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 到 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

若要监视缩减,请按 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,请参阅以下参考页:

后续步骤