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 Managed Service para Prometheus, a solução totalmente gerenciada, de várias nuvens e de vários projetos doGoogle 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ê vai 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
  9. Prepare o ambiente

    Neste tutorial, você vai 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: o Google Cloud ID do projeto.
      • 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

    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.

    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