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, multinuvem e entre projetos daGoogle Cloudpara métricas do Prometheus. O 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 à escala.

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

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 os 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 recebidos.
    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: 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 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 seu espaço de trabalho do Slack. O GKE pode demorar até 5 minutos a dimensionar a implementação.