Usare PowerShell per la scalabilità automatica del cluster nel servizio Azure Kubernetes abilitato da Azure Arc

Si applica a: servizio Azure Kubernetes in Azure Stack HCI 22H2, servizio Azure Kubernetes in Windows Server

È possibile usare PowerShell per abilitare la scalabilità automatica e gestire il ridimensionamento automatico dei pool di nodi nei cluster di destinazione nel servizio Azure Kubernetes abilitato da Arc. È anche possibile usare PowerShell per configurare e gestire la scalabilità automatica del cluster.

Creare un nuovo oggetto AksHciAutoScalerConfig

Per creare un nuovo oggetto AksHciAutoScalerConfig da passare al New-AksHciCluster comando o Set-AksHciCluster , usare questo comando:

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

È possibile specificare l'oggetto autoscalerconfig durante la creazione del cluster. L'oggetto contiene i parametri per il ridimensionamento automatico. Per informazioni sui parametri, vedere Come usare i profili di scalabilità automatica.

Modificare un oggetto profilo AksHciAutoScalerConfig esistente

Quando si aggiorna un oggetto profilo AksHciAutoScalerConfig esistente, i cluster che usano tale oggetto vengono aggiornati per usare i nuovi parametri.

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

È possibile aggiornare l'oggetto autoscalerconfig , che contiene i parametri per il ridimensionamento automatico. Per informazioni sui parametri, vedere Come usare i profili di scalabilità automatica.

Abilitare la scalabilità automatica per i nuovi cluster

Per abilitare la scalabilità automatica automaticamente in tutti i pool di nodi appena creati, usare i parametri seguenti con il New-AksHciCluster comando :

New-AksHciCluster -name mycluster -enableAutoScaler -autoScalerProfileName myAutoScalerProfile

Abilitare la scalabilità automatica in un cluster esistente

Per abilitare la scalabilità automatica in ogni pool di nodi appena creato in un cluster esistente, usare il enableAutoScaler parametro con il Set-AksHciCluster comando :

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

Abilitare la scalabilità automatica in un pool di nodi esistente

Per abilitare la scalabilità automatica in un pool di nodi esistente, usare il autoScaler parametro con il Set-AksHciNodePool comando :

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

Disabilitare la scalabilità automatica

Per disabilitare la scalabilità automatica in tutti i pool di nodi esistenti e appena creati in un cluster esistente, impostare su enableAutoScaler false usando il Set-AksHciCluster comando :

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

Uso efficace del ridimensionamento automatico orizzontale

Ora che il cluster e il pool di nodi sono configurati per la scalabilità automatica, è possibile configurare un carico di lavoro per ridimensionare anche in modo che usi le funzionalità di scalabilità automatica orizzontale.

Per il ridimensionamento del carico di lavoro sono disponibili due metodi principali:

  • Scalabilità automatica orizzontale dei pod kubernetes: in base alle caratteristiche di carico, l'utilità di scalabilità automatica orizzontale dei pod (nota anche come ridimensionamento automatico orizzontale) ridimensiona i pod di una distribuzione di un'applicazione ai nodi disponibili nel cluster Kubernetes. Se non sono disponibili altri nodi da pianificare, il ridimensionamento automatico orizzontale crea un'istanza di un nuovo nodo in cui pianificare i pod. Se il carico dell'applicazione diventa inattivo, i nodi vengono nuovamente ridimensionati.
  • Regole anti-affinità del nodo Kubernetes: le regole anti-affinità per una distribuzione Kubernetes possono specificare che un set di pod non può essere ridimensionato nello stesso nodo e per ridimensionare il carico di lavoro è necessario un nodo diverso. In combinazione con le caratteristiche di caricamento o il numero di pod di destinazione per le istanze dell'applicazione, il ridimensionamento automatico orizzontale crea un'istanza di nuovi nodi nel pool di nodi per soddisfare le richieste. Se la domanda dell'applicazione diminuisce, il ridimensionamento automatico orizzontale riduce di nuovo il pool di nodi.

Questa sezione contiene alcuni esempi.

Utilità di scalabilità automatica orizzontale dei pod

Prerequisiti:

  • Il servizio Azure Kubernetes abilitato da Arc è installato.
  • Il cluster di destinazione viene installato e connesso ad Azure.
  • Viene distribuito un pool di nodi Linux con almeno un nodo di lavoro Linux attivo.
  • La scalabilità automatica orizzontale dei nodi è abilitata nel cluster di destinazione e nel pool di nodi Linux, come descritto in precedenza.

Viene usato l'esempio di procedura dettagliata di scalabilità automatica orizzontale dei pod kubernetes per illustrare il funzionamento della scalabilità automatica orizzontale dei pod.

Per il funzionamento dell'utilità di scalabilità automatica orizzontale dei pod, è necessario distribuire il componente Server metriche nel cluster di destinazione.

Per distribuire il server delle metriche in un cluster di destinazione denominato mycluster, eseguire i comandi seguenti:

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

Dopo aver distribuito il server delle metriche kubernetes, è possibile distribuire un'applicazione nel pool di nodi, che viene usata per la scalabilità. Per questo esempio viene usata un'applicazione di test dal sito Web della community di Kubernetes.

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

Questo comando crea una distribuzione di un'applicazione PHP basata su server Web Apache che restituirà un messaggio "OK" a un client chiamante.

Configurare quindi l'utilità di scalabilità automatica orizzontale dei pod per pianificare un nuovo pod quando l'utilizzo della CPU del pod corrente raggiunge il 50% e passare da 1 a 50 pod.

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

È possibile controllare lo stato corrente dell'utilità di scalabilità automatica orizzontale dei pod appena creata eseguendo il comando seguente:

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

Infine, aumentare il carico sul server Web per visualizzarlo con scalabilità orizzontale. Aprire una nuova finestra di PowerShell ed eseguire il comando seguente:

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"

Se si torna alla finestra di PowerShell precedente ed eseguire il comando seguente, il numero di pod cambia entro un breve periodo:

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

In questo esempio il numero di pod cambia da 1 a 7, come illustrato di seguito:

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

Se questo non è sufficiente per attivare il ridimensionamento automatico del nodo perché tutti i pod rientrano in un nodo, aprire più finestre di PowerShell ed eseguire altri comandi del generatore di carico. Assicurarsi di modificare il nome del pod che si sta creando ogni volta che si esegue il comando. Ad esempio, usare load-generator-2 invece di load-generator, come illustrato nel comando seguente.

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"

Controllare quindi il numero di nodi di cui è stata creata un'istanza con il comando seguente:

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

Per watch un ridimensionamento, premere CTRL+C per terminare i pod del generatore di carico e chiudere le finestre di PowerShell associate. Dopo circa 30 minuti, verrà visualizzato il numero di pod inattivi. Circa 30 minuti dopo, i nodi vengono deprovisionati.

Per altre informazioni sulla scalabilità automatica orizzontale dei pod kubernetes, vedere Scalabilità automatica orizzontale dei pod.

Regole di affinità dei nodi

È possibile usare le regole di affinità dei nodi per consentire all'utilità di pianificazione Kubernetes di eseguire pod solo in un set specifico di nodi in un cluster o in un pool di nodi in base a determinate caratteristiche del nodo. Per visualizzare la funzione di scalabilità automatica del nodo orizzontale, è possibile usare le stesse regole per garantire che solo un'istanza di un determinato pod venga eseguita in ogni nodo.

Prerequisiti:

  • È installato Arc del servizio Azure Kubernetes.
  • Il cluster di destinazione viene installato e connesso ad Azure.
  • Viene distribuito un pool di nodi Linux con almeno un nodo di lavoro Linux attivo.
  • La scalabilità automatica orizzontale dei nodi è abilitata nel cluster di destinazione e nel pool di nodi Linux, come descritto in precedenza.

Creare un file YAML con il contenuto seguente e salvarlo come node-anti-affinity.yaml in una cartella locale.

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

Aprire una finestra di PowerShell e caricare le credenziali per il cluster di destinazione. In questo esempio il cluster è denominato mycluster:

Get-AksHciCredential -name mycluster

Applicare ora il file YAML al cluster di destinazione:

kubectl apply -f node-anti-affinity.yaml

Dopo alcuni minuti, è possibile usare il comando seguente per verificare che i nuovi nodi siano online:

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

Per rimuovere il nodo, eliminare la distribuzione del server Redis con questo comando:

kubectl delete -f node-anti-affinity.yaml

Per altre informazioni sulle regole di affinità dei pod Kubernetes, vedere Assegnazione di pod ai nodi.

Risolvere i problemi di scalabilità automatica orizzontale

Quando l'utilità di scalabilità automatica orizzontale dei pod è abilitata per un cluster di destinazione, viene creata una nuova distribuzione Kubernetes denominata <cluster_name>-cluster-autoscaler nel cluster di gestione. Questa distribuzione monitora il cluster di destinazione per assicurarsi che siano presenti nodi di lavoro sufficienti per pianificare i pod.

Ecco alcuni modi diversi per eseguire il debug dei problemi relativi al ridimensionamento automatico:

  • I pod di scalabilità automatica del cluster in esecuzione nel cluster di gestione raccolgono informazioni utili su come prende decisioni di ridimensionamento, il numero di nodi che è necessario visualizzare o rimuovere e gli eventuali errori generali che potrebbero verificarsi. Il ridimensionamento automatico salva queste informazioni nei log. Eseguire il comando seguente per accedere ai log:

    kubectl --kubeconfig $(Get-AksHciConfig).Kva.kubeconfig logs -l app=<cluster_name>-cluster-autoscaler
    
  • I log dell'operatore cloud registrano gli eventi Kubernetes nel cluster di gestione, che possono essere utili per comprendere quando l'utilità di scalabilità automatica è stata abilitata o disabilitata per un cluster e un pool di nodi. È possibile visualizzarli eseguendo il comando seguente:

    kubectl --kubeconfig $(Get-AksHciConfig).Kva.kubeconfig get events
    
  • La distribuzione del ridimensionamento automatico del cluster crea un configmap oggetto nel cluster di destinazione gestito. Contiene configmap informazioni sul livello del cluster di stato del ridimensionamento automatico e sul pool di nodi. Eseguire il comando seguente sul cluster di destinazione per visualizzare lo stato:

    Nota

    Assicurarsi di aver eseguito Get-AksHciCredentials -Name <clustername> per recuperare le kubeconfig informazioni per accedere al cluster di destinazione in questione.

    kubectl --kubeconfig ~\.kube\config get configmap cluster-autoscaler-status -o yaml
    
  • Il ridimensionamento automatico del cluster registra gli eventi sullo stato configmap del ridimensionamento automatico del cluster quando ridimensiona il pool di nodi di un cluster. È possibile visualizzare questi log eseguendo questo comando nel cluster di destinazione:

    kubectl --kubeconfig ~\.kube\config describe configmap cluster-autoscaler-status
    
  • Il ridimensionamento automatico del cluster genera eventi nei pod nel cluster di destinazione quando prende una decisione di ridimensionamento se il pod non può essere pianificato. Eseguire questo comando per visualizzare gli eventi in un pod:

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

Informazioni di riferimento su PowerShell

Vedere le pagine di riferimento seguenti per i cmdlet di PowerShell che supportano la scalabilità automatica del cluster:

Passaggi successivi