Configura el ajuste de escala automático horizontal de Pods

En este documento, se describe cómo configurar el ajuste automático de escala horizontal de Pods para cargas de trabajo sin estado existentes que se ejecutan en tu clúster. El ajuste de escala automático horizontal de Pods ajusta automáticamente la cantidad de Pods en ejecución (réplicas) para una aplicación según la demanda en tiempo real, quita Pods cuando disminuye la carga y agrega Pods cuando aumenta la carga. Esta expansión y reducción es fundamental para garantizar la disponibilidad de la aplicación, el uso eficiente de los recursos y el ahorro de costos, ya que la capacidad se ajusta con precisión al tráfico de usuarios sin intervención manual. A medida que evolucionan los requisitos de carga de trabajo de tu contenedor, el ajuste de escala automático de pods elimina la necesidad de que los operadores supervisen constantemente el rendimiento y ajusten manualmente los recuentos de pods.

Esta página está destinada a administradores, arquitectos y operadores que administran el ciclo de vida de la infraestructura tecnológica subyacente. Para obtener más información sobre los roles comunes y las tareas de ejemplo a las que hacemos referencia en el contenido de Google Cloud , consulta Roles de usuario y tareas comunes de GKE Enterprise.

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.

Ajusta automáticamente la escala de los Pods de una implementación

Kubernetes ofrece el ajuste de escala automático para eliminar la necesidad de actualizar manualmente tu implementación cuando evoluciona la demanda. Completa los siguientes pasos para ajustar automáticamente la escala de los pods de tu implementación:

  1. Para garantizar que el escalador automático de Pods horizontal pueda medir correctamente 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ándares, puede ser cualquier espacio de nombres.

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

    • CPU_PERCENT: Es el porcentaje de uso promedio de CPU objetivo que se solicitará 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 para 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
    

Ajusta manualmente la escala de los Pods de una implementación

Si prefieres ajustar la escala de una implementación de forma manual, ejecuta el siguiente comando:

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. En el caso de los clústeres estándares, 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

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

Cuando usas el ajuste de escala automático horizontal de Pods con métricas personalizadas de Prometheus, puedes escalar cargas de trabajo en función de 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 ajuste de escala automático horizontal de Pods

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

  • Servidor de Prometheus existente: Ya debe haber implementado un servidor de Prometheus al que se pueda acceder 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 de administrador: Debes tener los permisos necesarios para modificar el recurso personalizado del clúster.

  • Sin conflictos de API: Una verificación previa comprueba que ningún otro componente ya 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 la presentación y el descubrimiento 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 seguridad de la capa de transporte mutua (mTLS), crea un objeto Secret de Kubernetes en formato kubeconfig que contenga las credenciales necesarias.

    En el siguiente ejemplo, se muestra un objeto 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 Cluster:

    1. Agrega la anotación preview.baremetal.cluster.gke.io/metrics-adapter: "true" a 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 del clúster actualizado.

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

  5. Para usar las métricas personalizadas en el ajuste de escala automático horizontal de Pods, crea un recurso HorizontalPodAutoscaler que apunte a las métricas personalizadas definidas en los campos de ConfigMaps rules.

    La muestra de ConfigMap de un paso anterior 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 ajuste de escala automático horizontal de Pods, quita la sección spec.metricsAdapter del recurso personalizado Cluster.