Questa pagina spiega come utilizzare la scalabilità automatica orizzontale dei pod per scalare automaticamente un deployment usando diversi tipi di metriche. Puoi utilizzare le stesse
linee guida per configurare un HorizontalPodAutoscaler
per qualsiasi oggetto Deployment scalabile.
Prima di iniziare
Prima di iniziare, assicurati di aver eseguito le seguenti attività:
- Abilita l'API Google Kubernetes Engine. Abilita l'API Google Kubernetes Engine
- Se vuoi utilizzare Google Cloud CLI per questa attività, installa e initialize gcloud CLI. Se hai già installato gcloud CLI, scarica la versione più recente eseguendo
gcloud components update
.
Versioni API per HorizontalPodAutoscaler
oggetti
Quando utilizzi la console Google Cloud, gli oggetti HorizontalPodAutoscaler
vengono creati utilizzando
l'API autoscaling/v2
.
Quando utilizzi kubectl
per creare o visualizzare informazioni su Horizontal Pod Autoscaler, puoi specificare l'API autoscaling/v1
o l'API autoscaling/v2
.
apiVersion: autoscaling/v1
è l'impostazione predefinita e consente la scalabilità automatica in base all'utilizzo della CPU. Per scalare automaticamente in base ad altre metriche, ti consigliamo di utilizzareapiVersion: autoscaling/v2
. L'esempio in Crea il deployment di esempio utilizzaapiVersion: autoscaling/v1
.Si consiglia di usare
apiVersion: autoscaling/v2
per creare nuovi oggettiHorizontalPodAutoscaler
. Consente di scalare automaticamente in base a più metriche, incluse quelle personalizzate o esterne. Tutti gli altri esempi in questo argomento utilizzanoapiVersion: autoscaling/v2
.
Per verificare quali versioni dell'API sono supportate, utilizza il comando kubectl api-versions
.
Puoi specificare quale API utilizzare durante la visualizzazione dei dettagli di un Horizontal Pod Autoscaler che utilizza apiVersion: autoscaling/v2
.
Crea il deployment di esempio
Prima di poter creare Horizontal Pod Autoscaler, devi creare il carico di lavoro che monitora. Gli esempi in questo argomento applicano configurazioni di Horizontal Pod Autoscaler diverse al seguente deployment di nginx
. Esempi separati mostrano un Horizontal Pod Autoscaler in base all'utilizzo delle risorse, a una metrica personalizzata o esterna e a più metriche.
Salva quanto segue in un file denominato nginx.yaml
:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
resources:
# You must specify requests for CPU to autoscale
# based on CPU utilization
requests:
cpu: "250m"
Questo manifest specifica un valore per le richieste di CPU. Se vuoi scalare automaticamente in base all'utilizzo percentuale di una risorsa, devi specificare le richieste per quella risorsa. Se non specifichi le richieste, puoi scalare automaticamente in base solo al valore assoluto dell'utilizzo della risorsa, ad esempio i milliCPU per l'utilizzo della CPU.
Per creare il deployment, applica il manifest nginx.yaml
:
kubectl apply -f nginx.yaml
Il deployment ha spec.replicas
impostato su 3, quindi viene eseguito il deployment di tre pod.
Puoi verificarlo utilizzando il comando kubectl get deployment nginx
.
Ciascuno degli esempi in questo argomento applica un diverso Horizontal Pod Autoscaler a un deployment nginx di esempio.
Scalabilità automatica basata sull'utilizzo delle risorse
Questo esempio crea l'oggetto HorizontalPodAutoscaler
per scalare automaticamente il
deployment nginx
quando l'utilizzo della CPU
supera il 50% e garantisce che ci sia sempre un minimo di 1
replica e un massimo di 10 repliche.
Puoi creare un Horizontal Pod Autoscaler che abbia come target la CPU utilizzando la console Google Cloud, il comando kubectl apply
o solo per la CPU media, il comando kubectl autoscale
.
Console
Vai alla pagina Carichi di lavoro nella console Google Cloud.
Fai clic sul nome del deployment
nginx
.Fai clic su list Azioni > Scalabilità automatica.
Specifica i seguenti valori:
- Numero minimo di repliche: 1
- Numero massimo di repliche: 10
- Metrica di scalabilità automatica: CPU
- Target:50
- Unità: %
Fai clic su Fine.
Fai clic su Scala automaticamente.
kubectl apply
Salva il manifest YAML seguente come file denominato nginx-hpa.yaml
:
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: nginx
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx
minReplicas: 1
maxReplicas: 10
targetCPUUtilizationPercentage: 50
Per creare l'HPA, applica il manifest utilizzando il seguente comando:
kubectl apply -f nginx-hpa.yaml
kubectl autoscale
Per creare un oggetto HorizontalPodAutoscaler
che abbia come target solo l'utilizzo medio della CPU, puoi utilizzare il comando kubectl autoscale
:
kubectl autoscale deployment nginx --cpu-percent=50 --min=1 --max=10
Per ottenere un elenco di Horizontal Pod Autoscaler nel cluster, utilizza il comando seguente:
kubectl get hpa
L'output è simile al seguente:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
nginx Deployment/nginx 0%/50% 1 10 3 61s
Per ottenere dettagli su Horizontal Pod Autoscaler, puoi utilizzare la console Google Cloud o il comando kubectl
.
Console
Vai alla pagina Carichi di lavoro nella console Google Cloud.
Fai clic sul nome del deployment
nginx
.Visualizza la configurazione di Horizontal Pod Autoscaler nella sezione Gestore della scalabilità automatica.
Visualizza altri dettagli sugli eventi di scalabilità automatica nella scheda Eventi.
kubectl get
Per ottenere dettagli su Horizontal Pod Autoscaler, puoi utilizzare kubectl get hpa
con il flag -o yaml
. Il campo status
contiene informazioni sul numero attuale di
repliche e su eventuali eventi di scalabilità automatica recenti.
kubectl get hpa nginx -o yaml
L'output è simile al seguente:
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
annotations:
autoscaling.alpha.kubernetes.io/conditions: '[{"type":"AbleToScale","status":"True","lastTransitionTime":"2019-10-30T19:42:59Z","reason":"ScaleDownStabilized","message":"recent
recommendations were higher than current one, applying the highest recent recommendation"},{"type":"ScalingActive","status":"True","lastTransitionTime":"2019-10-30T19:42:59Z","reason":"ValidMetricFound","message":"the
HPA was able to successfully calculate a replica count from cpu resource utilization
(percentage of request)"},{"type":"ScalingLimited","status":"False","lastTransitionTime":"2019-10-30T19:42:59Z","reason":"DesiredWithinRange","message":"the
desired count is within the acceptable range"}]'
autoscaling.alpha.kubernetes.io/current-metrics: '[{"type":"Resource","resource":{"name":"cpu","currentAverageUtilization":0,"currentAverageValue":"0"}}]'
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"autoscaling/v1","kind":"HorizontalPodAutoscaler","metadata":{"annotations":{},"name":"nginx","namespace":"default"},"spec":{"maxReplicas":10,"minReplicas":1,"scaleTargetRef":{"apiVersion":"apps/v1","kind":"Deployment","name":"nginx"},"targetCPUUtilizationPercentage":50}}
creationTimestamp: "2019-10-30T19:42:43Z"
name: nginx
namespace: default
resourceVersion: "220050"
selfLink: /apis/autoscaling/v1/namespaces/default/horizontalpodautoscalers/nginx
uid: 70d1067d-fb4d-11e9-8b2a-42010a8e013f
spec:
maxReplicas: 10
minReplicas: 1
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx
targetCPUUtilizationPercentage: 50
status:
currentCPUUtilizationPercentage: 0
currentReplicas: 3
desiredReplicas: 3
Prima di seguire gli esempi rimanenti di questo argomento, elimina l'HPA:
kubectl delete hpa nginx
Quando elimini un Horizontal Pod Autoscaler, il numero di repliche del deployment rimane invariato. Un deployment non torna automaticamente allo stato precedente all'applicazione del Horizontal Pod Autoscaler.
Scopri di più sull'eliminazione di un Horizontal Pod Autoscaler.
Scalabilità automatica basata sul traffico del bilanciatore del carico
La scalabilità automatica basata sul traffico è una funzionalità di GKE che integra gli indicatori di utilizzo del traffico dai bilanciatori del carico ai pod con scalabilità automatica.
L'utilizzo del traffico come indicatore di scalabilità automatica può essere utile, poiché il traffico è un indicatore leader del carico, complementare a CPU e memoria. L'integrazione integrata con GKE fa sì che la configurazione sia semplice e che la scalabilità automatica reagisca rapidamente ai picchi di traffico per soddisfare la domanda.
La scalabilità automatica basata sul traffico è abilitata dal controller gateway e dalle sue funzionalità di gestione del traffico globale. Per scoprire di più, consulta Scalabilità automatica basata sul traffico.
La scalabilità automatica basata sul traffico del bilanciatore del carico è disponibile solo per i carichi di lavoro del gateway.
Requisiti
La scalabilità automatica basata sul traffico prevede i seguenti requisiti:
- Funzionalità supportata in GKE 1.24 e versioni successive.
- API Gateway abilitata nel tuo cluster GKE.
- Supportata per il traffico che passa attraverso i bilanciatori del carico di cui è stato eseguito il deployment utilizzando l'API Gateway e
gke-l7-global-external-managed
,gke-l7-regional-external-managed
,gke-l7-rilb
ogke-l7-gxlb
GatewayClass.
Limitazioni
La scalabilità automatica basata sul traffico presenta le seguenti limitazioni:
- Non supportata da GatewayClass multi-cluster
(
gke-l7-global-external-managed-mc
,gke-l7-regional-external-managed-mc
,gke-l7-rilb-mc
egke-l7-gxlb-mc
). - Non supportata per il traffico che utilizza servizi di tipo
ClusterIP
oLoadBalancer
.
Deployment della scalabilità automatica basata sul traffico
L'esercizio seguente utilizza HorizontalPodAutoscaler
per scalare automaticamente il deployment store-autoscale
in base al traffico che riceve. Un gateway accetta il traffico in entrata da internet per i pod. Il gestore della scalabilità automatica confronta gli indicatori di traffico del gateway con la capacità di traffico per pod configurata nella risorsa store-autoscale
Service. Generando traffico verso il gateway, puoi influire sul numero di pod di cui è stato eseguito il deployment.
Il seguente diagramma mostra come funziona la scalabilità automatica basata sul traffico:
Per eseguire il deployment della scalabilità automatica basata sul traffico:
Per i cluster Standard, verifica che le classi Gateway siano installate nel cluster. Per i cluster Autopilot, le classi Gateway sono installate per impostazione predefinita.
kubectl get gatewayclass
L'output conferma che le risorse GKE GatewayClass sono pronte per essere utilizzate nel cluster:
NAME CONTROLLER ACCEPTED AGE gke-l7-global-external-managed networking.gke.io/gateway True 16h gke-l7-regional-external-managed networking.gke.io/gateway True 16h gke-l7-gxlb networking.gke.io/gateway True 16h gke-l7-rilb networking.gke.io/gateway True 16h
Se non vedi questo output, abilita l'API Gateway nel tuo cluster GKE.
Esegui il deployment dell'applicazione di esempio e del bilanciatore del carico del gateway nel tuo cluster:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/gke-networking-recipes/master/gateway/docs/store-autoscale.yaml
L'applicazione di esempio crea:
- Un deployment con 2 repliche.
- Una capacità di servizio con
max-rate-per-endpoint
impostato su10
. Mentre questa funzionalità è in Anteprima, utilizza un'annotazione nel servizio. Quando questa funzionalità sarà in disponibilità generale, il criterio di servizio sostituirà l'annotazione. Per scoprire di più sulle funzionalità Gateway, consulta Funzionalità GatewayClass. - Un gateway esterno per l'accesso all'applicazione su internet. Per saperne di più su come utilizzare i bilanciatori del carico del gateway, consulta la pagina relativa al deployment dei gateway.
- Una libreria HTTPRoute che corrisponde a tutto il traffico e la invia al servizio
store-autoscale
.
La capacità del servizio è un elemento critico quando si utilizza la scalabilità automatica basata sul traffico, perché determina la quantità di traffico per pod che attiva un evento di scalabilità automatica. Viene configurata la capacità del servizio utilizzando l'annotazione del servizio
networking.gke.io/max-rate-per-endpoint
, che definisce il traffico massimo che un servizio deve ricevere in richieste al secondo per pod. La capacità del servizio è specifica per la tua applicazione. Per maggiori informazioni, consulta Determinazione della capacità del servizio.Salva il seguente manifest come
hpa.yaml
:apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: store-autoscale spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: store-autoscale minReplicas: 1 maxReplicas: 10 metrics: - type: Object object: describedObject: kind: Service name: store-autoscale metric: name: "autoscaling.googleapis.com|gclb-capacity-utilization" target: averageValue: 70 type: AverageValue
Questo manifest descrive un elemento
HorizontalPodAutoscaler
con le seguenti proprietà:minReplicas
emaxReplicas
: imposta il numero minimo e massimo di repliche per questo deployment. In questa configurazione, il numero di pod può scalare da 1 a 10 repliche.describedObject.name: store-autoscale
: il riferimento al serviziostore-autoscale
che definisce la capacità di traffico.scaleTargetRef.name: store-autoscale
: il riferimento al deployment distore-autoscale
che definisce la risorsa scalata dall'Horizontal Pod Autoscaler.averageValue: 70
: valore medio target dell'utilizzo della capacità. In questo modo, Horizontal Pod Autoscaler offre un margine di crescita in modo che i pod in esecuzione possano elaborare il traffico in eccesso durante la creazione di nuovi pod.
Horizontal Pod Autoscaler genera il seguente comportamento di traffico:
- Il numero di pod viene modificato tra 1 e 10 repliche per raggiungere il 70% della frequenza massima per endpoint. Ciò comporta 7 RPS per pod quando
max-rate-per-endpoint=10
. - Con più di 7 RPS per pod, viene fatto lo scale up dei pod fino al raggiungimento del massimo di 10 repliche o fino a quando il traffico medio non è pari a 7 RPS per pod.
- Se il traffico viene ridotto, fare lo scale down dei pod a una velocità ragionevole utilizzando l'algoritmo Horizontal Pod Autoscaler.
Puoi anche eseguire il deployment di un generatore di traffico per convalidare il comportamento della scalabilità automatica basata sul traffico.
A 30 RPS, il deployment viene scalato su 5 repliche, in modo che ogni replica riceva idealmente 6 RPS di traffico, ovvero il 60% di utilizzo per pod. Questo valore è inferiore all'utilizzo target del 70%, per cui i pod vengono scalati in modo appropriato. A seconda delle fluttuazioni del traffico, anche il numero di repliche con scalabilità automatica potrebbe variare. Per una descrizione più dettagliata di come viene calcolato il numero di repliche, consulta Comportamento della scalabilità automatica.
Scalabilità automatica basata su una metrica personalizzata o esterna
Per creare Horizontal Pod Autoscaler per le metriche personalizzate e le metriche esterne, consulta Ottimizzare la scalabilità automatica dei pod in base alle metriche.
Scalabilità automatica basata su più metriche
In questo esempio viene creato un Horizontal Pod Autoscaler che scala automaticamente in base all'utilizzo della CPU e una metrica personalizzata denominata packets_per_second
.
Se hai seguito l'esempio precedente e hai ancora un Horizontal Pod Autoscaler denominato nginx
,
eliminalo prima di seguire questo esempio.
Questo esempio richiede apiVersion: autoscaling/v2
. Per saperne di più
sulle API disponibili, consulta Versioni API per gli oggetti HorizontalPodAutoscaler
.
Salva questo manifest YAML come file denominato nginx-multiple.yaml
:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: nginx
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
- type: Resource
resource:
name: memory
target:
type: AverageValue
averageValue: 100Mi
# Uncomment these lines if you create the custom packets_per_second metric and
# configure your app to export the metric.
# - type: Pods
# pods:
# metric:
# name: packets_per_second
# target:
# type: AverageValue
# averageValue: 100
Applica il manifest YAML:
kubectl apply -f nginx-multiple.yaml
Quando viene creato, Horizontal Pod Autoscaler monitora il deployment nginx
per determinare l'utilizzo medio della CPU,
l'utilizzo medio della memoria e (se hai rimosso il commento) la metrica
packets_per_second
personalizzata. Horizontal Pod Autoscaler scala automaticamente il deployment in base alla metrica il cui valore creerebbe l'evento di scalabilità automatica più grande.
Visualizzazione dei dettagli su Horizontal Pod Autoscaler
Per visualizzare la configurazione e le statistiche di Horizontal Pod Autoscaler, utilizza il seguente comando:
kubectl describe hpa HPA_NAME
Sostituisci HPA_NAME
con il nome del tuo oggetto HorizontalPodAutoscaler
.
Se Horizontal Pod Autoscaler utilizza apiVersion: autoscaling/v2
e si basa su più
metriche, il comando kubectl describe hpa
mostra solo la metrica CPU. Per visualizzare
tutte le metriche, utilizza invece il comando seguente:
kubectl describe hpa.v2.autoscaling HPA_NAME
Sostituisci HPA_NAME
con il nome del tuo oggetto HorizontalPodAutoscaler
.
Lo stato attuale di ogni Horizontal Pod Autoscaler viene mostrato nel campo Conditions
, mentre gli eventi di scalabilità automatica sono elencati nel campo Events
.
L'output è simile al seguente:
Name: nginx
Namespace: default
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"autoscaling/v2","kind":"HorizontalPodAutoscaler","metadata":{"annotations":{},"name":"nginx","namespace":"default"},"s...
CreationTimestamp: Tue, 05 May 2020 20:07:11 +0000
Reference: Deployment/nginx
Metrics: ( current / target )
resource memory on pods: 2220032 / 100Mi
resource cpu on pods (as a percentage of request): 0% (0) / 50%
Min replicas: 1
Max replicas: 10
Deployment pods: 1 current / 1 desired
Conditions:
Type Status Reason Message
---- ------ ------ -------
AbleToScale True ReadyForNewScale recommended size matches current size
ScalingActive True ValidMetricFound the HPA was able to successfully calculate a replica count from memory resource
ScalingLimited False DesiredWithinRange the desired count is within the acceptable range
Events: <none>
Eliminazione di un Horizontal Pod Autoscaler
Puoi eliminare un Horizontal Pod Autoscaler utilizzando la console Google Cloud o il comando kubectl delete
.
Console
Per eliminare Horizontal Pod Autoscaler di nginx
:
Vai alla pagina Carichi di lavoro nella console Google Cloud.
Fai clic sul nome del deployment
nginx
.Fai clic su list Azioni > Scalabilità automatica.
Fai clic su Elimina.
kubectl delete
Per eliminare Horizontal Pod Autoscaler di nginx
, utilizza il comando seguente:
kubectl delete hpa nginx
Quando elimini un Horizontal Pod Autoscaler, il Deployment o (o un altro oggetto deployment) rimane sulla scala esistente e non ripristina il numero di repliche nel manifest originale del deployment. Per ripristinare manualmente il deployment a tre pod, puoi utilizzare il comando kubectl scale
:
kubectl scale deployment nginx --replicas=3
Eseguire la pulizia
Se non lo hai ancora fatto, elimina Horizontal Pod Autoscaler:
kubectl delete hpa nginx
Elimina il deployment
nginx
:kubectl delete deployment nginx
Facoltativamente, elimina il cluster.
Risoluzione dei problemi
Quando configuri Horizontal Pod Autoscaler,potresti visualizzare messaggi di avviso come i seguenti:
unable to fetch pod metrics for pod
È normale visualizzare questo messaggio all'avvio del server delle metriche. Tuttavia, se continui a vedere gli avvisi e noti che i pod non scalano per il tuo carico di lavoro, assicurati di avere specificato richieste di risorse per ogni container nel tuo carico di lavoro. Per utilizzare target percentuali di utilizzo delle risorse con scalabilità automatica orizzontale dei pod, devi configurare le richieste per quella risorsa per ciascun container in esecuzione in ciascun pod nel carico di lavoro. In caso contrario, Horizontal Pod Autoscaler non può eseguire i calcoli necessari e non intraprende alcuna azione relativa a questa metrica.
Passaggi successivi
- Scopri di più sulla scalabilità automatica orizzontale dei pod.
- Scopri di più sulla scalabilità automatica verticale dei pod.
- Scopri di più sulla scalabilità automatica dei pod multidimensionali.
- Scopri di più sulla scalabilità automatica dei deployment con metriche personalizzate.
- Scopri come assegnare risorse della CPU a container e pod.
- Scopri come assegnare risorse di memoria a container e pod.