Questo documento descrive come configurare la scalabilità automatica orizzontale dei pod per i carichi di lavoro stateless esistenti in esecuzione nel cluster. La scalabilità automatica pod orizzontale regola automaticamente il numero di pod in esecuzione (repliche) per un'applicazione in base alla domanda in tempo reale, rimuovendo i pod quando il carico diminuisce e aggiungendoli quando il carico aumenta. Questo aumento e riduzione della scalabilità è fondamentale per garantire la disponibilità delle applicazioni, l'utilizzo efficiente delle risorse e il risparmio sui costi, in quanto adegua la capacità al traffico degli utenti senza intervento manuale. Man mano che i requisiti del workload dei container cambiano, la scalabilità automatica dei pod elimina la necessità per gli operatori di monitorare costantemente il rendimento 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 saperne di più sui ruoli comuni e sulle attività di esempio a cui facciamo riferimento nei contenuti, consulta Ruoli e attività comuni degli utenti di GKE Enterprise. Google Cloud
Scala un deployment
Utilizza la funzionalità di scalabilità di Kubernetes per scalare in modo appropriato la quantità di pod in esecuzione nel deployment.
Scalare automaticamente i pod di un deployment
Kubernetes offre la scalabilità automatica per eliminare la necessità di aggiornare manualmente il deployment quando la domanda cambia. Completa i seguenti passaggi per scalare automaticamente i pod del deployment:
Per assicurarti che Horizontal Pod Autoscaler possa misurare correttamente la percentuale di CPU, imposta la richiesta di risorse CPU nel deployment.
Imposta Horizontal Pod Autoscaler 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, questo 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, rappresentato come 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 di HPA:
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
Scalare 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, questo 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.
Utilizzare metriche personalizzate di Prometheus per la scalabilità automatica
Per impostazione predefinita, la scalabilità automatica orizzontale dei pod utilizza metriche di risorse standard come l'utilizzo di CPU e memoria. Le metriche standard funzionano per lo scaling 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 tassi di richieste HTTP, profondità della coda e latenza di elaborazione. Il cluster può rispondere in modo più accurato alla domanda reale sfruttando i dati avanzati già raccolti dalla tua suite di monitoraggio Prometheus.
Prerequisiti per l'utilizzo di Prometheus con la scalabilità automatica orizzontale dei pod
Prima di attivare la funzionalità, devono essere soddisfatte le seguenti condizioni:
Server Prometheus esistente: un server Prometheus deve essere già stato deployment e deve essere accessibile dalla rete dall'interno del cluster (il controller HPA non gestisce l'istanza Prometheus stessa). Per saperne di più, consulta Come eseguire il deployment e configurare Prometheus Operator in Kubernetes.
Autorizzazioni amministrative: devi disporre delle autorizzazioni necessarie per modificare la risorsa personalizzata Cluster.
Nessun conflitto API: un controllo preliminare 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.
Attivare e configurare Prometheus
La procedura prevede la definizione delle regole delle metriche e l'aggiornamento della configurazione del cluster:
Crea uno o più ConfigMap di regole delle metriche.
Definisci le regole basate su PromQL per le tue metriche personalizzate in una o più ConfigMap all'interno dello spazio dei nomi del cluster di destinazione. Il controller monitora questi ConfigMap, li unisce e li applica automaticamente all'adattatore.
Per ulteriori informazioni sulla definizione delle regole, consulta Metrics Discovery and Presentation Configuration in kubernetes-sigs/prometheus-adapter.
L'esempio seguente mostra un oggetto 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.
Il seguente esempio 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 del cluster:
Aggiungi l'annotazione
preview.baremetal.cluster.gke.io/metrics-adapter: "true"ametadataper la risorsa personalizzata del 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 Prometheus non richiede l'autenticazione, puoi omettere la sezione
metricsAdapter.prometheus.authdalla specifica del cluster.
Applica la risorsa personalizzata del 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 ha come target le metriche personalizzate definite nei campi
rulesdi ConfigMaps.L'esempio di ConfigMap di un passaggio precedente definiva 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 disattivare l'utilizzo di Prometheus con la scalabilità automatica orizzontale dei pod, rimuovi la
sezione spec.metricsAdapter dalla risorsa personalizzata Cluster.