Observabilidade de aplicações com o Prometheus no GKE

Este tutorial mostra como configurar sondas de atividade para microsserviços de aplicações implementados no Google Kubernetes Engine (GKE) através do Prometheus de código aberto.

Este tutorial usa o Prometheus de código aberto. No entanto, cada cluster do GKE Autopilot implementa automaticamente o Managed Service for Prometheus, a solução totalmente gerida, multi-nuvem e entre projetos da Google Cloud para métricas do Prometheus.Google CloudO Managed Service for Prometheus permite-lhe monitorizar e receber alertas sobre as suas cargas de trabalho globalmente através do Prometheus, sem ter de gerir e operar manualmente o Prometheus em grande escala.

Também pode usar ferramentas de código aberto, como o Grafana, para visualizar as métricas recolhidas pelo Prometheus.

Objetivos

  • Crie um cluster.
  • Implemente o Prometheus.
  • Implemente a aplicação de exemplo, Bank of Anthos.
  • Configure as sondas de atividade do Prometheus.
  • Configure alertas do Prometheus.
  • Configure o Alertmanager para receber notificações num canal do Slack.
  • Simule uma indisponibilidade para testar o Prometheus.

Custos

Neste documento, usa os seguintes componentes faturáveis do Google Cloud:

Para gerar uma estimativa de custos com base na sua utilização prevista, use a calculadora de preços.

Os novos Google Cloud utilizadores podem ser elegíveis para uma avaliação sem custo financeiro.

Quando terminar as tarefas descritas neste documento, pode evitar a faturação contínua eliminando os recursos que criou. Para mais informações, consulte o artigo Limpe.

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.

    Roles required to create a project

    To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the GKE API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    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.

    Roles required to create a project

    To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  6. Verify that billing is enabled for your Google Cloud project.

  7. Enable the GKE API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  8. Instale a API Helm
  9. Prepare o ambiente

    Neste tutorial, vai usar o Cloud Shell para gerir recursos alojados no Google Cloud.

    1. Defina as variáveis de ambiente predefinidas:

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

      Substitua o seguinte:

      • PROJECT_ID: o seu Google Cloud ID do projeto.
      • CONTROL_PLANE_LOCATION: a região do Compute Engine do plano de controlo do seu cluster. Para este tutorial, a região é us-central1. Normalmente, recomendamos uma região perto de si.
    2. Clone o repositório de exemplo 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 \
          --location=CONTROL_PLANE_LOCATION
      

      Substitua o seguinte:

    Implemente o Prometheus

    Instale o Prometheus através do gráfico Helm de exemplo:

    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
    

    Este comando instala o Prometheus com os seguintes componentes:

    • Prometheus Operator: uma forma popular de implementar e configurar o Prometheus de código aberto.
    • Alertmanager: processa alertas enviados pelo servidor Prometheus e encaminha-os para aplicações, como o Slack.
    • Blackbox exporter: permite que o Prometheus sonde pontos finais através de HTTP, HTTPS, DNS, TCP, ICMP e gRPC.

    Implemente o Bank of Anthos

    Implemente a aplicação de exemplo 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, tem de criar uma aplicação do Slack, ativar os Webhooks de entrada para a aplicação e instalar a aplicação num espaço de trabalho do Slack.

    Crie a aplicação Slack

    1. Junte-se a um espaço de trabalho do Slack, registando-se com o seu email ou usando um convite enviado por um administrador do Workspace.

    2. Inicie sessão no Slack com o nome do espaço de trabalho e as credenciais da sua conta do Slack.

    3. Crie uma nova app Slack

      1. Na caixa de diálogo Criar uma app, clique em Do zero.
      2. Especifique um nome da app e escolha o seu espaço de trabalho do Slack.
      3. Clique em Criar app.
      4. Em Adicionar funcionalidades, clique em Webhooks recebidos.
      5. Clique no botão ativar/desativar Ativar webhooks de entrada.
      6. Na secção URLs de webhook para o seu espaço de trabalho, clique em Adicionar novo webhook ao espaço de trabalho.
      7. Na página de autorização apresentada, selecione um canal para receber notificações.
      8. Clique em Permitir.
      9. É apresentado um webhook para a sua aplicação Slack na secção URLs de webhook para o seu espaço de trabalho. Guarde o URL para mais tarde.

    Configure o Alertmanager

    Crie um segredo 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 secção anterior.

    Configure o Prometheus

    1. Reveja 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
      

      Este manifesto descreve as sondas de atividade do Prometheus e inclui os seguintes campos:

      • spec.jobName: o nome da tarefa atribuído às métricas extraídas.
      • spec.prober.url: o URL do serviço do exportador de caixa negra. Isto inclui a porta predefinida para o exportador de caixa negra, que está definida no gráfico Helm.
      • spec.prober.path: o caminho de recolha de métricas.
      • spec.targets.staticConfig.labels: as etiquetas atribuídas a todas as métricas extraídas dos alvos.
      • spec.targets.staticConfig.static: a lista de anfitriões a sondar.
    2. Aplique o manifesto ao cluster:

      kubectl apply -f extras/prometheus/oss/probes.yaml
      
    3. Reveja 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'
      

      Este manifesto descreve um PrometheusRule e inclui os seguintes campos:

      • spec.groups.[*].name: o nome do grupo de regras.
      • spec.groups.[*].interval: com que frequência as regras no grupo são avaliadas.
      • spec.groups.[*].rules[*].alert: o nome do alerta.
      • spec.groups.[*].rules[*].expr: a expressão PromQL a avaliar.
      • spec.groups.[*].rules[*].for: o período durante o qual os alertas têm de ser devolvidos antes de serem considerados acionados.
      • spec.groups.[*].rules[*].annotations: uma lista de anotações a adicionar a cada alerta. Isto só é válido para regras de alerta.
      • spec.groups.[*].rules[*].labels: as etiquetas a adicionar ou substituir.
    4. Aplique o manifesto ao cluster:

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

    Simule uma indisponibilidade

    1. Simule uma indisponibilidade ao reduzir a implementação contacts para zero:

      kubectl scale deployment contacts --replicas 0
      

      Deve ver uma mensagem de notificação no canal do espaço de trabalho do Slack. O GKE pode demorar até 5 minutos a dimensionar a implementação.

    2. Restaure a implementação do contacts:

      kubectl scale deployment contacts --replicas 1
      

      Deve ver uma mensagem de notificação de resolução de alerta no canal do espaço de trabalho do Slack. O GKE pode demorar até 5 minutos a dimensionar a implementação.

    Limpar

    Para evitar incorrer em custos na sua conta do Google Cloud pelos recursos usados neste tutorial, elimine o projeto que contém os recursos ou mantenha o projeto e elimine os recursos individuais.

    Elimine 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.

    Elimine recursos individuais

    1. Elimine os recursos do Kubernetes:

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

      helm uninstall tutorial
      
    3. Elimine o cluster do GKE:

      gcloud container clusters delete CLUSTER_NAME --quiet
      

    O que se segue?