Questo documento descrive come configurare la scalabilità automatica orizzontale dei pod per i carichi di lavoro senza stato esistenti in esecuzione nel cluster. La scalabilità automatica orizzontale dei pod regola automaticamente il numero di pod (repliche) in esecuzione per un'applicazione in base alla domanda in tempo reale, rimuovendo i pod quando il carico diminuisce e aggiungendo pod quando il carico aumenta. Questo scale in e scale out è fondamentale per garantire la disponibilità delle applicazioni, l'utilizzo efficiente delle risorse e il risparmio sui costi, in quanto adatta la capacità con precisione al traffico utente senza intervento manuale. Man mano che i requisiti dei carichi di lavoro dei container si evolvono, la scalabilità automatica dei pod elimina la necessità per gli operatori di monitorare costantemente le prestazioni e regolare manualmente il numero di pod.
Questa pagina è rivolta ad amministratori, architetti e operatori che gestiscono il ciclo di vita dell'infrastruttura tecnologica sottostante. Per scoprire di più sui ruoli comuni e sulle attività di esempio a cui facciamo riferimento nei Google Cloud contenuti, consulta Ruoli e attività comuni degli utenti GKE.
Scala un deployment
Utilizza la funzionalità di scalabilità di Kubernetes per scalare in modo appropriato la quantità di pod in esecuzione nel deployment.
Esegui la scalabilità automatica dei pod di un deployment
Kubernetes offre la scalabilità automatica per eliminare la necessità di aggiornare manualmente il deployment quando la domanda si evolve. Completa i seguenti passaggi per eseguire la scalabilità automatica dei pod del deployment:
Per assicurarti che il gestore della scalabilità automatica orizzontale dei pod possa misurare correttamente la percentuale di CPU, imposta la richiesta di risorse CPU nel deployment.
Imposta il gestore della scalabilità automatica orizzontale dei pod nel deployment:
kubectl --kubeconfig CLUSTER_KUBECONFIG \ -n NAMESPACE \ autoscale deployment DEPLOYMENT_NAME \ --cpu-percent=CPU_PERCENT \ --min=MIN_NUMBER_REPLICAS \ --max=MAX_NUMBER_REPLICASSostituisci quanto segue:
CLUSTER_KUBECONFIG: il file kubeconfig per il cluster.NAMESPACE: lo spazio dei nomi. Per i cluster condivisi, deve essere uno spazio dei nomi del progetto. Per i cluster standard, può essere qualsiasi spazio dei nomi.DEPLOYMENT_NAME: il nome del deployment di cui eseguire la scalabilità automatica.CPU_PERCENT: l'utilizzo medio target della CPU da richiedere, espresso in percentuale, in tutti i pod.MIN_NUMBER_REPLICAS: il limite inferiore per il numero di pod che il gestore della scalabilità automatica può eseguire il provisioning.MAX_NUMBER_REPLICAS: il limite superiore per il numero di pod che il gestore della scalabilità automatica può eseguire il provisioning.
Controlla lo stato attuale del gestore della scalabilità automatica orizzontale dei pod:
kubectl get hpaL'output è simile al seguente:
NAME REFERENCE TARGET MINPODS MAXPODS REPLICAS AGE DEPLOYMENT_NAME Deployment/DEPLOYMENT_NAME/scale 0% / 50% 1 10 1 18s
Scala manualmente i pod di un deployment
Se preferisci scalare manualmente un deployment, esegui:
kubectl --kubeconfig CLUSTER_KUBECONFIG \
-n NAMESPACE \
scale deployment DEPLOYMENT_NAME \
--replicas NUMBER_OF_REPLICAS
Sostituisci quanto segue:
CLUSTER_KUBECONFIG: il file kubeconfig per il cluster.NAMESPACE: lo spazio dei nomi. Per i cluster condivisi, deve essere uno spazio dei nomi del progetto. Per i cluster standard, può essere qualsiasi spazio dei nomi.DEPLOYMENT_NAME: il nome del deployment in cui eseguire la scalabilità automatica.DEPLOYMENT_NAME: il numero di oggettiPodreplicati nel deployment.
Utilizza le metriche personalizzate di Prometheus per la scalabilità automatica
Per impostazione predefinita, la scalabilità automatica orizzontale dei pod utilizza metriche delle risorse standard come l'utilizzo di CPU e memoria. Le metriche standard funzionano per la scalabilità generale, ma non sono utili per i carichi delle applicazioni specializzate.
Quando utilizzi la scalabilità automatica orizzontale dei pod con metriche personalizzate di Prometheus, puoi scalare i carichi di lavoro in base a metriche specifiche dell'applicazione, come le frequenze delle richieste HTTP, la profondità della coda e la latenza di elaborazione. Il cluster può rispondere in modo più accurato alla domanda reale sfruttando le informazioni aggiuntive già raccolte dallo stack di monitoraggio di Prometheus.
Prerequisiti per l'utilizzo di Prometheus con la scalabilità automatica orizzontale dei pod
Prima di abilitare la funzionalità, devono essere soddisfatte le seguenti condizioni:
Server Prometheus esistente: un server Prometheus deve essere già sottoposto a deployment e accessibile dalla rete all'interno del cluster (il controller HPA non gestisce l'istanza di Prometheus stessa). Per ulteriori informazioni, consulta Come eseguire il deployment e configurare l'operatore Prometheus in Kubernetes.
Autorizzazioni amministrative: devi disporre delle autorizzazioni necessarie per modificare la risorsa personalizzata Cluster.
Nessun conflitto API: un controllo preflight verifica che nessun altro componente abbia già registrato un APIService per
custom.metrics.k8s.io. Se esiste un conflitto, l'adattatore non può essere abilitato.
Abilita e configura Prometheus
La procedura prevede la definizione delle regole delle metriche e l'aggiornamento della configurazione del cluster:
Crea uno o più ConfigMap delle regole delle metriche.
Definisci le regole basate su PromQL per le metriche personalizzate in uno o più ConfigMap all'interno dello spazio dei nomi del cluster di destinazione. Il controller osserva questi ConfigMap, li unisce e li applica automaticamente all'adattatore.
Per ulteriori informazioni sulla definizione delle regole, consulta Configurazione di rilevamento e presentazione delle metriche in kubernetes-sigs/prometheus-adapter.
L'esempio seguente mostra un ConfigMap con regole definite per
http_requests_per_secondnel campodata:apiVersion: v1 kind: ConfigMap metadata: name: my-app-rules namespace: <cluster-namespace> data: config.yaml: | rules: - seriesQuery: 'http_requests_total' resources: overrides: namespace_name: {resource: "namespace"} pod_name: {resource: "pod"} name: matches: "^(.*)_total$" as: "${1}_per_second" metricsQuery: 'sum(rate(<<.Series>>{<<.LabelMatchers>>}[5m])) by (<<.GroupBy>>)'Se il server Prometheus richiede l'autenticazione, ad esempio la sicurezza del livello di trasporto reciproco (mTLS), crea un secret Kubernetes in formato kubeconfig contenente le credenziali necessarie.
L'esempio seguente mostra un secret che supporta l'autenticazione di base:
apiVersion: v1 kind: Secret metadata: name: prometheus-auth-secret namespace: <cluster-namespace> annotations: baremetal.cluster.gke.io/mark-source: "true" type: Opaque stringData: config: authentication-credentialsAggiorna la risorsa personalizzata Cluster:
Aggiungi l'annotazione
preview.baremetal.cluster.gke.io/metrics-adapter: "true"aimetadataper la risorsa personalizzata Cluster.Aggiungi la sezione
spec.metricsAdapterper definire l'URL di Prometheus e fare riferimento ai ConfigMap delle regole.apiVersion: baremetal.cluster.gke.io/v1 kind: Cluster metadata: name: <cluster-name> namespace: <cluster-namespace> annotations: preview.baremetal.cluster.gke.io/metrics-adapter: "true" spec: # ... other existing cluster configurations ... metricsAdapter: prometheus: url: "http://prometheus-k8s.monitoring.svc.cluster.local:9090" orgID: "production-environment" auth: configSecretRef: name: prometheus-auth-secret key: config # This is the key within the Secret's 'data' field rules: configMapKeyRefs: - name: my-app-rules key: config.yaml # This is the key within the ConfigMap's 'data' field # - name: base-system-rules # key: config.yamlSe l'istanza di Prometheus non richiede l'autenticazione, puoi omettere la sezione
metricsAdapter.prometheus.authdalla specifica del cluster.
Applica la risorsa personalizzata Cluster aggiornata.
Il controller esegue automaticamente il deployment di Prometheus Adapter nello spazio dei nomi
kube-system.Utilizza le metriche personalizzate per la scalabilità automatica orizzontale dei pod creando una risorsa HorizontalPodAutoscaler che abbia come target le metriche personalizzate definite nei campi
rulesdi ConfigMap.L'esempio di ConfigMap di un passaggio precedente ha definito una metrica personalizzata
http_requests_per_second. Per utilizzare questa metrica, la risorsa HorizontalPodAutoscaler dovrebbe essere simile all'esempio seguente:apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: <name> namespace: <namespace> spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: <workload-name> minReplicas: 1 maxReplicas: 10 metrics: - type: Pods pods: metric: name: http_requests_per_second target: type: AverageValue averageValue: 10
Disabilita Prometheus
Per disabilitare l'utilizzo di Prometheus con la scalabilità automatica orizzontale dei pod, rimuovi la sezione spec.metricsAdapter dalla risorsa personalizzata Cluster.