Como ativar métricas personalizadas definidas pelo usuário para escalonamento automático de pod horizontal

Neste tópico, descrevemos como configurar métricas definidas pelo usuário para escalonamento automático horizontal de pods (HPA) no GKE em VMware.

Como ativar o Logging e o Monitoring para aplicativos do usuário

A configuração do Logging e do Monitoring é mantida em um objeto do Stackdriver chamado stackdriver.

  1. Abra o objeto stackdriver para edição:

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

    Substitua USER_CLUSTER_KUBECONFIG pelo caminho do arquivo kubeconfig do cluster de usuário.

  2. Em spec, defina enableStackdriverForApplications e enableCustomMetricsAdapter como true:

    apiVersion: addons.gke.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
    scalableMonitoring: true
    enableVPC: stackdriver-enable-VPC
    optimizedMetrics: true
    
  3. Salve e feche o arquivo editado.

Após a conclusão dessas etapas, todos os registros de aplicativo do usuário serão enviados para o Cloud Logging.

A próxima etapa é anotar o aplicativo do usuário para a coleta de métricas.

Anotar um aplicativo de usuário para coletar métricas

Para anotar um aplicativo de usuário a ser extraído e os registros enviados ao Cloud Monitoring, adicione annotations correspondentes aos metadados do serviço, pod e endpoints.

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

Implantar um aplicativo de usuário de amostra

Nesta seção, você implantará um aplicativo de amostra com registros e métricas compatíveis com o Prometheus.

  1. Salve os seguintes manifestos de Serviço e Implantação em um arquivo chamado my-app.yaml. Observe que o Serviço tem a anotação 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. Crie a implantação e o serviço:

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

Usar as métricas personalizadas no HPA

Implante o objeto do HPA para usar a métrica exposta na etapa anterior. Saiba mais sobre os diversos tipos de métricas personalizadas em Como fazer escalonamento automático em métricas diversas e 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

A métrica do tipo pods tem um seletor de métricas padrão para os rótulos dos pods de destino, e é assim que o kube-controller-manager funciona. Neste exemplo, você consulta a métrica example_monitoring_up com um seletor de {matchLabels: {app: example-monitoring}}, porque eles estão disponíveis nos pods de destino. Qualquer outro seletor especificado será adicionado à lista. Para evitar o seletor padrão, remova todos os rótulos do pod de destino ou use a métrica "Tipo de objeto".

Verificar se as métricas do aplicativo definidas pelo usuário são usadas pelo HPA

Verifique se as métricas do aplicativo definidas pelo usuário são usadas pelo HPA:

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

A saída será semelhante ao seguinte:

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

Custos

O uso de métricas personalizadas para HPA não gera custos extras. Os usuários são cobrados apenas pelas métricas e registros do aplicativo. Veja mais detalhes na parte de preços do pacote de operações do Google Cloud. O pod para ativar métricas personalizadas consome uma CPU extra de 15 m e 20 MB de memória.