Usare la Scalabilità automatica verticale dei pod nel servizio Azure Kubernetes
Questo articolo illustra come usare la Scalabilità automatica verticale dei pod (VPA) nel cluster del servizio Azure Kubernetes. VPA regola automaticamente le richieste di CPU e memoria per i pod in modo che corrispondano ai modelli di utilizzo dei carichi di lavoro. Questa funzionalità consente di ottimizzare le prestazioni delle applicazioni e di ridurre i costi di esecuzione dei carichi di lavoro nel servizio Azure Kubernetes.
Per altre informazioni, vedere Panoramica della Scalabilità automatica verticale dei pod.
Operazioni preliminari
Se si dispone di un cluster del servizio Azure Kubernetes esistente, assicurarsi che sia in esecuzione Kubernetes versione 1.24 o successiva.
È necessario che sia installata e configurata l'interfaccia della riga di comando di Azure 2.52.0 o versione successiva. Eseguire
az --version
per trovare la versione. Se è necessario eseguire l'installazione o l'aggiornamento, vedere Installare l'interfaccia della riga di comando di Azure.Se si abilita VPA in un cluster esistente, assicurarsi che
kubectl
sia installato e configurato per connettersi al cluster del servizio Azure Kubernetes tramite il comandoaz aks get-credentials
.az aks get-credentials --name <cluster-name> --resource-group <resource-group-name>
Distribuire la Scalabilità automatica verticale dei pod in un nuovo cluster
Creare un nuovo cluster del servizio Azure Kubernetes con VPA abilitato tramite il comando
az aks create
con il flag--enable-vpa
.az aks create --name <cluster-name> --resource-group <resource-group-name> --enable-vpa --generate-ssh-keys
Il comando viene completato dopo pochi minuti e vengono restituite informazioni in formato JSON sul cluster.
Aggiornare un cluster esistente per usare la Scalabilità automatica verticale dei pod
Aggiornare un cluster esistente per usare VPA tramite il comando
az aks update
con il flag--enable-vpa
.az aks update --name <cluster-name> --resource-group <resource-group-name> --enable-vpa
Il comando viene completato dopo pochi minuti e vengono restituite informazioni in formato JSON sul cluster.
Disabilitare la Scalabilità automatica verticale dei pod in un cluster esistente
Disabilitare VPA in un cluster esistente tramite il comando
az aks update
con il flag--disable-vpa
.az aks update --name <cluster-name> --resource-group <resource-group-name> --disable-vpa
Il comando viene completato dopo pochi minuti e vengono restituite informazioni in formato JSON sul cluster.
Testare l'installazione di Scalabilità automatica verticale dei pod
Nell'esempio seguente, viene creata una distribuzione con due pod, ognuno dei quali esegue un singolo contenitore che richiede 100 millicore e tenta di usare un numero di millicore leggermente superiore a 500. Viene anche creata una configurazione di VPA che punta alla distribuzione. VPA osserva il comportamento dei pod e, dopo circa cinque minuti, aggiorna i pod per richiedere 500 millicores.
Creare un file denominato
hamster.yaml
e copiare il seguente manifesto dell'esempio di Scalabilità automatica verticale dei pod dal repository GitHub kubernetes/autoscaler:apiVersion: "autoscaling.k8s.io/v1" kind: VerticalPodAutoscaler metadata: name: hamster-vpa spec: targetRef: apiVersion: "apps/v1" kind: Deployment name: hamster resourcePolicy: containerPolicies: - containerName: '*' minAllowed: cpu: 100m memory: 50Mi maxAllowed: cpu: 1 memory: 500Mi controlledResources: ["cpu", "memory"] --- apiVersion: apps/v1 kind: Deployment metadata: name: hamster spec: selector: matchLabels: app: hamster replicas: 2 template: metadata: labels: app: hamster spec: securityContext: runAsNonRoot: true runAsUser: 65534 containers: - name: hamster image: registry.k8s.io/ubuntu-slim:0.1 resources: requests: cpu: 100m memory: 50Mi command: ["/bin/sh"] args: - "-c" - "while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done"
Distribuire l'esempio di Scalabilità automatica verticale dei pod
hamster.yaml
tramite il comandokubectl apply
.kubectl apply -f hamster.yaml
Il comando viene completato dopo pochi minuti e vengono restituite informazioni in formato JSON sul cluster.
Visualizzare i pod in esecuzione usando il comando
kubectl get
.kubectl get pods -l app=hamster
L'output dovrebbe essere simile all'esempio di output seguente:
hamster-78f9dcdd4c-hf7gk 1/1 Running 0 24s hamster-78f9dcdd4c-j9mc7 1/1 Running 0 24s
Visualizzare le prenotazioni di CPU e memoria in uno dei pod usando il comando
kubectl describe
. Assicurarsi di sostituire<example-pod>
con uno degli ID pod restituiti nell'output del passaggio precedente.kubectl describe pod hamster-<example-pod>
L'output dovrebbe essere simile all'esempio di output seguente:
hamster: Container ID: containerd:// Image: k8s.gcr.io/ubuntu-slim:0.1 Image ID: sha256: Port: <none> Host Port: <none> Command: /bin/sh Args: -c while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done State: Running Started: Wed, 28 Sep 2022 15:06:14 -0400 Ready: True Restart Count: 0 Requests: cpu: 100m memory: 50Mi Environment: <none>
In questo esempio, il pod dispone di 100 millicpu e 50 Mibibyte di memoria riservati. Per questa applicazione di esempio, il pod richiede meno di 100 millicpu per l'esecuzione, quindi non è disponibile alcuna capacità di CPU. I pod, inoltre, riservano una quantità di memoria inferiore a quella necessaria. La distribuzione di Scalabilità automatica verticale dei pod vpa-recommender di VPA analizza i pod che ospitano l'applicazione hamster per verificare se i requisiti di CPU e memoria sono appropriati. Se sono necessarie modifiche, vpa-updater riavvia i pod con valori aggiornati.
Monitorare i pod tramite il comando
kubectl get
.kubectl get --watch pods -l app=hamster
All'avvio del nuovo pod di hamster, è possibile visualizzare le prenotazioni di CPU e Memoria aggiornate tramite il comando
kubectl describe
. Assicurarsi di sostituire<example-pod>
con uno degli ID pod restituiti nell'output del passaggio precedente.kubectl describe pod hamster-<example-pod>
L'output dovrebbe essere simile all'esempio di output seguente:
State: Running Started: Wed, 28 Sep 2022 15:09:51 -0400 Ready: True Restart Count: 0 Requests: cpu: 587m memory: 262144k Environment: <none>
Nell'output precedente è possibile notare che la prenotazione di CPU ha raggiunto 587 millicpu, ovvero più di cinque volte il valore originale. Memoria ha raggiunto 262.144 kilobyte, ovvero circa 250 Mibibyte o cinque volte il valore originale. Questo pod non aveva risorse sufficienti e il Vertical Pod Autoscaler ha corretto la stima con un valore molto più appropriato.
Visualizzare le raccomandazioni aggiornate da VPA tramite il comando
kubectl describe
per descrivere le informazioni sulla risorsa hamster-vpa.kubectl describe vpa/hamster-vpa
L'output dovrebbe essere simile all'esempio di output seguente:
State: Running Started: Wed, 28 Sep 2022 15:09:51 -0400 Ready: True Restart Count: 0 Requests: cpu: 587m memory: 262144k Environment: <none>
Impostare richieste di Scalabilità automatica verticale dei pod
L'oggetto VerticalPodAutoscaler
imposta automaticamente le richieste della risorsa nei pod con un updateMode
di Auto
. È possibile impostare un valore diverso a seconda dei requisiti e dei test. In questo esempio viene creato e testato un manifesto della distribuzione con due pod, ognuno dei quali esegue un contenitore che richiede 100 milliCPU e 50 MiB di memoria e imposta il updateMode
su Recreate
.
Creare un file denominato
azure-autodeploy.yaml
e copiarlo nel manifesto seguente:apiVersion: apps/v1 kind: Deployment metadata: name: vpa-auto-deployment spec: replicas: 2 selector: matchLabels: app: vpa-auto-deployment template: metadata: labels: app: vpa-auto-deployment spec: containers: - name: mycontainer image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine resources: requests: cpu: 100m memory: 50Mi command: ["/bin/sh"] args: ["-c", "while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done"]
Creare il pod usando il comando
kubectl create
.kubectl create -f azure-autodeploy.yaml
Il comando viene completato dopo pochi minuti e vengono restituite informazioni in formato JSON sul cluster.
Visualizzare i pod in esecuzione usando il comando
kubectl get
.kubectl get pods
L'output dovrebbe essere simile all'esempio di output seguente:
NAME READY STATUS RESTARTS AGE vpa-auto-deployment-54465fb978-kchc5 1/1 Running 0 52s vpa-auto-deployment-54465fb978-nhtmj 1/1 Running 0 52s
Creare un file denominato
azure-vpa-auto.yaml
e copiarlo nel manifesto seguente:apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: vpa-auto spec: targetRef: apiVersion: "apps/v1" kind: Deployment name: vpa-auto-deployment updatePolicy: updateMode: "Recreate"
Il valore
targetRef.name
specifica che qualsiasi pod controllato da una distribuzione denominatavpa-auto-deployment
appartiene aVerticalPodAutoscaler
. Il valoreupdateMode
diRecreate
indica che il controller di Scalabilità automatica verticale dei pod può eliminare un pod, regolare le richieste di CPU e Memoria e quindi creare un nuovo pod.Applicare il manifesto al cluster tramite il comando
kubectl apply
.kubectl create -f azure-vpa-auto.yaml
Attendere alcuni minuti e quindi visualizzare i pod in esecuzione tramite il comando
kubectl get
.kubectl get pods
L'output dovrebbe essere simile all'esempio di output seguente:
NAME READY STATUS RESTARTS AGE vpa-auto-deployment-54465fb978-qbhc4 1/1 Running 0 2m49s vpa-auto-deployment-54465fb978-vbj68 1/1 Running 0 109s
Ottenere informazioni dettagliate su uno dei pod in esecuzione tramite il comando
kubectl get
. Assicurarsi di sostituire<pod-name>
con il nome di uno dei pod dell'output precedente.kubectl get pod <pod-name> --output yaml
L'output dovrebbe essere simile a quello dell'esempio seguente, che mostra un aumento della richiesta di memoria da parte del controller VPA a 262144k e della richiesta di CPU a 25 milliCPU:
apiVersion: v1 kind: Pod metadata: annotations: vpaObservedContainers: mycontainer vpaUpdates: 'Pod resources updated by vpa-auto: container 0: cpu request, memory request' creationTimestamp: "2022-09-29T16:44:37Z" generateName: vpa-auto-deployment-54465fb978- labels: app: vpa-auto-deployment spec: containers: - args: - -c - while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done command: - /bin/sh image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine imagePullPolicy: IfNotPresent name: mycontainer resources: requests: cpu: 25m memory: 262144k
Per ottenere informazioni dettagliate sulla Scalabilità automatica verticale dei pod e le relative raccomandazioni per CPU e Memoria, usare il comando
kubectl get
.kubectl get vpa vpa-auto --output yaml
L'output dovrebbe essere simile all'esempio di output seguente:
recommendation: containerRecommendations: - containerName: mycontainer lowerBound: cpu: 25m memory: 262144k target: cpu: 25m memory: 262144k uncappedTarget: cpu: 25m memory: 262144k upperBound: cpu: 230m memory: 262144k
In questo esempio, i risultati nell'attributo
target
specificano che non è necessario modificare la CPU o la destinazione di Memoria per un’esecuzione ottimale del contenitore. Tuttavia, i risultati possono variare a seconda dell'applicazione e del relativo utilizzo delle risorse.Vertical Pod Autoscaler usa gli attributi
lowerBound
eupperBound
per decidere se eliminare un pod e sostituirlo con un nuovo pod. Se un pod ha richieste minori del limite inferiore o maggiori del limite superiore, Vertical Pod Autoscaler elimina il pod e lo sostituisce con un pod che soddisfa l'attributo di destinazione.
Modulo di raccomandazione aggiuntivo per Vertical Pod Autoscaler
Il Sistema di raccomandazione fornisce consigli per l'utilizzo delle risorse in base al loro consumo in tempo reale. Il servizio Azure Kubernetes distribuisce un Sistema di raccomandazione quando un cluster abilita VPA. È possibile distribuire un Sistema di raccomandazione personalizzato o un Sistema di raccomandazione aggiuntivo con la stessa immagine di quello predefinito. Il vantaggio di disporre di un Sistema di raccomandazione personalizzato consiste nella possibilità di personalizzare la logica di raccomandazione. Con un Sistema di raccomandazione aggiuntivo, è possibile partizionare le VPA per l'uso di sistemi di raccomandazione diversi.
Nell'esempio seguente, viene creato un Sistema di raccomandazione aggiuntivo, che si applica a un cluster del servizio Azure Container esistente, e quindi configurato l'oggetto VPA per consentirne l’uso.
Creare un file denominato
extra_recommender.yaml
e copiarlo nel manifesto seguente:apiVersion: apps/v1 kind: Deployment metadata: name: extra-recommender namespace: kube-system spec: replicas: 1 selector: matchLabels: app: extra-recommender template: metadata: labels: app: extra-recommender spec: serviceAccountName: vpa-recommender securityContext: runAsNonRoot: true runAsUser: 65534 containers: - name: recommender image: registry.k8s.io/autoscaling/vpa-recommender:0.13.0 imagePullPolicy: Always args: - --recommender-name=extra-recommender resources: limits: cpu: 200m memory: 1000Mi requests: cpu: 50m memory: 500Mi ports: - name: prometheus containerPort: 8942
Distribuire l'esempio di Scalabilità automatica verticale dei pod
extra-recomender.yaml
tramite il comandokubectl apply
.kubectl apply -f extra-recommender.yaml
Il comando viene completato dopo pochi minuti e vengono restituite informazioni in formato JSON sul cluster.
Creare un file denominato
hamster-extra-recommender.yaml
e copiarlo nel manifesto seguente:apiVersion: "autoscaling.k8s.io/v1" kind: VerticalPodAutoscaler metadata: name: hamster-vpa spec: recommenders: - name: 'extra-recommender' targetRef: apiVersion: "apps/v1" kind: Deployment name: hamster updatePolicy: updateMode: "Auto" resourcePolicy: containerPolicies: - containerName: '*' minAllowed: cpu: 100m memory: 50Mi maxAllowed: cpu: 1 memory: 500Mi controlledResources: ["cpu", "memory"] --- apiVersion: apps/v1 kind: Deployment metadata: name: hamster spec: selector: matchLabels: app: hamster replicas: 2 template: metadata: labels: app: hamster spec: securityContext: runAsNonRoot: true runAsUser: 65534 # nobody containers: - name: hamster image: k8s.gcr.io/ubuntu-slim:0.1 resources: requests: cpu: 100m memory: 50Mi command: ["/bin/sh"] args: - "-c" - "while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done"
Se
memory
non è specificato incontrolledResources
, il Sistema di raccomandazione non risponde agli eventi OOM. In questo esempio viene impostata solo la CPU incontrolledValues
.controlledValues
consente di scegliere se aggiornare le richieste di risorse del contenitore tramite l’opzioneRequestsOnly
, oppure sia le richieste di risorse che i limiti tramite l’opzioneRequestsAndLimits
. Il valore predefinito èRequestsAndLimits
. Se si usa l'opzioneRequestsAndLimits
, le richieste vengono calcolate in base all'uso effettivo e i limiti in base al rapporto tra richieste e limiti del pod corrente.Ad esempio, se si inizia con un pod che richiede 2 CPU e ha un limite di 4 CPU, VPA imposta sempre il limite in modo che sia il doppio delle richieste. Lo stesso principio si applica a Memoria. Quando si usa la modalità
RequestsAndLimits
, questa può servire come modello per le richieste e i limiti iniziali delle risorse dell'applicazione.È possibile semplificare l'oggetto di VPA usando la modalità
Auto
e le raccomandazioni di calcolo per CPU e Memoria.Distribuire l'esempio
hamster-extra-recomender.yaml
tramite il comandokubectl apply
.kubectl apply -f hamster-extra-recommender.yaml
Monitorare i pod tramite il comando
[kubectl get
]kubectl-get.kubectl get --watch pods -l app=hamster
All'avvio del nuovo pod di hamster, visualizzare le prenotazioni di CPU e Memoria aggiornate tramite il comando
kubectl describe
. Assicurarsi di sostituire<example-pod>
con uno degli ID pod.kubectl describe pod hamster-<example-pod>
L'output dovrebbe essere simile all'esempio di output seguente:
State: Running Started: Wed, 28 Sep 2022 15:09:51 -0400 Ready: True Restart Count: 0 Requests: cpu: 587m memory: 262144k Environment: <none>
Visualizzare le raccomandazioni aggiornate da VPA tramite il comando
kubectl describe
.kubectl describe vpa/hamster-vpa
L'output dovrebbe essere simile all'esempio di output seguente:
State: Running Started: Wed, 28 Sep 2022 15:09:51 -0400 Ready: True Restart Count: 0 Requests: cpu: 587m memory: 262144k Environment: <none> Spec: recommenders: Name: customized-recommender
Risolvere i problemi di Scalabilità automatica verticale dei pod
Se si verificano errori con Scalabilità automatica verticale dei pod, è possibile risolvere i problemi relativi ai componenti del sistema e alla definizione delle risorse personalizzate per identificarne la causa.
Verificare che tutti i componenti del sistema siano in funzione tramite il comando seguente:
kubectl --namespace=kube-system get pods|grep vpa
L'output dovrebbe elencare tre pod: sistema di raccomandazione, strumento di aggiornamento e controller di ammissione, tutti con lo stato di
Running
.Per ognuno dei pod restituiti nell'output precedente, verificare che i componenti del sistema registrino eventuali errori usando il comando seguente:
kubectl --namespace=kube-system logs [pod name] | grep -e '^E[0-9]\{4\}'
Verificare che la definizione della risorsa personalizzata sia stata creata tramite il comando seguente:
kubectl get customresourcedefinition | grep verticalpodautoscalers
Passaggi successivi
Per altre informazioni sull'oggetto VPA, vedere il riferimento API di Scalabilità automatica verticale dei pod.
Azure Kubernetes Service