Observabilidad de las aplicaciones con Prometheus en GKE


En este instructivo, se muestra cómo configurar sondeos de funcionamiento a microservicios de aplicación implementados en Google Kubernetes Engine (GKE) mediante Prometheus de código abierto.

En este instructivo, se usa Prometheus de código abierto. Sin embargo, cada clúster de GKE Autopilot implementa de forma automática Servicio administrado para Prometheus, la solución completamente administrada, de múltiples nubes y de varios proyectos de Google Cloud para las métricas de Prometheus. Servicio administrado para Prometheus: te permite supervisar y crear alertas en tus cargas de trabajo mediante Prometheus, sin tener que administrar y operar de forma manual Prometheus a gran escala.

También puedes usar herramientas de código abierto, como Grafana, para visualizar las métricas que recopila Prometheus.

Objetivos

  • Crear un clúster
  • Implementa Prometheus.
  • Implementa la aplicación de muestra, Bank of Anthos.
  • Configura los sondeos de funcionamiento de Prometheus.
  • Configura alertas de Prometheus.
  • Configura Alertmanager para recibir notificaciones en un canal de Slack.
  • Simula una interrupción para probar Prometheus.

Costos

En este documento, usarás los siguientes componentes facturables de Google Cloud:

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios. Es posible que los usuarios nuevos de Google Cloud califiquen para obtener una prueba gratuita.

Cuando finalices las tareas que se describen en este documento, puedes borrar los recursos que creaste para evitar que continúe la facturación. Para obtener más información, consulta Cómo realizar una limpieza.

Antes de comenzar

  1. Accede a tu cuenta de Google Cloud. Si eres nuevo en Google Cloud, crea una cuenta para evaluar el rendimiento de nuestros productos en situaciones reales. Los clientes nuevos también obtienen $300 en créditos gratuitos para ejecutar, probar y, además, implementar cargas de trabajo.
  2. En la consola de Google Cloud, en la página del selector de proyectos, haz clic en Crear proyecto para comenzar a crear un proyecto de Google Cloud nuevo.

    Ir al selector de proyectos

  3. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  4. Habilita la API de GKE.

    Habilita la API

  5. En la consola de Google Cloud, en la página del selector de proyectos, haz clic en Crear proyecto para comenzar a crear un proyecto de Google Cloud nuevo.

    Ir al selector de proyectos

  6. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  7. Habilita la API de GKE.

    Habilita la API

  8. Instala la API de Helm .

Prepare el entorno

En este instructivo, usarás Cloud Shell para administrar recursos alojados en Google Cloud.

  1. Configura las variables de entorno predeterminadas:

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

    Reemplaza lo siguiente:

    • PROJECT_ID: El ID del proyecto de Google Cloud.
    • PROJECT_ID: La región de Compute Engine del clúster. Para este instructivo, la región es us-central1. Por lo general, querrás una región cercana a ti.
  2. Clona el repositorio de muestra que se usa en este instructivo:

    git clone https://github.com/GoogleCloudPlatform/bank-of-anthos.git
    cd bank-of-anthos/
    
  3. Crea un clúster:

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

    Reemplaza lo siguiente:

    • CLUSTER_NAME: un nombre para el clúster nuevo.
    • CHANNEL_NAME: el nombre de un canal de versiones.

Implementa Prometheus

Instala Prometheus con el gráfico de muestra de 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

Con este comando, se instala Prometheus con los siguientes componentes:

  • Operador de Prometheus: Una forma popular de implementar y configurar Prometheus de código abierto.
  • Alertmanager: maneja las alertas enviadas por el servidor de Prometheus y las enruta a las aplicaciones, como Slack.
  • Exportador de caja negra: Permite que los extremos de sondeo de Prometheus usen HTTP, HTTPS, DNS, TCP, ICMP y gRPC.

Implementa Bank of Anthos

Implementa la aplicación de muestra Bank of Anthos:

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

Notificaciones de Slack

Si deseas configurar las notificaciones de Slack, debes crear una aplicación de Slack, activar los webhooks entrantes de la aplicación y, luego, instalarla en un lugar de trabajo de Slack.

Crea la aplicación de Slack

  1. Únete a un lugar de trabajo de Slack. Para hacerlo, regístrate con tu correo electrónico o usa una invitación que te haya enviado un administrador del espacio de trabajo.

  2. Accede a Slack con el nombre de tu espacio de trabajo y tus credenciales de la cuenta de Slack.

  3. Para crear una app de Slack nueva, sigue estos pasos:

    1. En el cuadro de diálogo Create an app (Crear una aplicación), haz clic en From scratch (Desde cero).
    2. Especifica un nombre de aplicación y elige tu lugar de trabajo de Slack.
    3. Haz clic en Crear aplicación (Create App).
    4. En Add features and functionality (Agregar características y funciones), haz clic en Incoming Webhooks (Webhooks entrantes).
    5. Haz clic en el botón de activación Activate Incoming Webhooks (Activar webhooks entrantes).
    6. En la sección Webhook URLs for Your Workspace (URLs de webhook para tu lugar de trabajo), haz clic en Add New Webhook to Workspace (Agregar webhook nuevo al lugar de trabajo).
    7. En la página de autorización que se abrirá, selecciona un canal para recibir notificaciones.
    8. Haga clic en Allow.
    9. Se mostrará un webhook para tu aplicación de Slack en la sección Webhook URLs for Your Workspace (URLs de webhook para tu lugar de trabajo). Guarda la URL para usarla más adelante.

Configura Alertmanager

Crea un secreto de Kubernetes para almacenar la URL del webhook:

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

Reemplaza SLACK_WEBHOOK_URL por la URL del webhook de la sección anterior.

Configura Prometheus

  1. Revisa el siguiente manifiesto:

    # 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
    

    En este manifiesto, se describen los sondeos de funcionamiento de Prometheus y se incluyen los siguientes campos:

    • spec.jobName: El nombre del trabajo asignado a las métricas recopiladas.
    • spec.prober.url: la URL del servicio del exportador de la caja negra. Esto incluye el puerto predeterminado del exportador de caja negra, que se define en el gráfico de Helm.
    • spec.prober.path: la ruta de recopilación de métricas.
    • spec.targets.staticConfig.labels: las etiquetas asignadas a todas las métricas recopiladas de los destinos.
    • spec.targets.staticConfig.static: la lista de hosts que se sondearán.
  2. Aplica el manifiesto al clúster:

    kubectl apply -f extras/prometheus/oss/probes.yaml
    
  3. Revisa el siguiente manifiesto:

    # 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'
    

    En este manifiesto, se describe un PrometheusRule y se incluyen los siguientes campos:

    • spec.groups.[*].name: el nombre del grupo de reglas.
    • spec.groups.[*].interval: con qué frecuencia se evalúan las reglas del grupo.
    • spec.groups.[*].rules[*].alert: el nombre de la alerta.
    • spec.groups.[*].rules[*].expr: la expresión PromQL que se evaluará.
    • spec.groups.[*].rules[*].for: la cantidad de tiempo que deben aparecer las alertas antes de que se consideren activadas.
    • spec.groups.[*].rules[*].annotations: una lista de anotaciones que se agregará a cada alerta. Esto solo es válido para las reglas de alerta.
    • spec.groups.[*].rules[*].labels: las etiquetas que se agregarán o reemplazarán.
  4. Aplica el manifiesto al clúster:

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

Simula una interrupción

  1. Simula una interrupción mediante el escalamiento de la implementación de contacts a cero:

    kubectl scale deployment contacts --replicas 0
    

    Deberías ver un mensaje de notificación en tu canal de espacio de trabajo de Slack. GKE puede tardar hasta 5 minutos en escalar el Deployment.

  2. Restablece el Deployment contacts:

    kubectl scale deployment contacts --replicas 1
    

    Deberías ver un mensaje de notificación de resolución de alertas en el canal de lugar de trabajo de Slack. GKE puede tardar hasta 5 minutos en escalar el Deployment.

Realiza una limpieza

Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.

Borra el proyecto

    Borra un proyecto de Google Cloud:

    gcloud projects delete PROJECT_ID

Borra los recursos individuales

  1. Borra los recursos de Kubernetes:

    kubectl delete -f kubernetes-manifests
    
  2. Desinstala Prometheus:

    helm uninstall tutorial
    
  3. Borra el clúster de GKE:

    gcloud container clusters delete CLUSTER_NAME --quiet
    

¿Qué sigue?