Percorso di apprendimento: applicazioni scalabili - Monitoraggio con Prometheus


Questo insieme di tutorial è rivolto a operatori e amministratori IT che vogliono distribuire, eseguire e gestire ambienti di applicazioni moderne che vengono eseguiti su Google Kubernetes Engine (GKE) Enterprise. Man mano che avanzi in questo insieme di tutorial, imparerai a configurare il monitoraggio e gli avvisi, a scalare i carichi di lavoro e a simulare errori, il tutto utilizzando l'applicazione di microservizi di esempio Cymbal Bank:

  1. Crea un cluster ed esegui il deployment di un'applicazione di esempio
  2. Monitora con Google Cloud Managed Service per Prometheus (questo tutorial)
  3. Scalare i workload
  4. Simulare un errore
  5. Centralizzare la gestione dei cambiamenti

Panoramica e obiettivi

L'applicazione di esempio Cymbal Bank utilizzata in questo insieme di tutorial è costituita da una serie di microservizi che vengono eseguiti tutti nel cluster GKE. Problemi con uno di questi servizi potrebbero comportare un'esperienza negativa per i clienti della banca, ad esempio l'impossibilità di accedere all'applicazione della banca. Se vieni a conoscenza dei problemi con i servizi il prima possibile, puoi iniziare rapidamente a risolverli.

In questo tutorial imparerai a monitorare i workload in un cluster GKE utilizzando Google Cloud Managed Service per Prometheus e Cloud Monitoring. Imparerai a completare le seguenti attività:

  • Crea un webhook Slack per Alertmanager.

  • Configura Prometheus per monitorare lo stato di un'applicazione basata su microservizi di esempio.

  • Simula un'interruzione e rivedi gli avvisi inviati utilizzando il webhook di Slack.

Costi

L'abilitazione di GKE Enterprise e il deployment dell'applicazione di esempio Cymbal Bank per questa serie di tutorial comportano addebiti per cluster per GKE Enterprise su Google Cloud , come indicato nella nostra pagina dei prezzi, finché non disabiliti GKE Enterprise o elimini il progetto.

Sei responsabile anche di altri Google Cloud costi sostenuti durante l'esecuzione dell'applicazione di esempio Cymbal Bank, ad esempio gli addebiti per le VM Compute Engine e Cloud Monitoring.

Prima di iniziare

Per scoprire come monitorare i tuoi carichi di lavoro, devi completare il primo tutorial per creare un cluster GKE che utilizza Autopilot ed eseguire il deployment dell'applicazione di esempio basata su microservizi Cymbal Bank.

Ti consigliamo di completare questa serie di tutorial per Cymbal Bank in ordine. Man mano che avanzi nella serie di tutorial, acquisisci nuove competenze e utilizzi prodotti e servizi Google Cloud aggiuntivi.

Per mostrare un esempio di come un cluster GKE Autopilot può utilizzare Google Cloud Managed Service per Prometheus per generare messaggi per una piattaforma di comunicazione, questo tutorial utilizza Slack. Nei tuoi deployment di produzione, puoi utilizzare lo strumento di comunicazione preferito della tua organizzazione per elaborare e inviare messaggi quando il tuo cluster GKE ha un problema.

  • Unisciti a un workspace Slack, registrandoti con la tua email o utilizzando un invito inviato da un amministratore di Workspace.

Creare un'applicazione Slack

Una parte importante della configurazione del monitoraggio è assicurarsi di ricevere una notifica quando si verificano eventi azionabili come interruzioni. Un pattern comune per questo è inviare notifiche a uno strumento di comunicazione come Slack, che è quello che utilizzi in questo tutorial. Slack offre una funzionalità di webhook che consente ad applicazioni esterne, come le implementazioni di produzione, di generare messaggi. Puoi utilizzare altri strumenti di comunicazione nella tua organizzazione per elaborare e consegnare i messaggi quando il cluster GKE ha un problema.

I cluster GKE che utilizzano Autopilot includono un'istanza di Google Cloud Managed Service per Prometheus. Questa istanza può generare avvisi quando si verifica un problema con le tue applicazioni. Questi avvisi possono quindi utilizzare un webhook Slack per inviare un messaggio al tuo workspace Slack in modo da ricevere notifiche tempestive in caso di problemi.

Per configurare le notifiche di Slack in base agli avvisi generati da Prometheus, devi creare un'applicazione Slack, attivare i webhook in entrata per l'applicazione e installare l'applicazione in un workspace Slack.

  1. Accedi a Slack utilizzando il nome del tuo workspace e le credenziali del tuo account Slack.

  2. Creare una nuova app Slack

    1. Nella finestra di dialogo Crea un'app, fai clic su Da zero.
    2. Specifica un nome dell'app e scegli il tuo workspace Slack.
    3. Fai clic su Crea app.
    4. Nella sezione Aggiungi funzionalità, fai clic su Webhook in arrivo.
    5. Fai clic sul pulsante di attivazione/disattivazione Attiva webhook in entrata.
    6. Nella sezione Webhook URLs for Your Workspace (URL webhook per il tuo workspace), fai clic su Add New Webhook to Workspace (Aggiungi nuovo webhook al workspace).
    7. Nella pagina di autorizzazione che si apre, seleziona un canale per ricevere le notifiche.
    8. Fai clic su Consenti.
    9. Un webhook per la tua applicazione Slack viene visualizzato nella sezione URL webhook per il tuo workspace. Salva l'URL per un utilizzo futuro.

Configura Alertmanager

In Prometheus, Alertmanager elabora gli eventi di monitoraggio generati dai deployment. Alertmanager può ignorare gli eventi duplicati, raggruppare gli eventi correlati e inviare notifiche, ad esempio utilizzando un webhook di Slack. Questa sezione mostra come configurare Alertmanager per utilizzare il nuovo webhook Slack. La specifica della modalità di elaborazione degli eventi da inviare da parte di Alertmanager è trattata nella sezione successiva del tutorial, Configurare Prometheus.

Per configurare Alertmanager in modo che utilizzi il webhook di Slack, completa i seguenti passaggi:

  1. Passa alla directory del repository Git che include tutti i manifest di esempio per Cymbal Bank del tutorial precedente:

    cd ~/bank-of-anthos/
    

    Se necessario, modifica la posizione della directory in cui hai clonato in precedenza il repository.

  2. Aggiorna il manifest YAML di esempio di Alertmanager con l'URL webhook della tua applicazione Slack:

    sed -i "s@SLACK_WEBHOOK_URL@SLACK_WEBHOOK_URL@g" "extras/prometheus/gmp/alertmanager.yaml"
    

    Sostituisci SLACK_WEBHOOK_URL con l'URL del webhook della sezione precedente.

  3. Per utilizzare dinamicamente l'URL webhook di Slack univoco senza apportare modifiche al codice dell'applicazione, puoi utilizzare un secret Kubernetes. Il codice dell'applicazione legge il valore di questo secret. Nelle applicazioni più complesse, questa funzionalità consente di modificare o ruotare i valori per motivi di sicurezza o conformità.

    Crea un secret di Kubernetes per Alertmanager utilizzando il manifest YAML di esempio che contiene l'URL del webhook di Slack:

    kubectl create secret generic alertmanager \
      -n gmp-public \
      --from-file=extras/prometheus/gmp/alertmanager.yaml
    
  4. Prometheus può utilizzare gli exporter per ottenere metriche dalle applicazioni senza modifiche al codice. Prometheus blackbox exporter consente di eseguire il probing di endpoint come HTTP o HTTPS. Questo esportatore funziona bene quando non vuoi o non puoi esporre il funzionamento interno della tua applicazione a Prometheus. L'esportatore blackbox di Prometheus può funzionare senza modifiche al codice dell'applicazione per esporre le metriche a Prometheus.

    Esegui il deployment dell'esportatore blackbox di Prometheus nel tuo cluster:

    kubectl apply -f extras/prometheus/gmp/blackbox-exporter.yaml
    

Configura Prometheus

Dopo aver configurato Alertmanager per l'utilizzo del webhook Slack, devi indicare a Prometheus cosa monitorare in Cymbal Bank e per quali tipi di eventi vuoi che Alertmanager ti invii una notifica utilizzando il webhook Slack.

Nell'applicazione di esempio Cymbal Bank che utilizzi in questi tutorial, sono presenti vari microservizi in esecuzione nel cluster GKE. Un problema di cui probabilmente vuoi essere informato il prima possibile è se uno dei servizi di Cymbal Bank ha smesso di rispondere normalmente alle richieste, il che potrebbe significare che i tuoi clienti non riescono ad accedere all'applicazione. Puoi configurare Prometheus in modo che risponda agli eventi in base ai criteri della tua organizzazione.

Probe

Puoi configurare i probe Prometheus per le risorse che vuoi monitorare. Questi probe possono generare avvisi in base alla risposta che ricevono. Nell'applicazione di esempio Cymbal Bank, puoi utilizzare probe HTTP che controllano i codici di risposta di livello 200 dai servizi. Una risposta a livello HTTP 200 indica che il servizio è in esecuzione correttamente e può rispondere alle richieste. Se si verifica un problema e il probe non riceve la risposta prevista, puoi definire regole Prometheus che generano avvisi per Alertmanager da elaborare ed eseguire azioni aggiuntive.

  1. Crea alcuni probe Prometheus per monitorare lo stato HTTP dei vari microservizi dell'applicazione di esempio Cymbal Bank. Esamina il seguente manifesto di esempio:

    # Copyright 2023 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: monitoring.googleapis.com/v1
    kind: PodMonitoring
    metadata:
      name: frontend-probe
      labels:
        app.kubernetes.io/name: frontend-probe
    spec:
      selector:
        matchLabels:
          app: blackbox-exporter
      endpoints:
      - port: metrics
        path: /probe
        params:
          target: [frontend:80]
          module: [http_2xx]
        timeout: 30s
        interval: 60s
    ---
    apiVersion: monitoring.googleapis.com/v1
    kind: PodMonitoring
    metadata:
      name: userservice-probe
      labels:
        app.kubernetes.io/name: userservice-probe
    spec:
      selector:
        matchLabels:
          app: blackbox-exporter
      endpoints:
      - port: metrics
        path: /probe
        params:
          target: [userservice:8080/ready]
          module: [http_2xx]
        timeout: 30s
        interval: 60s
    ---
    apiVersion: monitoring.googleapis.com/v1
    kind: PodMonitoring
    metadata:
      name: balancereader-probe
      labels:
        app.kubernetes.io/name: balancereader-probe
    spec:
      selector:
        matchLabels:
          app: blackbox-exporter
      endpoints:
      - port: metrics
        path: /probe
        params:
          target: [balancereader:8080/ready]
          module: [http_2xx]
        timeout: 30s
        interval: 60s
    ---
    apiVersion: monitoring.googleapis.com/v1
    kind: PodMonitoring
    metadata:
      name: contacts-probe
      labels:
        app.kubernetes.io/name: contacts-probe
    spec:
      selector:
        matchLabels:
          app: blackbox-exporter
      endpoints:
      - port: metrics
        path: /probe
        params:
          target: [contacts:8080/ready]
          module: [http_2xx]
        timeout: 30s
        interval: 60s
    ---
    apiVersion: monitoring.googleapis.com/v1
    kind: PodMonitoring
    metadata:
      name: ledgerwriter-probe
      labels:
        app.kubernetes.io/name: ledgerwriter-probe
    spec:
      selector:
        matchLabels:
          app: blackbox-exporter
      endpoints:
      - port: metrics
        path: /probe
        params:
          target: [ledgerwriter:8080/ready]
          module: [http_2xx]
        timeout: 30s
        interval: 60s
    ---
    apiVersion: monitoring.googleapis.com/v1
    kind: PodMonitoring
    metadata:
      name: transactionhistory-probe
      labels:
        app.kubernetes.io/name: transactionhistory-probe
    spec:
      selector:
        matchLabels:
          app: blackbox-exporter
      endpoints:
      - port: metrics
        path: /probe
        params:
          target: [transactionhistory:8080/ready]
          module: [http_2xx]
        timeout: 30s
        interval: 60s
    

    Come mostrato in questo file manifest, la best practice prevede che ogni PodMonitoring Prometheus liveness probe monitori ogni deployment separatamente.

  2. Per creare i probe di attività di Prometheus, applica il manifest al tuo cluster:

    kubectl apply -f extras/prometheus/gmp/probes.yaml
    

Regole

Prometheus deve sapere cosa vuoi fare in base alla risposta ricevuta dai probe che hai creato nei passaggi precedenti. Definisci questa risposta utilizzando le regole di Prometheus.

In questo tutorial, creerai regole Prometheus per generare avvisi in base alla risposta al probe di attività. Alertmanager elabora quindi l'output di queste regole per generare notifiche utilizzando il webhook di Slack.

  1. Crea regole che generano eventi in base alla risposta ai probe di liveness. Esamina il seguente file manifest di esempio:

    # Copyright 2023 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: monitoring.googleapis.com/v1
    kind: Rules
    metadata:
      name: uptime-rule
    spec:
      groups:
      - name: Micro services uptime
        interval: 60s
        rules:
        - alert: BalancereaderUnavailable
          expr: probe_success{job="balancereader-probe"} == 0
          for: 1m
          annotations:
            summary: Balance Reader Service is unavailable
            description: Check Balance Reader pods and its logs
          labels:
            severity: 'critical'
        - alert: ContactsUnavailable
          expr: probe_success{job="contacts-probe"} == 0
          for: 1m
          annotations:
            summary: Contacts Service is unavailable
            description: Check Contacts pods and its logs
          labels:
            severity: 'warning'
        - alert: FrontendUnavailable
          expr: probe_success{job="frontend-probe"} == 0
          for: 1m
          annotations:
            summary: Frontend Service is unavailable
            description: Check Frontend pods and its logs
          labels:
            severity: 'critical'
        - alert: LedgerwriterUnavailable
          expr: probe_success{job="ledgerwriter-probe"} == 0
          for: 1m
          annotations:
            summary: Ledger Writer Service is unavailable
            description: Check Ledger Writer pods and its logs
          labels:
            severity: 'critical'
        - alert: TransactionhistoryUnavailable
          expr: probe_success{job="transactionhistory-probe"} == 0
          for: 1m
          annotations:
            summary: Transaction History Service is unavailable
            description: Check Transaction History pods and its logs
          labels:
            severity: 'critical'
        - alert: UserserviceUnavailable
          expr: probe_success{job="userservice-probe"} == 0
          for: 1m
          annotations:
            summary: User Service is unavailable
            description: Check User Service pods and its logs
          labels:
            severity: 'critical'
    

    Questo manifest descrive un PrometheusRule e include i seguenti campi:

    • spec.groups.[*].name: il nome del gruppo di regole.
    • spec.groups.[*].interval: la frequenza con cui vengono valutate le regole del gruppo.
    • spec.groups.[*].rules[*].alert: il nome dell'avviso.
    • spec.groups.[*].rules[*].expr: l'espressione PromQL da valutare.
    • spec.groups.[*].rules[*].for: il periodo di tempo in cui gli avvisi devono essere restituiti prima di essere considerati attivi.
    • spec.groups.[*].rules[*].annotations: un elenco di annotazioni da aggiungere a ogni avviso. Questo è valido solo per le regole di avviso.
    • spec.groups.[*].rules[*].labels: le etichette da aggiungere o sovrascrivere.
  2. Per creare le regole, applica il manifest al cluster:

    kubectl apply -f extras/prometheus/gmp/rules.yaml
    

Simula un'interruzione del servizio

Per assicurarti che le sonde, le regole e la configurazione di Alertmanager di Prometheus siano corrette, devi verificare che gli avvisi e le notifiche vengano inviati in caso di problema. Se non esegui il test di questo flusso, potresti non accorgerti di un'interruzione dei tuoi servizi di produzione quando qualcosa va storto.

  1. Per simulare un'interruzione di uno dei microservizi, scala il deployment contacts a zero. Con zero istanze del servizio, l'applicazione di esempio Cymbal Bank non può leggere i dati di contatto dei clienti:

    kubectl scale deployment contacts --replicas 0
    

    GKE potrebbe richiedere fino a 5 minuti per fare lo scale down del deployment.

  2. Controlla lo stato dei deployment nel cluster e verifica che il contacts deployment venga ridimensionato correttamente:

    kubectl get deployments
    

    Nell'output di esempio riportato di seguito, il deployment contacts è stato ridimensionato correttamente a 0 istanze:

    NAME                 READY   UP-TO-DATE   AVAILABLE   AGE
    balancereader        1/1     1            1           17m
    blackbox-exporter    1/1     1            1           5m7s
    contacts             0/0     0            0           17m
    frontend             1/1     1            1           17m
    ledgerwriter         1/1     1            1           17m
    loadgenerator        1/1     1            1           17m
    transactionhistory   1/1     1            1           17m
    userservice          1/1     1            1           17m
    
  3. Dopo che il deployment contacts è stato ridotto a zero, il probe Prometheus segnala un codice di errore HTTP. Questo errore HTTP genera un avviso che Alertmanager deve elaborare.

    Controlla il canale del tuo workspace Slack per un messaggio di notifica dell'interruzione con testo simile al seguente esempio:

    [FIRING:1] ContactsUnavailable
    Severity: Warning :warning:
    Summary: Contacts Service is unavailable
    Namespace: default
    Check Contacts pods and it's logs
    
  4. In uno scenario di interruzione reale, dopo aver ricevuto la notifica in Slack, inizieresti a risolvere i problemi e a ripristinare i servizi. Per questo tutorial, simula questo processo e ripristina il contacts deployment aumentando di nuovo il numero di repliche:

    kubectl scale deployment contacts --replicas 1
    

    Potrebbero essere necessari fino a 5 minuti per scalare la deployment e per la sonda Prometheus per ricevere una risposta HTTP 200. Controlla lo stato delle implementazioni utilizzando il comando kubectl get deployments.

    Quando viene ricevuta una risposta di stato integro al probe Prometheus, Alertmanager cancella l'evento. Nel canale del tuo spazio di lavoro Slack dovresti visualizzare un messaggio di notifica di risoluzione dell'avviso simile al seguente esempio:

    [RESOLVED] ContactsUnavailable
    Severity: Warning :warning:
    Summary: Contacts Service is unavailable
    Namespace: default
    Check Contacts pods and it's logs
    

Esegui la pulizia

Ti consigliamo di completare questa serie di tutorial per Cymbal Bank in ordine. Man mano che avanzi nella serie di tutorial, acquisisci nuove competenze e utilizzi prodotti e servizi Google Cloud aggiuntivi.

Se vuoi fare una pausa prima di passare al tutorial successivo ed evitare che al tuo account Google Cloud vengano addebitati costi per le risorse utilizzate in questo tutorial, elimina il progetto che hai creato.

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Passaggi successivi

Scopri come scalare i deployment in GKE Enterprise nel tutorial successivo.