Compartir a través de


Configurar el VPA del servidor de métricas en Azure Kubernetes Service (AKS)

Servidor de métricas es un origen escalable y eficaz de métricas de recursos de contenedor para canalizaciones de escalado automático integradas de Kubernetes. Con Azure Kubernetes Service (AKS), el escalado automático vertical de pods está habilitado para el servidor de métricas. El servidor de métricas se usa normalmente en otros complementos de Kubernetes, como Escalador automático horizontal de pods.

El escalador automático vertical de pods (VPA) le permite ajustar el límite de recursos cuando el servidor de métricas experimenta restricciones constantes de recursos de CPU y memoria.

Antes de empezar

El clúster de AKS ejecuta la versión 1.24 y posteriores de Kubernetes.

Limitación del servidor de métricas

Si la velocidad de limitación del servidor de métricas es alta y el uso de memoria de sus dos pods está desequilibrado, esto indica que el servidor de métricas requiere más recursos que los valores predeterminados especificados.

Para actualizar los valores de coeficiente, cree un archivo ConfigMap en el espacio de nombres de superposición kube-system para invalidar los valores de la especificación del servidor de métricas. Realice los siguientes pasos para actualizar el servidor de métricas.

  1. Cree un archivo ConfigMap denominado metrics-server-config.yaml y cópielo en el siguiente manifiesto.

    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
    

    En este ejemplo de ConfigMap, el límite de recursos y la solicitud cambian a lo siguiente:

    • CPU: (100+1n) millicore
    • Memoria: (100+8n) mebibyte

    Donde n es el número de nodos.

  2. Cree el archivo ConfigMap mediante el comando kubectl apply y especifique el nombre de su manifiesto de YAML:

    kubectl apply -f metrics-server-config.yaml
    
  3. Reiniciar los pods del servidor de métricas. Hay dos pods del servidor de métricas y el siguiente comando los elimina todos.

    kubectl -n kube-system delete po -l k8s-app=metrics-server
    
  4. Para comprobar que los recursos actualizados surtirán efecto, ejecute el siguiente comando para revisar el registro de VPA del servidor de métricas.

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

    El siguiente ejemplo de salida es similar a los resultados que muestran la configuración de limitación actualizada que se aplicó.

    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
    

Tenga cuidado con baseCPU, cpuPerNode, baseMemory y memoryPerNode, ya que AKS no valida ConfigMap. Como práctica recomendada, aumente el valor gradualmente para evitar el consumo innecesario de recursos. Supervise de forma proactiva el uso de recursos al actualizar o crear el archivo ConfigMap. Un gran número de solicitudes de recursos podría afectar negativamente al nodo.

Configuración manual del uso de recursos del servidor de métricas

El VPA del servidor de métricas ajusta el uso de recursos por el número de nodos. Si el clúster se escala o reduce verticalmente con frecuencia, el servidor de métricas puede reiniciarse con frecuencia. En este caso, puede omitir el VPA y controlar manualmente su uso de los recursos. Este método para configurar el VPA no se realizará además de los pasos descritos en la sección anterior.

Si desea omitir el VPA para métricas de servidor y controlar manualmente su uso de recursos, realice los pasos siguientes.

  1. Cree un archivo ConfigMap denominado metrics-server-config.yaml y cópielo en el siguiente manifiesto.

    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
    

    En este ejemplo de ConfigMap, este cambia el límite de recursos y la solicitud a lo siguiente:

    • cpu: 100 milinúcleos
    • memoria: 100 mebibyte

    Cambiar el número de nodos no desencadena el escalado automático.

  2. Cree el archivo ConfigMap mediante el comando kubectl apply y especifique el nombre de su manifiesto de YAML:

    kubectl apply -f metrics-server-config.yaml
    
  3. Reiniciar los pods del servidor de métricas. Hay dos pods del servidor de métricas y el siguiente comando los elimina todos.

    kubectl -n kube-system delete po -l k8s-app=metrics-server
    
  4. Para comprobar que los recursos actualizados surtirán efecto, ejecute el siguiente comando para revisar el registro de VPA del servidor de métricas.

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

    El siguiente ejemplo de salida es similar a los resultados que muestran la configuración de limitación actualizada que se aplicó.

    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}]
    

Solución de problemas

  1. Si usa el siguiente configmap, no se aplican las personalizaciones del VPA del servidor de métricas. Necesita agregar una unidad para 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
    

    El siguiente ejemplo de salida es similar a los resultados que muestran la configuración de limitación actualizada que se aplica.

    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. Para los clústeres de Kubernetes versión 1.23 y posteriores, el servidor de métricas tiene un podDisruptionBudget. Garantiza que el número de pods disponibles del servidor de métricas sea al menos uno. Si obtiene algo parecido a esto después de ejecutar kubectl -n kube-system get po, es posible que el uso de recursos personalizado sea pequeño. Aumente los valores de los coeficientes para resolverlo.

    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
    

Pasos siguientes

El servidor de métricas es un componente de la canalización de métricas principales. Para obtener más información, consulte Diseño de la API del servidor de métricas.