Percorso di apprendimento: Applicazioni scalabili - Scalabilità


Questo insieme di tutorial è rivolto agli amministratori IT e agli operatori che vogliono per eseguire il deployment, eseguire e gestire ambienti applicativi moderni in esecuzione Google Kubernetes Engine (GKE) Enterprise. Man mano che procedi in questa serie di tutorial, impari a configurare monitoraggio e avvisi, scalare carichi di lavoro e simulare errori, il tutto utilizzando l'applicazione di microservizi di esempio di Cymbal Bank:

  1. Crea un cluster ed esegui il deployment di un'applicazione di esempio
  2. Monitoraggio con Google Cloud Managed Service per Prometheus
  3. Scala i carichi di lavoro (questo tutorial)
  4. Simula un errore

Panoramica e obiettivi

Un'applicazione consumer come Cymbal Bank ha spesso un numero variabile di utenti su in momenti diversi. Idealmente il tuo sito web è in grado di far fronte ai picchi di traffico senza rallentamenti o altri problemi, ma senza che l'organizzazione abbia a spendere in risorse Cloud di cui non hanno effettivamente bisogno. Una soluzione Google Cloud fornisce a questo scopo la scalabilità automatica.

In questo tutorial imparerai a configurare cluster e carichi di lavoro in un Cluster GKE per scalare usando entrambe le metriche Kubernetes integrate e metriche personalizzate di Cloud Monitoring e Cloud Trace. Imparerai a: completa le seguenti attività:

  • Abilita le metriche personalizzate in Cloud Monitoring per Trace.
    • Le metriche personalizzate ti consentono di scalare usando dati di monitoraggio aggiuntivi o di input esterni che vanno oltre la consapevolezza del cluster Kubernetes, come traffico di rete o codici di risposta HTTP.
  • Configurare Horizontal Pod Autoscaler, una funzionalità di GKE che consente aumenta o diminuisce automaticamente il numero di pod per un carico di lavoro in base alle metriche specificate.
  • Simula il carico delle applicazioni e visualizza il gestore della scalabilità automatica del cluster e il pod orizzontale Risposta del gestore della scalabilità automatica.

Costi

Esempio di abilitazione di GKE Enterprise e deployment di Cymbal Bank di applicazione per questa serie di tutorial prevede che siano applicati costi per cluster addebita costi per GKE Enterprise su Google Cloud come elencato Pagina dei prezzi fino a quando non disabiliterai GKE Enterprise o non elimini il progetto.

Sei inoltre responsabile di altri costi di Google Cloud sostenuti durante l'esecuzione del Applicazione di esempio di Cymbal Bank, ad esempio addebiti per VM di Compute Engine e Trace.

Prima di iniziare

Per imparare a scalare i deployment, devi completare la primo tutorial per creare un cluster GKE che usa Autopilot ed eseguire il deployment l'applicazione di esempio basata su microservizi di Cymbal Bank.

Ti consigliamo di completare questo insieme di tutorial per Cymbal Bank in ordine. Man mano che procedi nella serie di tutorial, acquisisci nuove competenze e utilizzi e altri prodotti e servizi Google Cloud.

Devi inoltre creare un account di servizio IAM e concedere delle autorizzazioni necessarie affinché Horizontal Pod Autoscaler funzioni correttamente:

  1. Creare un account di servizio IAM. Questo account di servizio è utilizzato nel tutorial per concedere l'accesso a metriche personalizzate che consentono la visualizzazione Gestore della scalabilità automatica dei pod per determinare quando fare lo scale up o lo scale down:

    gcloud iam service-accounts create scalable-apps
    
  2. Concedi l'accesso all'account di servizio IAM per eseguire azioni di scalabilità richieste:

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --role roles/cloudtrace.agent \
      --member "serviceAccount:scalable-apps@PROJECT_ID.iam.gserviceaccount.com"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --role roles/monitoring.metricWriter \
      --member "serviceAccount:scalable-apps@PROJECT_ID.iam.gserviceaccount.com"
    
    gcloud iam service-accounts add-iam-policy-binding "scalable-apps@PROJECT_ID.iam.gserviceaccount.com" \
      --role roles/iam.workloadIdentityUser \
      --member "serviceAccount:PROJECT_ID.svc.id.goog[default/default]"
    

    All'account di servizio IAM è stato concesso il seguente accesso:

    • roles/cloudtrace.agent: scrivi dati di traccia come le informazioni sulla latenza in Trace.
    • roles/monitoring.metricWriter: scrivi metriche in Cloud Monitoring.
    • roles/iam.workloadIdentityUser: consenti a un account di servizio Kubernetes di utilizzare Workload Identity come servizio IAM .
  3. Configura l'account di servizio Kubernetes default in default che funga da account di servizio IAM che hai creato:

    kubectl annotate serviceaccount default \
        iam.gke.io/gcp-service-account=scalable-apps@PROJECT_ID.iam.gserviceaccount.com
    

    Questa configurazione consente ai pod che utilizzano il servizio Kubernetes default nello spazio dei nomi default per accedere allo stesso account Google Cloud come l'account di servizio IAM.

Configura la raccolta di metriche personalizzate

Puoi configurare Horizontal Pod Autoscaler in modo che utilizzi Kubernetes integrato di base Metriche di CPU e memoria oppure puoi utilizzare metriche personalizzate di Cloud Monitoring come HTTP richieste al secondo o la quantità di istruzioni SELECT. Le metriche personalizzate possono lavorare senza modifiche all'applicazione e fornire al tuo cluster più insight le prestazioni e le esigenze generali dell'applicazione. In questo tutorial imparerai a come usare le metriche integrate e personalizzate.

  1. Consentire a Horizontal Pod Autoscaler di leggere le metriche personalizzate Monitoring, devi installare Metriche personalizzate - Adattatore Stackdriver nel tuo cluster.

    Esegui il deployment dell'adattatore di metriche personalizzate Stackdriver sul tuo cluster:

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter.yaml
    
  2. Per consentire all'adattatore Stackdriver di ottenere metriche personalizzate dal cluster, utilizzi Workload Identity. Questo approccio utilizza un modello IAM con un account di servizio autorizzato a leggere le metriche di monitoraggio.

    Concedi all'account di servizio IAM il roles/monitoring.viewer ruolo:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member "serviceAccount:scalable-apps@PROJECT_ID.iam.gserviceaccount.com" \
        --role roles/monitoring.viewer
    
  3. Configura l'adattatore Stackdriver per l'utilizzo di Workload Identity e Account di servizio IAM che dispone delle autorizzazioni per leggere metriche di monitoraggio:

    gcloud iam service-accounts add-iam-policy-binding scalable-apps@PROJECT_ID.iam.gserviceaccount.com \
        --role roles/iam.workloadIdentityUser \
        --member "serviceAccount:PROJECT_ID.svc.id.goog[custom-metrics/custom-metrics-stackdriver-adapter]"
    
  4. Kubernetes include il proprio sistema per gli account di servizio che consentono l'accesso all'interno in un cluster Kubernetes. Per consentire l'autenticazione delle applicazioni in servizi e risorse all'esterno dei cluster della versione Google Kubernetes Engine (GKE) Enterprise, ad esempio Monitoring, utilizzi Workload Identity. Questo approccio configura l'account di servizio Kubernetes per l'utilizzo per GKE.

    Annota l'account di servizio Kubernetes utilizzato dall'adattatore:

    kubectl annotate serviceaccount custom-metrics-stackdriver-adapter \
        --namespace=custom-metrics \
        iam.gke.io/gcp-service-account=scalable-apps@PROJECT_ID.iam.gserviceaccount.com
    
  5. Riavvia il deployment dell'adattatore Stackdriver per applicare le modifiche:

    kubectl rollout restart deployment custom-metrics-stackdriver-adapter \
        --namespace=custom-metrics
    

Configura Horizontal Pod Autoscaler

GKE Autopilot può fare lo scale in diversi modi. In questo il tutorial mostra come può scalare il tuo cluster con i seguenti metodi:

  • Horizontal Pod Autoscaler: scala il numero di pod per un carico di lavoro.
  • Gestore della scalabilità automatica dei cluster: scala le risorse dei nodi disponibili nel in un cluster Kubernetes.

Questi due metodi possono interagire in modo che, come il numero di pod per modifiche delle applicazioni, cambiano anche le risorse dei nodi per supportare questi pod.

Sono disponibili altre implementazioni per scalare i pod che si basano su Horizontal Pod Autoscaler, ma puoi anche utilizzare Vertical Pod Autoscaler regolare le richieste di CPU e memoria di un pod anziché il numero di pod.

In questo tutorial configurerai Horizontal Pod Autoscaler per userservice Deployment mediante metriche integrate e per frontend Deployment tramite metriche personalizzate.

Per le tue applicazioni, collabora con i tuoi sviluppatori di applicazioni e Platform engineer per comprendere le loro esigenze e configurare il piano orizzontale regole del gestore della scalabilità automatica dei pod.

Scala il deployment userservice

Quando il numero di utenti dell'applicazione di esempio di Cymbal Bank aumenta, il valore Il servizio userservice consuma più risorse della CPU. Utilizzi un HorizontalPodAutoscaler per controllare il modo in cui vuoi che l'applicazione al carico. Nel manifest YAML per HorizontalPodAutoscaler, definire quale deployment far scalare da Horizontal Pod Autoscaler, metriche da monitorare e il numero minimo e massimo di repliche da monitorare vengono eseguiti tutti i test delle unità.

  1. Esamina il file manifest di esempio HorizontalPodAutoscaler per userservice Deployment:

    # Copyright 2022 Google LLC
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #      http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    ---
    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: userservice
    spec:
      behavior:
        scaleUp:
          stabilizationWindowSeconds: 0
          policies:
            - type: Percent
              value: 100
              periodSeconds: 5
          selectPolicy: Max
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: userservice
      minReplicas: 5
      maxReplicas: 50
      metrics:
        - type: Resource
          resource:
            name: cpu
            target:
              type: Utilization
              averageUtilization: 60
    

    Questo file manifest esegue le seguenti operazioni:

    • Imposta il numero massimo di repliche durante uno scale up a 50.
    • Imposta il numero minimo di durante uno scale down a 5.
    • Utilizza una metrica Kubernetes integrata per prendere decisioni sulla scalabilità. In questo esempio, la metrica è l'utilizzo della CPU e l'utilizzo target è il 60%, evitando così sia il sovrache che il sottoutilizzo.
  2. Applica il manifest al cluster:

    kubectl apply -f extras/postgres-hpa/hpa/userservice.yaml
    

Scala il deployment frontend

Nella sezione precedente, hai configurato Horizontal Pod Autoscaler nella userservice Deployment basato su metriche Kubernetes integrate per la CPU all'utilizzo delle risorse. Per il deployment frontend, ti consigliamo di scalare in base al numero di richieste HTTP in entrata. Questo approccio utilizza Adattatore Stackdriver per leggere le metriche personalizzate da Monitoring per dell'oggetto Ingress del bilanciatore del carico HTTP(S).

  1. Esamina il manifest HorizontalPodAutoscaler per il deployment frontend:

    # Copyright 2022 Google LLC
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #      http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    ---
    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: frontend
    spec:
      behavior:
        scaleUp:
          stabilizationWindowSeconds: 0
          policies:
            - type: Percent
              value: 100
              periodSeconds: 5
          selectPolicy: Max
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: frontend
      minReplicas: 5
      maxReplicas: 25
      metrics:
        - type: External
          external:
            metric:
              name: loadbalancing.googleapis.com|https|request_count
              selector:
                matchLabels:
                  resource.labels.forwarding_rule_name: FORWARDING_RULE_NAME
            target:
              type: AverageValue
              averageValue: "5"
    

    Questo manifest utilizza i seguenti campi:

    • spec.scaleTargetRef: la risorsa Kubernetes da scalare.
    • spec.minReplicas: il numero minimo di repliche, che è 5 in questo campione.
    • spec.maxReplicas: il numero massimo di repliche, che è 25 in in questo esempio.
    • spec.metrics.*: la metrica da utilizzare. In questo esempio, questo è il numero di richieste HTTP al secondo, una metrica personalizzata Monitoraggio fornito dall'adattatore di cui hai eseguito il deployment.
    • spec.metrics.external.metric.selector.matchLabels: lo specifico dell'etichetta della risorsa da filtrare durante la scalabilità.
  2. Trova il nome della regola di forwarding dal carico Ingress frontend bilanciatore del carico:

    export FW_RULE=$(kubectl get ingress frontend -o=jsonpath='{.metadata.annotations.ingress\.kubernetes\.io/forwarding-rule}')
    echo $FW_RULE
    

    L'output è simile al seguente:

    k8s2-fr-j76hrtv4-default-frontend-wvvf7381
    
  3. Aggiungi la regola di forwarding al manifest:

    sed -i "s/FORWARDING_RULE_NAME/$FW_RULE/g" "extras/postgres-hpa/hpa/frontend.yaml"
    

    Questo comando sostituisce FORWARDING_RULE_NAME con la regola di forwarding salvata.

  4. Applica il manifest al cluster:

    kubectl apply -f extras/postgres-hpa/hpa/frontend.yaml
    

Simula caricamento

In questa sezione viene utilizzato un generatore di carico per simulare picchi di traffico e osserva lo scale up del numero di repliche e del numero di nodi per far fronte all'aumento nel tempo. Puoi quindi interrompere la generazione di traffico e osservare la replica fare lo scale down del conteggio dei nodi in risposta.

  1. Prima di iniziare, controlla lo stato di Horizontal Pod Autoscaler e il numero di repliche in uso.

    Ottieni lo stato delle tue risorse HorizontalPodAutoscaler:

    kubectl get hpa
    

    L'output è simile al seguente e mostra che c'è 1 frontend e 5 repliche userservice:

    NAME                     REFERENCE                            TARGETS             MINPODS   MAXPODS   REPLICAS   AGE
    frontend                 Deployment/frontend                  <unknown>/5 (avg)   5         25        1          34s
    userservice              Deployment/userservice               0%/60%              5         50        5          4m56s
    
  2. L'applicazione di esempio di Cymbal Bank include un servizio loadgenerator. Questo Il servizio invia continuamente richieste che imitano gli utenti al frontend e crea periodicamente nuovi account e simula le transazioni tra di loro.

    Esponi a livello locale l'interfaccia web di loadgenerator. Utilizzi questa interfaccia per simula il carico sull'applicazione di esempio di Cymbal Bank:

    kubectl port-forward svc/loadgenerator 8080
    

    Se vedi un messaggio di errore, riprova mentre il pod è in esecuzione.

  3. In un browser sul computer, apri l'interfaccia web del generatore di carico:

    • Se utilizzi una shell locale, apri un browser e vai su http://127.0.0.1:8080.
    • Se utilizzi Cloud Shell, fai clic su Anteprima web, Fai clic su Anteprima sulla porta 8080.
  4. Nell'interfaccia web del generatore di carico, se il valore Failures (Errori) mostra 100%, completa i seguenti passaggi per aggiornare le impostazioni di test:

    1. Fai clic sul pulsante Interrompi accanto al contatore del tasso di errori.
    2. In Stato, fai clic sull'opzione Nuovo test.
    3. Aggiorna il valore Host in base all'indirizzo IP del traffico in entrata di Cymbal Bank.
    4. Fai clic su Inizia a creare sciamucchi.
  5. Nell'interfaccia web del generatore di carico, fai clic sulla scheda Grafici per osservare le prestazioni nel tempo. Osserva il numero di richieste e di risorse all'utilizzo delle risorse.

  6. Apri una nuova finestra del terminale e osserva il numero di repliche del tuo frontend e userservice pod:

    kubectl get hpa -w
    

    Il numero di repliche aumenta con l'aumento del carico. Azioni di scaleUp potrebbero essere necessari circa dieci minuti, poiché il cluster riconosce che le metriche configurate raggiungono la soglia definita e utilizzano il pod orizzontale Gestore della scalabilità automatica per lo scale up del numero di pod.

    L'output di esempio seguente mostra che il numero di repliche è aumentato quando funziona il generatore di carico:

    NAME                     REFERENCE                            TARGETS          MINPODS   MAXPODS   REPLICAS
    frontend                 Deployment/frontend                  5200m/5 (avg)    5         25        13
    userservice              Deployment/userservice               71%/60%          5         50        17
    
  7. Apri un'altra finestra del terminale e controlla il numero di nodi nel cluster:

    gcloud container clusters list \
        --filter='name=scalable-apps' \
        --format='table(name, currentMasterVersion, currentNodeVersion, currentNodeCount)' \
        --region="REGION"
    

    Sostituisci REGION con la regione eseguita dal cluster in.

    Anche il numero di nodi è aumentato, dalla quantità iniziale a che ospita le nuove repliche. Questo aumento del numero di nodi basato su GKE Autopilot. Non c'è niente di cui hai bisogno da configurare per la scalabilità di questo nodo.

  8. Apri l'interfaccia del generatore di carico e fai clic su Arresta per terminare il test.

  9. Controlla di nuovo il numero di repliche e il numero di nodi e osserva i numeri si riducono con il carico ridotto. Lo fare lo scale down potrebbe richiedere del tempo la finestra di stabilizzazione predefinita per le repliche in Kubernetes HorizontalPodAutoscaler risorsa dura cinque minuti.

In un ambiente reale, sia il numero di nodi che i pod nel tuo ambiente fa automaticamente lo scale up e lo scale down come in questa simulazione caricamento. L'applicazione di esempio di Cymbal Bank è progettata per soddisfare questo tipo di e la scalabilità delle applicazioni. Rivolgiti ai tuoi operatori di app e al Site Reliability Engineering (SRE) agli sviluppatori di applicazioni per vedere se i loro carichi di lavoro possono trarre vantaggio da questi le funzionalità di scalabilità.

Esegui la pulizia

L'insieme di tutorial per Cymbal Bank è pensato per essere completato uno dopo il e l'altro. Man mano che procedi nella serie di tutorial, acquisisci nuove competenze e per utilizzare altri prodotti e servizi Google Cloud.

Se vuoi fare una pausa prima di passare al prossimo tutorial ed evitare comportano addebiti sul tuo account Google Cloud per le risorse utilizzate in elimina il progetto che hai creato.

  1. Nella console Google Cloud, vai alla pagina Gestisci risorse.

    Vai a Gestisci risorse

  2. Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
  3. Nella finestra di dialogo, digita l'ID del progetto e fai clic su Chiudi per eliminare il progetto.

Passaggi successivi

Scopri come simulano un errore in GKE Enterprise nel prossimo tutorial.