Condividi tramite


Configurare le VPA del server metriche nel servizio Azure Kubernetes (AKS)

Il server delle metriche è un'origine scalabile ed efficiente delle metriche delle risorse del contenitore per le pipeline di scalabilità automatica predefinite di Kubernetes. Con servizio Azure Kubernetes (servizio Azure Kubernetes), la scalabilità automatica verticale dei pod è abilitata per il server delle metriche. Il server delle metriche viene comunemente usato da altri componenti aggiuntivi Kubernetes, ad esempio Horizontal Pod Autoscaler.

Vertical Pod Autoscaler (VPA) consente di modificare il limite di risorse quando il server metriche riscontra vincoli coerenti di CPU e risorse di memoria.

Operazioni preliminari

Il cluster del servizio Azure Kubernetes esegue Kubernetes versione 1.24 e successive.

Limitazione del server delle metriche

Se la frequenza di limitazione del server metriche è elevata e l'utilizzo della memoria dei due pod è sbilanciato, vuol dire che il server metriche richiede più risorse rispetto ai valori predefiniti specificati.

Per aggiornare i valori del coefficiente, creare un oggetto ConfigMap nello spazio dei nomi kube-system di sovrimpressione per eseguire l'override dei valori nella specifica del server metriche. Per aggiornare il server metriche, seguire questa procedura.

  1. Creare un file ConfigMap denominato metrics-server-config.yaml e copiarlo nel manifesto seguente.

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: metrics-server-config
      namespace: kube-system
      labels:
        kubernetes.io/cluster-service: "true"
        addonmanager.kubernetes.io/mode: EnsureExists
    data:
      NannyConfiguration: |-
        apiVersion: nannyconfig/v1alpha1
        kind: NannyConfiguration
        baseCPU: 100m
        cpuPerNode: 1m
        baseMemory: 100Mi
        memoryPerNode: 8Mi
    

    Nell'esempio ConfigMap, il limite di risorse e la richiesta vengono modificati nel modo seguente:

    • cpu: (100+1n) millicore
    • memoria: (100+8n) mebibyte

    Dove n è il numero di nodi.

  2. Creare ConfigMap usando il comando applicare kubectl e specificare il nome del manifesto YAML.

    kubectl apply -f metrics-server-config.yaml
    
  3. Riavviare i pod del server metriche. Sono disponibili due pod del server metriche e il comando seguente li elimina tutti.

    kubectl -n kube-system delete po -l k8s-app=metrics-server
    
  4. Per verificare che le risorse aggiornate siano state applicate, eseguire il comando seguente per esaminare il log VPA del server metriche.

    kubectl -n kube-system logs metrics-server-pod-name -c metrics-server-vpa
    

    L'output di esempio seguente è simile ai risultati indicanti che sono state applicate le impostazioni di limitazione aggiornate.

    ERROR: logging before flag.Parse: I0315 23:12:33.956112       1 pod_nanny.go:68] Invoked by [/pod_nanny --config-dir=/etc/config --cpu=44m --extra-cpu=0.5m --memory=51Mi --extra-memory=4Mi --poll-period=180000 --threshold=5 --deployment=metrics-server --container=metrics-server]
    ERROR: logging before flag.Parse: I0315 23:12:33.956159       1 pod_nanny.go:69] Version: 1.8.14
    ERROR: logging before flag.Parse: I0315 23:12:33.956171       1 pod_nanny.go:85] Watching namespace: kube-system, pod: metrics-server-545d8b77b7-5nqq9, container: metrics-server.
    ERROR: logging before flag.Parse: I0315 23:12:33.956175       1 pod_nanny.go:86] storage: MISSING, extra_storage: 0Gi
    ERROR: logging before flag.Parse: I0315 23:12:33.957441       1 pod_nanny.go:116] cpu: 100m, extra_cpu: 1m, memory: 100Mi, extra_memory: 8Mi
    ERROR: logging before flag.Parse: I0315 23:12:33.957456       1 pod_nanny.go:145] Resources: [{Base:{i:{value:100 scale:-3} d:{Dec:<nil>} s:100m Format:DecimalSI} ExtraPerNode:{i:{value:0 scale:-3} d:{Dec:<nil>} s: Format:DecimalSI} Name:cpu} {Base:{i:{value:104857600 scale:0} d:{Dec:<nil>} s:100Mi Format:BinarySI} ExtraPerNode:{i:{value:0 scale:0} d:{Dec:<nil>} s: Format:BinarySI} Name:memory
    

Prestare attenzione a baseCPU, cpuPerNode, baseMemorye memoryPerNode, perché ConfigMap non viene convalidato dal servizio Azure Kubernetes. Come procedura consigliata, aumentare gradualmente il valore per evitare il consumo di risorse non necessario. Monitorare in modo proattivo l'utilizzo delle risorse durante l'aggiornamento o la creazione di ConfigMap. Un numero elevato di richieste di risorse potrebbe influire negativamente sul nodo.

Configurare manualmente l'utilizzo delle risorse del server metriche

La VPA del server metriche regola l'utilizzo delle risorse in base al numero di nodi. Se il cluster aumenta o riduce spesso le prestazioni, il server metriche potrebbe essere riavviato di frequente. In questo caso, è possibile ignorare la VPA e controllare manualmente l'utilizzo delle risorse. Questo metodo per configurare la VPA non deve essere eseguito in aggiunta ai passaggi descritti nella sezione precedente.

Se si vuole ignorare la VPA del server metriche e controllarne manualmente l'utilizzo delle risorse, seguire questa procedura.

  1. Creare un file ConfigMap denominato metrics-server-config.yaml e copiarlo nel manifesto seguente.

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: metrics-server-config
      namespace: kube-system
      labels:
        kubernetes.io/cluster-service: "true"
        addonmanager.kubernetes.io/mode: EnsureExists
    data:
      NannyConfiguration: |-
        apiVersion: nannyconfig/v1alpha1
        kind: NannyConfiguration
        baseCPU: 100m
        cpuPerNode: 0m
        baseMemory: 100Mi
        memoryPerNode: 0Mi
    

    In questo esempio, ConfigMap modifica il limite di risorse e la richiesta ai seguenti valori:

    • cpu: 100 millicore
    • memoria: 100 mebibyte

    La modifica del numero di nodi non attiva la scalabilità automatica.

  2. Creare ConfigMap usando il comando applicare kubectl e specificare il nome del manifesto YAML.

    kubectl apply -f metrics-server-config.yaml
    
  3. Riavviare i pod del server metriche. Sono disponibili due pod del server metriche e il comando seguente li elimina tutti.

    kubectl -n kube-system delete po -l k8s-app=metrics-server
    
  4. Per verificare che le risorse aggiornate siano state applicate, eseguire il comando seguente per esaminare il log VPA del server metriche.

    kubectl -n kube-system logs metrics-server-pod-name -c metrics-server-vpa
    

    L'output di esempio seguente è simile ai risultati indicanti che sono state applicate le impostazioni di limitazione aggiornate.

    ERROR: logging before flag.Parse: I0315 23:12:33.956112       1 pod_nanny.go:68] Invoked by [/pod_nanny --config-dir=/etc/config --cpu=44m 
    --extra-cpu=0.5m --memory=51Mi --extra-memory=4Mi --poll-period=180000 --threshold=5 --deployment=metrics-server --container=metrics-server]
    ERROR: logging before flag.Parse: I0315 23:12:33.956159       1 pod_nanny.go:69] Version: 1.8.14
    ERROR: logging before flag.Parse: I0315 23:12:33.956171       1 pod_nanny.go:85] Watching namespace: kube-system, pod: metrics-server-545d8b77b7-5nqq9, container: metrics-server.
    ERROR: logging before flag.Parse: I0315 23:12:33.956175       1 pod_nanny.go:86] storage: MISSING, extra_storage: 0Gi
    ERROR: logging before flag.Parse: I0315 23:12:33.957441       1 pod_nanny.go:116] cpu: 100m, extra_cpu: 0m, memory: 100Mi, extra_memory: 0Mi
    ERROR: logging before flag.Parse: I0315 23:12:33.957456       1 pod_nanny.go:145] Resources: [{Base:{i:{value:100 scale:-3} d:{Dec:<nil>} s:100m Format:DecimalSI} ExtraPerNode:{i:{value:0 scale:-3} d:{Dec:<nil>} s: Format:DecimalSI} Name:cpu} {Base:{i:{value:104857600 scale:0} d:{Dec:<nil>} s:100Mi Format:BinarySI} 
    ExtraPerNode:{i:{value:0 scale:0} d:{Dec:<nil>} s: Format:BinarySI} Name:memory}]
    

Risoluzione dei problemi

  1. Se si usa il file configmap seguente, le personalizzazioni VPA del server metriche non vengono applicate. È necessario aggiungere un'unità per baseCPU.

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: metrics-server-config
      namespace: kube-system
      labels:
        kubernetes.io/cluster-service: "true"
        addonmanager.kubernetes.io/mode: EnsureExists
    data:
      NannyConfiguration: |-
        apiVersion: nannyconfig/v1alpha1
        kind: NannyConfiguration
        baseCPU: 100
        cpuPerNode: 1m
        baseMemory: 100Mi
        memoryPerNode: 8Mi
    

    L'output di esempio seguente è simile ai risultati indicanti che le impostazioni di limitazione aggiornate non vengono applicate.

    ERROR: logging before flag.Parse: I0316 23:32:08.383389       1 pod_nanny.go:68] Invoked by [/pod_nanny --config-dir=/etc/config --cpu=44m 
    --extra-cpu=0.5m --memory=51Mi --extra-memory=4Mi --poll-period=180000 --threshold=5 --deployment=metrics-server --container=metrics-server]
    ERROR: logging before flag.Parse: I0316 23:32:08.383430       1 pod_nanny.go:69] Version: 1.8.14
    ERROR: logging before flag.Parse: I0316 23:32:08.383441       1 pod_nanny.go:85] Watching namespace: kube-system, pod: metrics-server-7d78876589-hcrff, container: metrics-server.
    ERROR: logging before flag.Parse: I0316 23:32:08.383446       1 pod_nanny.go:86] storage: MISSING, extra_storage: 0Gi
    ERROR: logging before flag.Parse: I0316 23:32:08.384554       1 pod_nanny.go:192] Unable to decode Nanny Configuration from config map, using default parameters
    ERROR: logging before flag.Parse: I0316 23:32:08.384565       1 pod_nanny.go:116] cpu: 44m, extra_cpu: 0.5m, memory: 51Mi, extra_memory: 4Mi
    ERROR: logging before flag.Parse: I0316 23:32:08.384589       1 pod_nanny.go:145] Resources: [{Base:{i:{value:44 scale:-3} d:{Dec:<nil>} s:44m Format:DecimalSI} ExtraPerNode:{i:{value:5 scale:-4} d:{Dec:<nil>} s: Format:DecimalSI} Name:cpu} {Base:{i:{value:53477376 scale:0} d:{Dec:<nil>} s:51Mi Format:BinarySI} ExtraPerNode:{i:{value:4194304 scale:0} 
    d:{Dec:<nil>} s:4Mi Format:BinarySI} Name:memory}]
    
  2. Per il cluster Kubernetes versione 1.23 e successive, il server metriche dispone di un podDisruptionBudget. Tale elemento garantisce che i pod del server metriche disponibile siano nel numero minimo di uno. Se si ottiene un risultato simile a questo dopo l'esecuzione di kubectl -n kube-system get po, è possibile che l'utilizzo personalizzato delle risorse sia ridotto. Aumentare i valori del coefficiente per risolvere il problema.

    metrics-server-679b886d4-pxwdf        1/2     CrashLoopBackOff   6 (36s ago)   6m33s
    metrics-server-679b886d4-svxxx        1/2     CrashLoopBackOff   6 (54s ago)   6m33s
    metrics-server-7d78876589-hcrff       2/2     Running            0             37m
    

Passaggi successivi

Il server metriche è un componente nella pipeline delle metriche principali. Per altre informazioni, vedere Progettazione dell'API del server metriche.