La scalabilità automatica verticale dei pod automatizza l'impostazione delle richieste di risorse di CPU e memoria e dei limiti per i container all'interno dei pod Kubernetes. La scalabilità automatica pod verticale analizza l'utilizzo delle risorse storico e attuale per fornire consigli, che può visualizzare o applicare automaticamente aggiornando i pod. Questa funzionalità migliora la stabilità e l'efficienza in termini di costi dimensionando correttamente le allocazioni delle risorse.
Prima di iniziare
Prima di configurare Scalabilità automatica pod verticale, assicurati di soddisfare i seguenti prerequisiti:
- Hai un cluster bare metal in esecuzione.
- Hai accesso
kubectlal cluster. - Metrics Server è disponibile nel cluster. I cluster bare metal includono Metrics Server per impostazione predefinita.
Abilita scalabilità automatica pod verticale
Abilita la scalabilità automatica verticale dei pod sul cluster bare metal impostando un'annotazione di anteprima e configurando la specifica del cluster:
Aggiungi o aggiorna l'annotazione di anteprima nella risorsa personalizzata Cluster.
Modifica direttamente la risorsa personalizzata del cluster o il file di configurazione del cluster e utilizza
bmctl update.metadata: annotations: preview.baremetal.cluster.gke.io/vertical-pod-autoscaler: enableModifica
specdella risorsa personalizzata Cluster per includere il campoverticalPodAutoscalinge specifica le modalitàenableUpdatereenableMemorySaver:apiVersion: baremetal.cluster.gke.io/v1 kind: Cluster metadata: name: cluster1 namespace: cluster-cluster1 annotations: preview.baremetal.cluster.gke.io/vertical-pod-autoscaler: enable spec: # ... other cluster spec fields verticalPodAutoscaling: enableUpdater: true # Set to true for automated updates enableMemorySaver: true # Set to true to reduce recommender memory usageSe hai modificato il file di configurazione del cluster, applica le modifiche utilizzando il seguente comando:
bmctl update cluster -c CLUSTER_NAME --kubeconfig KUBECONFIGSostituisci quanto segue:
CLUSTER_NAME: il nome del tuo cluster.KUBECONFIG: il percorso del file kubeconfig del cluster.
Crea una risorsa personalizzata VerticalPodAutoscaler
Dopo aver abilitato la scalabilità automatica verticale dei pod sul cluster, definisci una risorsa personalizzata VerticalPodAutoscaler per scegliere come target workload specifici:
Definisci una risorsa
VerticalPodAutoscalernello stesso spazio dei nomi del workload di destinazione.Questa risorsa personalizzata specifica i pod di destinazione utilizzando
targetRefe qualsiasi criterio delle risorse.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"]Applica il manifest
VerticalPodAutoscalerutilizzando questo comando:kubectl apply -f VPA_MANIFEST \ --kubeconfig KUBECONFIGSostituisci quanto segue:
VPA_MANIFEST: il percorso del file manifestVerticalPodAutoscaler.KUBECONFIG: il percorso del file kubeconfig del cluster.
Informazioni sulle modalità di scalabilità automatica del pod verticale
La scalabilità automatica verticale dei pod funziona in diverse modalità che controllano il modo in cui applica i suggerimenti per le risorse.
Modalità di suggerimento
In modalità di suggerimento, la scalabilità automatica verticale dei pod installa il componente di suggerimento. Questo componente analizza l'utilizzo delle risorse e pubblica i valori consigliati per le richieste e i limiti di CPU e memoria nella sezione di stato delle risorse personalizzate VerticalPodAutoscaler che crei.
Per visualizzare i suggerimenti relativi a richieste e limiti delle risorse, utilizza il seguente comando:
kubectl describe vpa VPA_NAME \
--kubeconfig KUBECONFIG \
-n CLUSTER_NAMESPACE
Replace the following:
* `VPA_NAME`: the name of the `VerticalPodAutoscaler`
that's targeting the workloads for which you are considering resource
adjustments.
* `KUBECONFIG`: the path of the cluster kubeconfig
file.
* `CLUSTER_NAMESPACE`: the name of the cluster that's
running vertical Pod autoscaling.
La risposta deve contenere una sezione Status simile al seguente
esempio:
Status:
Conditions:
Last Transition Time: 2025-08-04T23:53:32Z
Status: True
Type: RecommendationProvided
Recommendation:
Container Recommendations:
Container Name: hamster
Lower Bound:
Cpu: 100m
Memory: 262144k
Target:
Cpu: 587m
Memory: 262144k
Uncapped Target:
Cpu: 587m
Memory: 262144k
Upper Bound:
Cpu: 1
Memory: 500Mi
I pod non vengono aggiornati automaticamente in questa modalità. Utilizza questi suggerimenti per
aggiornare manualmente le configurazioni dei pod. Questo è il comportamento predefinito se
enableUpdater
non è impostato o è false.
Modalità di aggiornamento automatizzato
Quando imposti
enableUpdater
enableUpdater
su true, i controller del ciclo di vita bare metal eseguono il deployment dei componenti di aggiornamento e controller di ammissione di Vertical Pod Autoscaler, oltre al sistema di suggerimenti. L'aggiornamento monitora i pod le cui richieste di risorse attuali si discostano in modo significativo dai consigli.
Il criterio di aggiornamento nella risorsa VerticalPodAutoscaler specifica il modo in cui
lo strumento di aggiornamento applica i consigli. Per impostazione predefinita, la modalità di aggiornamento è Auto,
che stabilisce che l'updater assegna le impostazioni delle risorse aggiornate alla creazione del pod. Il seguente esempio di VerticalPodAutoscaler mostra come impostare la modalità di aggiornamento su Initial:
apiVersion: "autoscaling.k8s.io/v1"
kind: VerticalPodAutoscaler
metadata:
name: hamster-vpa
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment
name: hamster
resourcePolicy:
updatePolicy:
updateMode: "Initial"
...
L'utilità di aggiornamento supporta le seguenti cinque modalità:
Auto: l'aggiornamento espelle il pod. Il controller di ammissione intercetta la richiesta di creazione del nuovo pod e la modifica in modo che utilizzi i valori consigliati per CPU e memoria forniti dal sistema di suggerimenti. L'aggiornamento delle risorse richiede la ricreazione del pod, che può causare interruzioni. Utilizza i Pod Disruption Budgets, che l'utilità di aggiornamento rispetta, per gestire la procedura di eliminazione. Questa modalità è equivalente aRecreate.Recreate: lo strumento di aggiornamento espelle i pod e assegna richieste e limiti di risorse consigliati quando il pod viene ricreato.InPlaceOrRecreate(alpha): lo strumento di aggiornamento tenta di eseguire aggiornamenti in loco nel miglior modo possibile, ma potrebbe ripristinare il pod se gli aggiornamenti in loco non sono possibili. Per saperne di più, consulta la documentazione relativa al ridimensionamento in loco dei pod.Initial: l'updater assegna le richieste di risorse solo al momento della creazione del pod e non le modifica mai in un secondo momento.Off: lo strumento di aggiornamento non modifica automaticamente i requisiti di risorse dei pod. I consigli vengono calcolati e possono essere esaminati nell'oggettoVerticalPodAutoscaler.
Per saperne di più sulla risorsa personalizzata VerticalPodAutoscaler, utilizza
kubectl per recuperare la definizione della risorsa personalizzata verticalpodautoscalercheckpoints.autoscaling.k8s.io
installata sul cluster versione 1.33.0 o successive.
Il seguente esempio mostra come potrebbero apparire i consigli sulle risorse nella sezione Status per il contenitore hamster. Il campione mostra anche un esempio
di un evento di rimozione di un pod, che si verifica quando l'updater rimuove un pod prima di
assegnare automaticamente la configurazione delle risorse consigliata al pod ricreato:
Spec:
Resource Policy:
Container Policies:
Container Name: *
Controlled Resources:
cpu
memory
Max Allowed:
Cpu: 1
Memory: 500Mi
Min Allowed:
Cpu: 100m
Memory: 50Mi
Target Ref:
API Version: apps/v1
Kind: Deployment
Name: hamster
Update Policy:
Update Mode: Auto
Status:
Conditions:
Last Transition Time: 2025-08-04T23:53:32Z
Status: True
Type: RecommendationProvided
Recommendation:
Container Recommendations:
Container Name: hamster
Lower Bound:
Cpu: 100m
Memory: 262144k
Target:
Cpu: 587m
Memory: 262144k
Uncapped Target:
Cpu: 587m
Memory: 262144k
Upper Bound:
Cpu: 1
Memory: 500Mi
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal EvictedPod 49s vpa-updater VPA Updater evicted Pod hamster-7cb59fb657-lkrk4 to apply resource recommendation.
Modalità Risparmio memoria
La modalità Risparmio memoria riduce l'impronta di memoria del componente di suggerimento
della scalabilità automatica pod verticale. Quando imposti
enableMemorySaver
su true, il sistema di suggerimenti monitora e calcola solo le aggregazioni per i pod che
hanno una risorsa personalizzata VerticalPodAutoscaler corrispondente.
Il compromesso è che quando crei una nuova risorsa personalizzata VerticalPodAutoscaler per un workload esistente, il recommender impiega un po' di tempo (fino a 24 ore) per raccogliere una cronologia sufficiente a fornire consigli accurati. Questa
modalità è false per impostazione predefinita per la maggior parte dei tipi di cluster, ma è impostata su true per
i cluster edge.
Utilizzare Prometheus come fornitore di cronologia permanente
Per impostazione predefinita, il componente Recommender mantiene in memoria la cronologia del consumo di risorse dei carichi di lavoro in esecuzione sul cluster e, periodicamente, salva il suo stato in una risorsa personalizzata VerticalPodAutoscalerCheckpoint in etcd per garantire la resilienza ai riavvii.
A partire dalla versione 1.34 di Google Distributed Cloud, puoi utilizzare la tua istanza di Prometheus come fornitore di cronologia persistente per i dati sul consumo di risorse, ovvero le metriche di utilizzo di CPU e memoria. Quando questa integrazione è abilitata, il sistema di suggerimenti può eseguire query sul server Prometheus all'avvio o al riavvio per recuperare i dati storici a lungo termine sull'utilizzo delle risorse per tutti i pod gestiti. Il recupero di questi dati consente al sistema di raccomandazione di creare immediatamente il proprio stato interno con un set di dati ricco, il che porta a raccomandazioni più informate e accurate fin dall'inizio.
L'utilizzo di Prometheus come fornitore di cronologia persistente offre i seguenti vantaggi:
Ottimizzazione dell'utilizzo delle risorse:genera consigli ben informati e accurati non appena viene avviato, in modo da poter ottimizzare l'utilizzo delle risorse del cluster.
Prevenzione degli errori di esaurimento della memoria (OOM):Prometheus elimina la necessità di archiviare lo stato interno del sistema di raccomandazione nelle risorse personalizzate (CR)
VerticalPodAutoscalerCheckpoint, rendendo più efficiente l'utilizzo della memoria ETCD. Quando il componente del sistema di raccomandazione viene riavviato, perde i dati storici in memoria. Quando utilizzi Prometheus come fornitore di dati storici, il sistema di suggerimenti recupera le metriche storiche da Prometheus al riavvio, il che elimina la necessità del CRVerticalPodAutoscalerCheckpointe salva la memoria ETCD.
Puoi attivare e disattivare l'utilizzo di Prometheus come fornitore di cronologia persistente in qualsiasi momento.
Prerequisiti per l'utilizzo di Prometheus con la scalabilità automatica verticale dei pod
Per utilizzare la tua istanza Prometheus come fornitore di dati storici per la scalabilità automatica pod verticale, devi configurarla per eseguire lo scraping delle metriche necessarie, il che comporta i seguenti passaggi:
Se necessario, esegui il deployment di Prometheus Operator nel cluster per cui vuoi utilizzarlo come fornitore di cronologia persistente per la scalabilità automatica verticale dei pod. Per saperne di più, consulta Come eseguire il deployment e configurare l'operatore Prometheus in Kubernetes.
Configura le autorizzazioni per lo scraping delle metriche.
Per consentire a Prometheus di recuperare le metriche da cAdvisor utilizzando un file di configurazione, devi concedere autorizzazioni aggiuntive al account di servizio utilizzato dal server Prometheus. Crea o aggiorna un
ClusterRolecontenente queste regole e assicurati che sia associato al account di servizio Prometheus corretto utilizzando unClusterRoleBinding:apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: prometheus-role labels: app: prometheus-server rules: - apiGroups: [""] resources: - nodes verbs: - get - list - watch - apiGroups: [""] resources: - nodes/proxy - nodes/metrics verbs: - get --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: prometheus-binding labels: app: prometheus-server subjects: - kind: ServiceAccount name: prometheus-server # Service account being used by prometheus namespace: prometheus # Service account's namespace roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: prometheus-role # Name of the ClusterRole created aboveAggiorna il file di configurazione di Prometheus per estrarre le seguenti metriche da cAdvisor:
container_cpu_usage_seconds_totalcontainer_memory_working_set_bytes
Le seguenti righe definiscono i dettagli dello scraping per le metriche cAdvisor:
- job_name: 'kubernetes-cadvisor' scheme: https tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token kubernetes_sd_configs: - role: node relabel_configs: - action: labelmap regex: __meta_kubernetes_node_label_(.+) - target_label: __address__ replacement: kubernetes.default.svc:443 - source_labels: [__meta_kubernetes_node_name] regex: (.+) target_label: __metrics_path__ replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor metric_relabel_configs: # Keep only the metrics VPA uses to save disk space - source_labels: [__name__] regex: (container_cpu_usage_seconds_total|container_memory_working_set_bytes) action: keepAggiorna il file di configurazione di Prometheus per eseguire lo scraping della seguente metrica dal servizio
kube-state-metrics:kube_pod_labels
Esegui il deployment di un servizio
kube-state-metricssul tuo cluster.Puoi utilizzare i seguenti comandi Helm per installare il nuovo servizio:
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm repo updateCrea un file
ksm-values.yamlcon il seguente contenuto:fullnameOverride: vpa-kube-state-metrics metricAllowlist: - kube_pod_labels metricLabelsAllowlist: - "pods=[*]"Installa un grafico Helm in base al file di valori del passaggio precedente:
helm install vpa-ksm prometheus-community/kube-state-metrics \ -f ksm-values.yaml --namespace kube-systemAggiungi le seguenti righe al file di configurazione di Prometheus per eseguire lo scraping della metrica
kube_pod_labelsdal serviziokube-state-metricsinstallato:- job_name: 'kube-state-metrics' static_configs: - targets: ['vpa-kube-state-metrics.kube-system.svc.cluster.local:8080'] metric_relabel_configs: - source_labels: [ __name__ ] regex: 'kube_pod_labels' action: keep
Abilitare e utilizzare Prometheus
La scalabilità automatica pod verticale supporta sia l'autenticazione di base sia quella basata su token
di autenticazione per la connessione a Prometheus. Quando utilizzi
l'autenticazione, devi creare un Secret contenente le credenziali
necessarie nello spazio dei nomi del cluster. Il controller inoltra questo secret al cluster di destinazione e lo monta come volume o variabile di ambiente nel pod di suggerimento. Puoi anche utilizzare Prometheus senza autenticazione.
Per abilitare e utilizzare la tua istanza Prometheus con la scalabilità automatica pod verticale,
devi configurare la sezione verticalPodAutoscaling nella specifica del cluster
con i dettagli per la connessione alla tua istanza Prometheus.
Ecco un esempio della configurazione nella specifica del cluster da utilizzare con un token di autenticazione:
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
name: cluster1
namespace: cluster-cluster1
annotations:
preview.baremetal.cluster.gke.io/vertical-pod-autoscaler: enable
spec:
# ... other existing cluster configurations ...
verticalPodAutoscaling:
# ... other vertical Pod autoscaling configurations ...
# Add this new section to configure the vpa to use prometheus using bearer token authentication as history provider
prometheus:
url: "http://prometheus.prometheus.monitoring.svc.cluster.local:9090"
auth:
bearerTokenAuth:
name: prom-bearer-creds
key: bearertoken
Per abilitare Prometheus per l'utilizzo con la scalabilità automatica verticale dei pod:
Assicurati che l'istanza Prometheus sia configurata per estrarre le metriche richieste come descritto in Prerequisiti per l'utilizzo di Prometheus con la scalabilità automatica verticale dei pod.
Aggiorna la risorsa personalizzata Cluster
specin modo che il campoverticalPodAutoscaling.prometheusspecifichi le impostazioni di connessione per il server Prometheus.Aggiungi
urlalla sezioneprometheuse impostalo sul nome di dominio completo (FQDN) per la connessione a Prometheus dall'interno del cluster:spec: # ... other existing cluster configurations ... verticalPodAutoscaling: # ... other vpa configurations ... # Add this new section to configure the vpa to use prometheus as history provider prometheus: # Required: The URL of the Prometheus server url: "http://prometheus.prometheus.svc.cluster.local:9090"Specifica i dettagli della connessione:
La scalabilità automatica del pod verticale supporta i seguenti tre metodi di connessione:
- Nessuna autenticazione
- Autenticazione di base (nome utente, password)
Autenticazione con token di connessione
Nessuna autenticazione
Se la tua istanza Prometheus non richiede l'autenticazione, hai finito. La sezione
prometheusdeve includere solo un campourl.Autenticazione di base
Per specificare l'autenticazione di base per Prometheus:
Crea un secret che contenga un nome utente e una password nella sezione
stringDatae nell'annotazionebaremetal.cluster.gke.io/mark-source: "true".L'esempio seguente mostra un secret che supporta l'autenticazione di base:
apiVersion: v1 kind: Secret metadata: name: prom-basic-creds namespace: <cluster-namespace> annotations: baremetal.cluster.gke.io/mark-source: "true" type: Opaque stringData: username: admin password: pwdL'annotazione è necessaria per garantire che il secret di origine e il secret nel cluster di destinazione siano sempre sincronizzati. Il secret viene aggiornato quando viene aggiornato il secret di origine.
Aggiorna la sezione
prometheus.auth.basicAuthdella specifica del cluster in modo che faccia riferimento al nome utente e alla password del campodatanel secret.L'esempio seguente mostra una sezione
basicAuthche fa riferimento al nome utente e alla password nel secret del passaggio precedente:# ... other vpa configurations ... prometheus: url: "http://prometheus.prometheus.svc.cluster.local:9090" auth: basicAuth: usernameRef: name: prom-basic-creds key: username passwordRef: name: prom-basic-creds key: passwordIl nome utente e la password devono trovarsi nello stesso secret. Le chiavi devono essere chiavi valide del campo
datadel secret.
L'istanza Prometheus dovrebbe iniziare a funzionare come fornitore di cronologia per la scalabilità automatica verticale dei pod quando viene aggiornata la risorsa personalizzata del cluster.
Autenticazione con token di connessione
Per specificare l'autenticazione con token di autenticazione per Prometheus:
Crea un secret che contenga un token di autenticazione nella sezione
stringDatae nell'annotazionebaremetal.cluster.gke.io/mark-source: "true".L'esempio seguente mostra un secret che supporta l'autenticazione con token di autenticazione:
apiVersion: v1 kind: Secret metadata: name: prom-bearer-creds namespace: <cluster-namespace> annotations: baremetal.cluster.gke.io/mark-source: "true" type: Opaque stringData: bearertoken: "SAMPLE_TOKEN"L'annotazione è necessaria per garantire che il secret di origine e il secret nel cluster di destinazione siano sempre sincronizzati. Il secret viene aggiornato quando viene aggiornato il secret di origine.
Aggiorna la sezione
prometheus.auth.bearerTokenAuthdella specifica del cluster in modo che faccia riferimento al token di autenticazione dal campodatanel secret.L'esempio seguente mostra una sezione
bearerTokenAuthche fa riferimento al token di autenticazione nel segreto del passaggio precedente:# ... other vertical Pod autoscaling configurations ... prometheus: url: "http://prometheus.prometheus.svc.cluster.local:9090" auth: bearerTokenAuth: name: prom-bearer-creds key: bearertokenLa chiave deve essere una chiave valida del campo
datadel secret.
L'istanza Prometheus dovrebbe iniziare a funzionare come provider di cronologia per la scalabilità automatica verticale dei pod quando viene aggiornata la risorsa personalizzata del cluster.
Disabilita l'utilizzo di Prometheus
Per disattivare l'utilizzo di Prometheus con la scalabilità automatica verticale dei pod, rimuovi la sezione
prometheus dalla sezione verticalPodAutoscaling della risorsa personalizzata Cluster.
Disabilita la scalabilità automatica del pod verticale
Disattiva la scalabilità automatica verticale dei pod rimuovendo le relative risorse personalizzate e la relativa configurazione dal cluster:
Elimina tutte le risorse personalizzate
VerticalPodAutoscalerche hai creato.Modifica la risorsa personalizzata del cluster e rimuovi l'intera sezione
verticalPodAutoscalingdaspec.Puoi modificare direttamente la risorsa personalizzata Cluster o modificare il file di configurazione del cluster e utilizzare
bmctl update.Rimuovi l'annotazione
preview.baremetal.cluster.gke.io/vertical-pod-autoscalerdalla risorsa personalizzata del cluster.
Limitazioni
Tieni presenti le seguenti limitazioni quando utilizzi Scalabilità automatica pod verticale:
- La scalabilità automatica pod verticale non è pronta per l'uso con i workload basati su JVM a causa della visibilità limitata sull'utilizzo effettivo della memoria del workload.
- L'aggiornamento richiede un minimo di due repliche di pod per i deployment per sostituire i pod con valori di risorse rivisti.
- L'updater non aggiorna rapidamente i pod che vanno in crash a causa di errori di memoria insufficiente (OOM).
- Il criterio di aggiornamento
InPlaceOrRecreateper i pod è una funzionalità alpha all'interno della scalabilità automatica verticale dei pod. Tenta di eseguire aggiornamenti in loco con il massimo impegno, ma potrebbe tornare alla ricreazione del pod se gli aggiornamenti in loco non sono possibili.
Passaggi successivi
- Esplora i budget di interruzione dei pod.