Observabilidade do aplicativo com o Prometheus no GKE


Neste tutorial, mostramos como configurar sondagens de atividade para microsserviços de aplicativos implantados no Google Kubernetes Engine (GKE) usando o Prometheus de código aberto.

Neste tutorial, usamos o Prometheus de código aberto. No entanto, cada cluster Autopilot do GKE implanta automaticamente o Serviço gerenciado para Prometheus, a solução totalmente gerenciada, de várias nuvens e de vários projetos do Google Cloud para métricas do Prometheus. O Serviço gerenciado para Prometheus permite monitorar globalmente e gerar alertas sobre suas cargas de trabalho usando o Prometheus, sem precisar gerenciar e operar manualmente o Prometheus em escala.

Também é possível usar ferramentas de código aberto, como o Grafana, para visualizar as métricas coletadas pelo Prometheus.

Objetivos

  • Criar um cluster.
  • Implantar o Prometheus.
  • Implantar o aplicativo de amostra, Bank of Anthos.
  • Configurar as sondagens de atividade do Prometheus.
  • Configurar os alertas do Prometheus.
  • Configurar o Alertmanager para receber notificações em um canal do Slack.
  • Simular uma falha temporária para testar o Prometheus.

Custos

Neste documento, você usará os seguintes componentes faturáveis do Google Cloud:

Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços. Novos usuários do Google Cloud podem estar qualificados para uma avaliação gratuita.

Ao concluir as tarefas descritas neste documento, é possível evitar o faturamento contínuo excluindo os recursos criados. Saiba mais em Limpeza.

Antes de começar

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the GKE API.

    Enable the API

  5. In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the GKE API.

    Enable the API

  8. Instale a API Helm

Prepare o ambiente

Neste tutorial, você usará o Cloud Shell para gerenciar recursos hospedados no Google Cloud.

  1. Defina as variáveis de ambiente padrão:

    gcloud config set project PROJECT_ID
    gcloud config set compute/region COMPUTE_REGION
    

    Substitua:

    • PROJECT_ID: seuID de projeto no Google Cloud.
    • PROJECT_ID: a região do Compute Engine para o cluster. Neste tutorial, a região é us-central1. Normalmente, você deve escolher uma região próxima a você.
  2. Clone o repositório de amostra usado neste tutorial:

    git clone https://github.com/GoogleCloudPlatform/bank-of-anthos.git
    cd bank-of-anthos/
    
  3. Crie um cluster:

    gcloud container clusters create-auto CLUSTER_NAME \
        --release-channel=CHANNEL_NAME \
        --region=COMPUTE_REGION
    

    Substitua:

Implantar o Prometheus

Instale o Prometheus usando a amostra de gráfico do Helm:

helm repo add bitnami https://charts.bitnami.com/bitnami
helm install tutorial bitnami/kube-prometheus \
    --version 8.2.2 \
    --values extras/prometheus/oss/values.yaml \
    --wait

Esse comando instala o Prometheus com os seguintes componentes:

  • Operador do Prometheus: uma maneira conhecida de implantar e configurar o Prometheus de código aberto.
  • Alertmanager: manipula os alertas enviados pelo servidor do Prometheus e os encaminha para aplicativos, como o Slack.
  • Exportador de caixa preta: permite que os endpoints de sondagem do Prometheus usem HTTP, HTTPS, DNS, TCP, ICMP e gRPC.

Implantar o Bank of Anthos

Implante o aplicativo de amostra Bank of Anthos:

kubectl apply -f extras/jwt/jwt-secret.yaml
kubectl apply -f kubernetes-manifests

Notificações do Slack

Para configurar as notificações do Slack, crie um aplicativo do Slack, ative os Webhooks de entrada para o aplicativo e instale-o em um espaço de trabalho do Slack.

Crie o aplicativo Slack

  1. Participe de um espaço de trabalho do Slack registrando-se com seu e-mail ou usando um convite enviado por um administrador do espaço de trabalho.

  2. Faça login no Slack usando o nome do seu espaço de trabalho e as credenciais da sua conta do Slack.

  3. Criar um novo aplicativo do Slack

    1. Na caixa de diálogo Criar um aplicativo, clique em Do zero.
    2. Especifique o campo App Name e escolha seu espaço de trabalho do Slack.
    3. Clique em Create App.
    4. Em Adicionar recursos e funcionalidades, clique em Webhooks de entrada.
    5. Clique no botão Ativar Webhooks de entrada.
    6. Na seção Webhook URLs for your Workspace, clique em Add New Webhook to Workspace.
    7. Na página de autorização, selecione um canal para receber notificações.
    8. Clique em Permitir.
    9. Um webhook do aplicativo Slack é exibido na seção URLs do webhook para seu espaço de trabalho. Salve o URL para mais tarde.

Configurar o Alertmanager

Crie um Secret do Kubernetes para armazenar o URL do webhook:

kubectl create secret generic alertmanager-slack-webhook --from-literal webhookURL=SLACK_WEBHOOK_URL
kubectl apply -f extras/prometheus/oss/alertmanagerconfig.yaml

Substitua SLACK_WEBHOOK_URL pelo URL do webhook da seção anterior.

Configurar o Prometheus

  1. Analise o seguinte manifesto:

    # 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.coreos.com/v1
    kind: Probe
    metadata:
      name: frontend-probe
    spec:
      jobName: frontend
      prober:
        url: tutorial-kube-prometheus-blackbox-exporter:19115
        path: /probe
      module: http_2xx
      interval: 60s
      scrapeTimeout: 30s
      targets:
        staticConfig:
          labels:
            app: bank-of-anthos
          static:
            - frontend:80
    ---
    apiVersion: monitoring.coreos.com/v1
    kind: Probe
    metadata:
      name: userservice-probe
    spec:
      jobName: userservice
      prober:
        url: tutorial-kube-prometheus-blackbox-exporter:19115
        path: /probe
      module: http_2xx
      interval: 60s
      scrapeTimeout: 30s
      targets:
        staticConfig:
          labels:
            app: bank-of-anthos
          static:
            - userservice:8080/ready
    ---
    apiVersion: monitoring.coreos.com/v1
    kind: Probe
    metadata:
      name: balancereader-probe
    spec:
      jobName: balancereader
      prober:
        url: tutorial-kube-prometheus-blackbox-exporter:19115
        path: /probe
      module: http_2xx
      interval: 60s
      scrapeTimeout: 30s
      targets:
        staticConfig:
          labels:
            app: bank-of-anthos
          static:
            - balancereader:8080/ready
    ---
    apiVersion: monitoring.coreos.com/v1
    kind: Probe
    metadata:
      name: contacts-probe
    spec:
      jobName: contacts
      prober:
        url: tutorial-kube-prometheus-blackbox-exporter:19115
        path: /probe
      module: http_2xx
      interval: 60s
      scrapeTimeout: 30s
      targets:
        staticConfig:
          labels:
            app: bank-of-anthos
          static:
            - contacts:8080/ready
    ---
    apiVersion: monitoring.coreos.com/v1
    kind: Probe
    metadata:
      name: ledgerwriter-probe
    spec:
      jobName: ledgerwriter
      prober:
        url: tutorial-kube-prometheus-blackbox-exporter:19115
        path: /probe
      module: http_2xx
      interval: 60s
      scrapeTimeout: 30s
      targets:
        staticConfig:
          labels:
            app: bank-of-anthos
          static:
            - ledgerwriter:8080/ready
    ---
    apiVersion: monitoring.coreos.com/v1
    kind: Probe
    metadata:
      name: transactionhistory-probe
    spec:
      jobName: transactionhistory
      prober:
        url: tutorial-kube-prometheus-blackbox-exporter:19115
        path: /probe
      module: http_2xx
      interval: 60s
      scrapeTimeout: 30s
      targets:
        staticConfig:
          labels:
            app: bank-of-anthos
          static:
            - transactionhistory:8080/ready
    

    Esse manifesto descreve as sondagens de atividade do Prometheus e inclui os seguintes campos:

    • spec.jobName: o nome do job atribuído às métricas coletadas.
    • spec.prober.url: o URL do serviço do exportador de caixa preta. Isso inclui a porta padrão do exportador de caixa preta, que é definida no gráfico do Helm.
    • spec.prober.path: o caminho de coleta das métricas.
    • spec.targets.staticConfig.labels: os rótulos atribuídos a todas as métricas coletadas dos destinos.
    • spec.targets.staticConfig.static: a lista de hosts a serem sondados.
  2. Aplique o manifesto ao cluster:

    kubectl apply -f extras/prometheus/oss/probes.yaml
    
  3. Analise o seguinte manifesto:

    # 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.coreos.com/v1
    kind: PrometheusRule
    metadata:
      name: uptime-rule
    spec:
      groups:
      - name: Micro services uptime
        interval: 60s
        rules:
        - alert: BalancereaderUnavaiable
          expr: probe_success{app="bank-of-anthos",job="balancereader"} == 0
          for: 1m
          annotations:
            summary: Balance Reader Service is unavailable
            description: Check Balance Reader pods and it's logs
          labels:
            severity: 'critical'
        - alert: ContactsUnavaiable
          expr: probe_success{app="bank-of-anthos",job="contacts"} == 0
          for: 1m
          annotations:
            summary: Contacs Service is unavailable
            description: Check Contacs pods and it's logs
          labels:
            severity: 'warning'
        - alert: FrontendUnavaiable
          expr: probe_success{app="bank-of-anthos",job="frontend"} == 0
          for: 1m
          annotations:
            summary: Frontend Service is unavailable
            description: Check Frontend pods and it's logs
          labels:
            severity: 'critical'
        - alert: LedgerwriterUnavaiable
          expr: probe_success{app="bank-of-anthos",job="ledgerwriter"} == 0
          for: 1m
          annotations:
            summary: Ledger Writer Service is unavailable
            description: Check Ledger Writer pods and it's logs
          labels:
            severity: 'critical'
        - alert: TransactionhistoryUnavaiable
          expr: probe_success{app="bank-of-anthos",job="transactionhistory"} == 0
          for: 1m
          annotations:
            summary: Transaction History Service is unavailable
            description: Check Transaction History pods and it's logs
          labels:
            severity: 'critical'
        - alert: UserserviceUnavaiable
          expr: probe_success{app="bank-of-anthos",job="userservice"} == 0
          for: 1m
          annotations:
            summary: User Service is unavailable
            description: Check User Service pods and it's logs
          labels:
            severity: 'critical'
    

    Esse manifesto descreve um PrometheusRule e inclui os seguintes campos:

    • spec.groups.[*].name: o nome do grupo de regras.
    • spec.groups.[*].interval: a frequência com que as regras no grupo são avaliadas.
    • spec.groups.[*].rules[*].alert: o nome do alerta.
    • spec.groups.[*].rules[*].expr: a expressão PromQL a ser avaliada.
    • spec.groups.[*].rules[*].for: a quantidade de vezes que os alertas são emitidos antes de serem considerados disparados.
    • spec.groups.[*].rules[*].annotations: uma lista de anotações para adicionar a cada alerta. Válido apenas para regras de alerta.
    • spec.groups.[*].rules[*].labels: os rótulos que serão adicionados ou substituídos.
  4. Aplique o manifesto ao cluster:

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

Simular uma interrupção

  1. Simule uma interrupção escalonando a implantação contacts para zero:

    kubectl scale deployment contacts --replicas 0
    

    Você verá uma mensagem de notificação no canal do espaço de trabalho do Slack. O GKE pode levar até cinco minutos para escalonar a implantação.

  2. Restaure a implantação contacts:

    kubectl scale deployment contacts --replicas 1
    

    Você verá uma mensagem de notificação de resolução de alerta no canal do espaço de trabalho do Slack. O GKE pode levar até cinco minutos para escalonar a implantação.

Limpar

Para evitar cobranças na sua conta do Google Cloud pelos recursos usados no tutorial, exclua o projeto que os contém ou mantenha o projeto e exclua os recursos individuais.

Excluir o projeto

    Delete a Google Cloud project:

    gcloud projects delete PROJECT_ID

Excluir recursos individuais

  1. Exclua os recursos do Kubernetes:

    kubectl delete -f kubernetes-manifests
    
  2. Desinstale o Prometheus:

    helm uninstall tutorial
    
  3. Exclua o cluster do GKE:

    gcloud container clusters delete CLUSTER_NAME --quiet
    

A seguir