Abilitazione di metriche personalizzate definite dall'utente per la scalabilità automatica del pod orizzontale

10

Questo argomento descrive come configurare le metriche definite dall'utente per la scalabilità automatica pod orizzontale (HPA) nei cluster Anthos su VMware (GKE on-prem).

Abilitazione di Logging e Monitoring per le applicazioni utente

La configurazione per Logging e Monitoring è contenuta in un oggetto Stackdriver denominato stackdriver.

  1. Apri l'oggetto stackdriver per la modifica:

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

    Sostituisci USER_CLUSTER_KUBECONFIG con il percorso del file kubeconfig del cluster utente.

  2. In spec, imposta sia enableStackdriverForApplications che enableCustomMetricsAdapter su 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
    scalableMonitoring: true
    enableVPC: stackdriver-enable-VPC
    optimizedMetrics: true
    
  3. Salva e chiudi il file modificato.

Una volta completati questi passaggi, tutti i log dell'applicazione utente vengono inviati a Cloud Logging.

Il passaggio successivo consiste nell'annotazione dell'applicazione utente per la raccolta di metriche.

Annota un'applicazione utente per la raccolta di metriche

Per annotare un'applicazione utente da estrarre e i log inviati a Cloud Monitoring, devi aggiungere annotations corrispondenti ai metadati per il servizio, al pod e agli endpoint.

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

Esegui il deployment di un'applicazione utente di esempio

In questa sezione eseguirai il deployment di un'applicazione di esempio con log e metriche compatibili con prometheus.

  1. Salva i seguenti manifest di servizio e deployment in un file denominato my-app.yaml. Nota che il servizio ha l'annotazione 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 il deployment e il servizio:

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

Utilizzare le metriche personalizzate in HPA

Esegui il deployment dell'oggetto HPA per utilizzare la metrica esposta nel passaggio precedente. Per ulteriori informazioni sui diversi tipi di metriche personalizzate, consulta Scalabilità automatica in più metriche e metriche personalizzate.

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 metrica Tipo di pod ha un selettore di metriche predefinito per le etichette dei pod di destinazione, ossia come funziona kube-controller-maneger. In questo esempio, esegui la query sulla metrica example_monitoring_up con un selettore di {matchLabels: {app: example-monitoring}}, poiché sono disponibili nei pod di destinazione. Eventuali altri selettori specificati vengono aggiunti all'elenco. Per evitare il selettore predefinito, puoi rimuovere qualsiasi etichetta sul pod di destinazione o utilizzare la metrica Tipo di oggetto.

Verifica che le metriche delle applicazioni definite dall'utente siano utilizzate da HPA

Verifica che le metriche delle applicazioni definite dall'utente vengano utilizzate da HPA:

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

L'output avrà il seguente aspetto:

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

Costi

L'uso delle metriche personalizzate per HPA non comporta costi aggiuntivi. Gli utenti pagano solo per le metriche e i log delle applicazioni. Per i dettagli, consulta i prezzi della suite operativa di Google Cloud. Il pod per l'abilitazione delle metriche personalizzate consuma una CPU aggiuntiva di 15 m e 20 MB di memoria.