Observabilidad de aplicaciones con Prometheus en GKE


En este tutorial se muestra cómo configurar comprobaciones de actividad para microservicios de aplicaciones desplegados en Google Kubernetes Engine (GKE) mediante Prometheus de código abierto.

En este tutorial se usa Prometheus, que es de código abierto. Sin embargo, cada clúster de Autopilot de GKE despliega automáticamente Managed Service para Prometheus, la solución multicloud y entre proyectos totalmente gestionada deGoogle Cloudpara métricas de Prometheus. Managed Service para Prometheus te permite monitorizar y recibir alertas sobre tus cargas de trabajo en todo el mundo con Prometheus, sin tener que gestionar ni usar Prometheus manualmente a gran escala.

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

Objetivos

  • Crea un clúster.
  • Implementa Prometheus.
  • Despliega la aplicación de ejemplo Bank of Anthos.
  • Configura las comprobaciones de vivacidad de Prometheus.
  • Configura alertas de Prometheus.
  • Configura Alertmanager para recibir notificaciones en un canal de Slack.
  • Simula una interrupción del servicio para probar Prometheus.

Costes

En este documento, se utilizan los siguientes componentes facturables de Google Cloud:

Para generar una estimación de costes basada en el uso previsto, utiliza la calculadora de precios.

Los usuarios nuevos Google Cloud pueden disfrutar de una prueba gratuita.

Cuando termines las tareas que se describen en este documento, puedes evitar que se te siga facturando eliminando los recursos que has creado. Para obtener más información, consulta la sección Limpiar.

Antes de empezar

  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 (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 (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. Instala la API de Helm
  9. Preparar el entorno

    En este tutorial, usarás Cloud Shell para gestionar los recursos alojados enGoogle Cloud.

    1. Define las variables de entorno predeterminadas:

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

      Haz los cambios siguientes:

      • PROJECT_ID: tu Google Cloud ID de proyecto.
      • CONTROL_PLANE_LOCATION: la región de Compute Engine del plano de control de tu clúster. En este tutorial, la región es us-central1. Normalmente, te interesa una región que esté cerca de ti.
    2. Clona el repositorio de muestra que se usa en este tutorial:

      git clone https://github.com/GoogleCloudPlatform/bank-of-anthos.git
      cd bank-of-anthos/
      
    3. Para crear un clúster, sigue estos pasos:

      gcloud container clusters create-auto CLUSTER_NAME \
          --release-channel=CHANNEL_NAME \
          --location=CONTROL_PLANE_LOCATION
      

      Haz los cambios siguientes:

    Desplegar Prometheus

    Instala Prometheus con el chart de Helm de ejemplo:

    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 Prometheus con los siguientes componentes:

    • Operador de Prometheus: una forma popular de desplegar y configurar Prometheus de código abierto.
    • Alertmanager: gestiona las alertas enviadas por el servidor de Prometheus y las enruta a aplicaciones como Slack.
    • Exportador de Blackbox: permite a Prometheus sondear endpoints mediante HTTP, HTTPS, DNS, TCP, ICMP y gRPC.

    Desplegar Bank of Anthos

    Despliega la aplicación de ejemplo Bank of Anthos:

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

    Notificaciones de Slack

    Para configurar las notificaciones de Slack, debes crear una aplicación de Slack, activar los webhooks entrantes de la aplicación e instalar la aplicación en un espacio de trabajo de Slack.

    Crear la aplicación de Slack

    1. Únete a un espacio de trabajo de Slack registrándote con tu correo o usando una invitación que te haya enviado un administrador del espacio de trabajo.

    2. Inicia sesión en Slack con el nombre de tu espacio de trabajo y las credenciales de tu cuenta de Slack.

    3. Crear una aplicación de Slack

      1. En el cuadro de diálogo Crear una aplicación, haz clic en Desde cero.
      2. Especifica un nombre de aplicación y elige tu espacio de trabajo de Slack.
      3. Haz clic en Create App (Crear aplicación).
      4. En Añadir características y funciones, haz clic en Webhooks entrantes.
      5. Haz clic en el botón Activar webhooks entrantes.
      6. En la sección Webhook URLs for Your Workspace (URLs de webhook de tu espacio de trabajo), haz clic en Add New Webhook to Workspace (Añadir nuevo webhook al espacio de trabajo).
      7. En la página de autorización que se abre, selecciona un canal para recibir notificaciones.
      8. Haz clic en Permitir.
      9. Se muestra un webhook de tu aplicación de Slack en la sección URLs de webhook de tu espacio de trabajo. Guarda la URL para más adelante.

    Configurar 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
    

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

    Configurar Prometheus

    1. Revisa el siguiente archivo de 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
      

      Este manifiesto describe las comprobaciones de actividad de Prometheus e incluye los siguientes campos:

      • spec.jobName: nombre del trabajo asignado a las métricas raspadas.
      • spec.prober.url: la URL de servicio del exportador de 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 recogida de métricas.
      • spec.targets.staticConfig.labels: las etiquetas asignadas a todas las métricas recogidas de los destinos.
      • spec.targets.staticConfig.static: lista de hosts que se van a sondear.
    2. Aplica el manifiesto a tu clúster:

      kubectl apply -f extras/prometheus/oss/probes.yaml
      
    3. Revisa el siguiente archivo de 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'
      

      Este manifiesto describe un PrometheusRule e incluye los siguientes campos:

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

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

    Simular una interrupción del servicio

    1. Simula una interrupción del servicio escalando el contacts Deployment a cero:

      kubectl scale deployment contacts --replicas 0
      

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

    2. Restaura la implementación de contacts:

      kubectl scale deployment contacts --replicas 1
      

      Deberías ver un mensaje de notificación de resolución de alerta en el canal del espacio de trabajo de Slack. GKE puede tardar hasta 5 minutos en escalar la implementación.

    Limpieza

    Para evitar que los recursos utilizados en este tutorial se cobren en tu cuenta de Google Cloud, elimina el proyecto que contiene los recursos o conserva el proyecto y elimina los recursos.

    Eliminar el proyecto

    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.

    Eliminar recursos concretos

    1. Elimina los recursos de Kubernetes:

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

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

      gcloud container clusters delete CLUSTER_NAME --quiet
      

    Siguientes pasos

    • Consulta información sobre Google Cloud Managed Service para Prometheus, una solución de métricas global totalmente gestionada basada en Prometheus que se implementa de forma predeterminada en todos los clústeres de Autopilot.
    • Consulta arquitecturas de referencia, diagramas y prácticas recomendadas sobre Google Cloud. Consulta nuestro Centro de arquitectura de Cloud.