Configura el ajuste de escala automático horizontal de Pods

El escalado automático horizontal de Pods te permite ajustar automáticamente la cantidad de Pods en ejecución para las cargas de trabajo sin estado existentes en tu clúster según la demanda en tiempo real. El escalador automático agrega Pods cuando aumenta la carga y los quita cuando disminuye la demanda, lo que te ayuda a mantener la disponibilidad de la aplicación, usar los recursos de manera eficiente y controlar los costos sin intervención manual. Puedes escalar en función de las métricas de recursos estándar, como el uso de CPU, o de las métricas de aplicación personalizadas de Prometheus, como las tasas de solicitudes HTTP.

Escala un Deployment

Usa la funcionalidad de escalamiento de Kubernetes para escalar de forma adecuada la cantidad de Pods que se ejecutan en tu implementación.

Escalar automáticamente los Pods de un Deployment

Kubernetes ofrece el ajuste de escala automático para eliminar la necesidad de actualizar de forma manual tu implementación cuando la demanda evoluciona. Completa los siguientes pasos para escalar automáticamente los Pods de tu Deployment:

  1. Para garantizar que el escalador automático horizontal de Pods pueda medir de forma adecuada el porcentaje de CPU, establece la solicitud de recursos de CPU en tu implementación.

  2. Configura el escalador automático horizontal de Pods en tu implementación:

    kubectl --kubeconfig CLUSTER_KUBECONFIG \
        -n NAMESPACE \
        autoscale deployment DEPLOYMENT_NAME \
        --cpu-percent=CPU_PERCENT \
        --min=MIN_NUMBER_REPLICAS \
        --max=MAX_NUMBER_REPLICAS
    

    Reemplaza lo siguiente:

    • CLUSTER_KUBECONFIG: Es el archivo kubeconfig del clúster.

    • NAMESPACE: es el espacio de nombres. En el caso de los clústeres compartidos, debe ser un espacio de nombres del proyecto. En el caso de los clústeres estándar, puede ser cualquier espacio de nombres.

    • DEPLOYMENT_NAME: Es el nombre de la implementación que se escalará automáticamente.

    • CPU_PERCENT: el uso promedio objetivo de CPU que se solicitará, representado como un porcentaje, en todos los Pods.

    • MIN_NUMBER_REPLICAS: Es el límite inferior para la cantidad de Pods que puede aprovisionar el escalador automático.

    • MAX_NUMBER_REPLICAS: Es el límite superior de la cantidad de Pods que puede aprovisionar el escalador automático.

  3. Verifica el estado actual del escalador automático horizontal de Pods:

    kubectl get hpa
    

    El resultado es similar a lo siguiente:

    NAME              REFERENCE                          TARGET    MINPODS   MAXPODS   REPLICAS   AGE
    DEPLOYMENT_NAME   Deployment/DEPLOYMENT_NAME/scale   0% / 50%  1         10        1          18s
    

Escalar manualmente los Pods de un Deployment

Si prefieres ajustar manualmente la escala de un Deployment, ejecuta lo siguiente:

kubectl --kubeconfig CLUSTER_KUBECONFIG \
    -n NAMESPACE \
    scale deployment DEPLOYMENT_NAME \
    --replicas NUMBER_OF_REPLICAS

Reemplaza lo siguiente:

  • CLUSTER_KUBECONFIG: Es el archivo kubeconfig del clúster.

  • NAMESPACE: es el espacio de nombres. En el caso de los clústeres compartidos, debe ser un espacio de nombres del proyecto. Para los clústeres estándar, puede ser cualquier espacio de nombres.

  • DEPLOYMENT_NAME: Es el nombre de la implementación en la que se realizará el ajuste de escala automático.

  • DEPLOYMENT_NAME: Es la cantidad de objetos Pod replicados en la implementación.

Usa métricas personalizadas de Prometheus para el ajuste de escala automático

El escalado automático horizontal de Pods usa métricas de recursos estándar, como el uso de CPU y memoria, de forma predeterminada. Las métricas estándar funcionan para el escalamiento general, pero no son útiles para las cargas de aplicaciones especializadas.

Cuando usas el escalado automático horizontal de Pods con métricas personalizadas de Prometheus, puedes escalar las cargas de trabajo según las métricas específicas de la aplicación, como las tasas de solicitudes HTTP, la profundidad de la cola y la latencia de procesamiento. Tu clúster puede responder con mayor precisión a la demanda del mundo real aprovechando los datos enriquecidos que ya recopiló tu pila de supervisión de Prometheus.

Requisitos previos para usar Prometheus con el escalado automático horizontal de Pods

Antes de habilitar la función, se deben cumplir las siguientes condiciones:

  • Servidor de Prometheus existente: Ya se debe haber implementado un servidor de Prometheus y se debe poder acceder a él desde la red dentro del clúster (el controlador de HPA no administra la instancia de Prometheus en sí). Para obtener más información, consulta Cómo implementar y configurar el operador de Prometheus en Kubernetes.

  • Permisos administrativos: Debes tener los permisos necesarios para modificar el recurso personalizado del clúster.

  • No hay conflictos de API: Una verificación previa confirma que ningún otro componente haya registrado un APIService para custom.metrics.k8s.io. Si existe un conflicto, no se puede habilitar el adaptador.

Habilita y configura Prometheus

El proceso implica definir reglas de métricas y actualizar la configuración del clúster:

  1. Crea uno o más ConfigMaps de reglas de métricas.

    Define las reglas basadas en PromQL para tus métricas personalizadas en uno o más ConfigMaps dentro del espacio de nombres del clúster de destino. El controlador supervisa estos ConfigMaps, los combina y los aplica automáticamente al adaptador.

    Para obtener más información sobre cómo definir reglas, consulta Configuración de descubrimiento y presentación de métricas en kubernetes-sigs/prometheus-adapter.

    En el siguiente ejemplo, se muestra un ConfigMap con reglas definidas para http_requests_per_second en el campo data:

    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>>)'
    
  2. Si tu servidor de Prometheus requiere autenticación, como la seguridad de la capa de transporte mutua (mTLS), crea un Secret de Kubernetes en el formato kubeconfig que contenga las credenciales necesarias.

    En el siguiente ejemplo, se muestra un Secret que admite la autenticación básica:

    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-credentials
    
  3. Actualiza el recurso personalizado del clúster:

    1. Agrega la anotación preview.baremetal.cluster.gke.io/metrics-adapter: "true" al metadata para el recurso personalizado del clúster.

    2. Agrega la sección spec.metricsAdapter para definir la URL de Prometheus y hacer referencia a tus ConfigMaps de reglas.

      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.yaml
      

      Si tu instancia de Prometheus no requiere autenticación, puedes omitir la sección metricsAdapter.prometheus.auth de la especificación del clúster.

  4. Aplica el recurso personalizado de clúster actualizado.

    El controlador implementa de forma automática el adaptador de Prometheus en el espacio de nombres kube-system.

  5. Usa las métricas personalizadas para el escalado automático horizontal de Pods creando un recurso HorizontalPodAutoscaler que se oriente a las métricas personalizadas definidas en los campos rules de ConfigMap.

    En el ejemplo de ConfigMap de un paso anterior, se definió una métrica personalizada http_requests_per_second. Para usar esta métrica, el recurso HorizontalPodAutoscaler debe ser similar al siguiente ejemplo:

    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
    

Inhabilita Prometheus

Para inhabilitar el uso de Prometheus con el escalado automático horizontal de Pods, quita la sección spec.metricsAdapter del recurso personalizado del clúster.