Habilita las métricas personalizadas definidas por el usuario para el ajuste de escala automático horizontal de pods

En este tema, se describe cómo configurar métricas definidas por el usuario para el ajuste de escala automático horizontal de Pods (HPA) en clústeres de Anthos alojados en VMware (GKE On-Prem).

Habilita Logging y Monitoring para las aplicaciones de usuario

La configuración de Logging y Monitoring se conserva en un objeto de Stackdriver llamado stackdriver.

  1. Abre el objeto stackdriver para editarlo:

    kubectl --kubeconfig=USER_CLUSTER_KUBECONFIG --namespace kube-system edit stackdriver stackdriver
    

    Reemplaza USER_CLUSTER_KUBECONFIG con la ruta de tu archivo kubeconfig del clúster de usuario.

  2. En spec, configura enableStackdriverForApplications y enableCustomMetricsAdapter como true:

    apiVersion: addons.sigs.k8s.io/v1alpha1
    kind: Stackdriver
    metadata:
    name: stackdriver
    namespace: kube-system
    spec:
    projectID: project-id
    clusterName: cluster-name
    clusterLocation: cluster-location
    proxyConfigSecretName: secret-name
    enableStackdriverForApplications: true
    enableCustomMetricsAdapter: true
    enableVPC: stackdriver-enable-VPC
    optimizedMetrics: true
    
  3. Guarda y cierra el archivo editado.

Una vez que se completan estos pasos, todos los registros de la aplicación del usuario se envían a Cloud Logging.

El siguiente paso es anotar la aplicación de usuario para la recopilación de métricas.

Anota una aplicación de usuario para la recopilación de métricas

Para anotar una aplicación de usuario que se debe recopilar y los registros enviados a Cloud Monitoring, debes agregar annotations correspondiente a los metadatos del servicio, el pod y los extremos.

  metadata:
    name: "example-monitoring"
    namespace: "default"
    annotations:
      prometheus.io/scrape: "true"
      prometheus.io/path: "" - Overriding metrics path (default "/metrics")
  

Implementa una aplicación de usuario de ejemplo

En esta sección, implementarás una aplicación de ejemplo con registros y métricas compatibles con Prometheus.

  1. Guarda los siguientes manifiestos de Service y Deployment en un archivo llamado my-app.yaml. Ten en cuenta que el Service tiene la anotación prometheus.io/scrape: "true":
  kind: Service
  apiVersion: v1
  metadata:
    name: "example-monitoring"
    namespace: "default"
    annotations:
      prometheus.io/scrape: "true"
  spec:
    selector:
      app: "example-monitoring"
    ports:
      - name: http
        port: 9090
  ---
  apiVersion: apps/v1
  kind: Deployment
  metadata:
    name: "example-monitoring"
    namespace: "default"
    labels:
      app: "example-monitoring"
  spec:
    replicas: 1
    selector:
      matchLabels:
        app: "example-monitoring"
    template:
      metadata:
        labels:
          app: "example-monitoring"
      spec:
        containers:
        - image: gcr.io/google-samples/prometheus-example-exporter:latest
          name: prometheus-example-exporter
          imagePullPolicy: Always
          command:
          - /bin/sh
          - -c
          - ./prometheus-example-exporter --metric-name=example_monitoring_up --metric-value=1 --port=9090
          resources:
            requests:
              cpu: 100m
  1. Crea el Deployment y el Service:

    kubectl --kubeconfig USER_CLUSTER_KUBECONFIG apply -f my-app.yaml
    

Usa las métricas personalizadas en HPA

Implementa el objeto de HPA para usar la métrica expuesta en el paso anterior. Consulta Ajuste de escala automático en varias métricas y métricas personalizadas para obtener información más avanzada sobre diferentes tipos de métricas personalizadas.

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: example-monitoring-hpa
  namespace: default
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: example-monitoring
  minReplicas: 1
  maxReplicas: 5
  metrics:
  - type: Pods
    pods:
      metric:
        name: example_monitoring_up
      target:
        type: AverageValue
        averageValue: 20

La métrica de tipo de pods tiene un selector de métrica predeterminado para las etiquetas de los pods de destino, que funciona de la misma manera kube-controller-maneger. En este ejemplo, puedes consultar la métrica example_monitoring_up con un selector de {matchLabels: {app: example-monitoring}}, ya que están disponibles en los pods de destino. Cualquier otro selector especificado se agrega a la lista. Para evitar el selector predeterminado, puedes quitar cualquier etiqueta en el Pod de destino o usar la métrica Tipo de objeto.

Verifica que HPA use las métricas de la aplicación definidas por el usuario

Verifica que HPA use las métricas de la aplicación definidas por el usuario:

kubectl --kubeconfig=USER_CLUSTER_KUBECONFIG describe hpa example-monitoring-hpa

El resultado se verá así:

Name:                             example-monitoring-hpa
Namespace:                        default
Labels:                           
Annotations:                      CreationTimestamp:  Mon, 19 Jul 2021 16:00:40 -0800
Reference:                        Deployment/example-monitoring
Metrics:                          ( current / target )
  "example_monitoring_up" on pods:  1 / 20
Min replicas:                     1
Max replicas:                     5
Deployment pods:                  1 current / 1 desired
Conditions:
  Type            Status  Reason              Message


AbleToScale True ReadyForNewScale recommended size matches current size ScalingActive True ValidMetricFound the HPA was able to successfully calculate a replica count from pods metric example_monitoring_up ScalingLimited False DesiredWithinRange the desired count is within the acceptable range

Costos

El uso de métricas personalizadas para HPA no genera cargos adicionales. A los usuarios solo se les cobra por las métricas y los registros de las aplicaciones. Consulta los precios de Google Cloud's operations suite para obtener más detalles. El pod para habilitar métricas personalizadas consume 15 m adicionales de CPU y 20 MB de memoria.