Kubernetes monitoring: Prometheus operator

Para finalizar con la serie de artículos centrada en la instalación de las principales herramientas de monitorización en Kubernetes haciendo uso de los operadores, hoy es el turno de Prometheus, el sistema de monitorización de métricas y alertas open source más extendido de la actualidad.

En el presente artículo se pretende describir que es Prometheus así como detallar los pasos a seguir para instalar dicha solución.

Caso de uso

Se dispone de una cluster “vanilla” de Kubernetes, compuesto por un único nodo y con varios microservicios desplegados, en el que se quiere instalar un Prometheus haciendo uso del correspondiente operador.

¿Que es Prometheus?

Prometheus es un sistema de monitorización y alertas open source desarrollado por SoundCloud en 2012 con la premisa de concebir un producto escalable con un potente y sencillo lenguaje de consultas.

Escrito en Go, en mayo de 2016 se convertía en el segundo proyecto incubado por la CNCF (Cloud Native Computing Foundation) tras Kubernetes y en agosto de 2018 lograría la categoría de graduado.

Arquitectura

Prometheus se compone de múltiples componentes si bien estos son los principales para el caso de uso definido previamente:

  • Prometheus server: Es el componente encargado de recolectar y almacenar las métricas de los aplicativos en una time series database.
  • Service discovery: Prometheus dispone de conectores con los principales Service Discovery del mercado pudiendo auto descubrir y desechar aplicaciones de forma automática en tiempo real, algo fundamental cuando se trabaja con contenedores que cambian de IP constantemente.
  • Client libraries: Son las librerías encargadas de exponer las métricas internas de la aplicación a monitorizar en formato Prometheus (CPU, Memoria, Threads, GC…), para que puedan ser recolectadas por el Prometheus server.
  • Alert manager: Es el componente encargado de gestionar las alertas enviadas por el Prometheus server. Es decir, agrupa y notifica las alarmas por los distintos medios definidos como correo electrónico, PagerDuty u OpsGenie entre otros. También se encarga de silenciar e inhibir las alertas.

Funcionamiento

A diferencia de otros productos, Prometheus opta por un modelo “Pull” en el que consulta activamente las aplicaciones a monitorizar y recuperar métricas de ellas, apoyado en el service discovery correspondiente, en lugar de un modelo “Push” en el que sean estas las encargadas de enviarlas.

De esta forma evita saturar el servidor principal en caso de un mal funcionamiento del producto al mismo tiempo que permite definir una configuración distinta para cada aplicación en un único punto centralizado.

Posteriormente la información puede ser explotada a través de las distintas Web-UIs preparadas para ello, si bien Grafana suele ser la opción más popular.

Instalación

El operador de Prometheus es uno de los más avanzados del momento, habiendo alcanzado el nivel de capacidad “Deep Insights”.

Una vez instalado, permite la creación y destrucción de instancias de Prometheus en Kubernetes, su configuración así como la definición de los aplicativos a monitorizar.

La instalación del operador se realizará a través del chart de Helm desarrollado para ello y como siempre es recomendable revisar el fichero values, por si se quisiera modificar alguno de sus valores, pero en principio no es necesario para el caso de uso actual.

Ahora bien y a diferencia de otros casos, este chart sí que desplegará por defecto tanto el operador como el Prometheus propiamente dicho, con los correspondiente AlertManager y Grafana, todo ello configurable en el fichero values señalado previamente.

# Create namespaces
kubectl create namespace prometheus-system

# Install Prometheus operator
helm install stable/prometheus-operator --namespace=prometheus-system

En caso de necesitar instalar varias instancias de Prometheus en un mismo cluster de Kubernetes, se deberá hacer uso de este mismo chart, teniendo en cuenta que solo debe haber una instancia del operador.

Con la configuración por defecto Prometheus se encargará de monitorizar el cluster de Kubernetes, si bien para realizar el scrapping sobre los pods desplegados en la plataforma se recomienda añadir la siguiente configuración en el values del chart de Helm visto anteriormente.

prometheus:
  prometheusSpec:
    additionalScrapeConfigs:
    - job_name: 'kubernetes-pods'
      scrape_interval: 5s
      kubernetes_sd_configs:
      - role: pod
      relabel_configs:
      - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
        action: keep
        regex: true
      - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
        action: replace
        target_label: __metrics_path__
        regex: (.+)
      - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
        action: replace
        regex: ([^:]+)(?::\d+)?;(\d+)
        replacement: $1:$2
        target_label: __address__
      - action: labelmap
        regex: __meta_kubernetes_pod_label_(.+)
      - source_labels: [__meta_kubernetes_namespace]
        action: replace
        target_label: kubernetes_namespace
      - source_labels: [__meta_kubernetes_pod_name]
        action: replace
        target_label: kubernetes_pod_name

Finalmente y a modo de curiosidad, esta seria la configuración recomendada para la monitorización de Istio.

prometheus:
  prometheusSpec:
    additionalScrapeConfigs:
    - job_name: 'istio-mesh'
      scrape_interval: 5s
      kubernetes_sd_configs:
      - role: endpoints
        namespaces:
          names:
          - istio-system
      relabel_configs:
      - source_labels: [__meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
        action: keep
        regex: istio-telemetry;prometheus
    - job_name: 'envy'
      scrape_interval: 5s
      kubernetes_sd_configs:
      - role: endpoints
        namespaces:
          names:
          - istio-system
      relabel_configs:
      - source_labels: [__meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
        action: keep
        regex: istio-statsd-prom-bridge;statsd-prom
    - job_name: 'istio-policy'
      scrape_interval: 5s
      kubernetes_sd_configs:
      - role: endpoints
        namespaces:
          names:
          - istio-system
      relabel_configs:
      - source_labels: [__meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
        action: keep
        regex: istio-policy;http-monitoring
    - job_name: 'istio-telemetry'
      scrape_interval: 5s
      kubernetes_sd_configs:
      - role: endpoints
        namespaces:
          names:
          - istio-system
      relabel_configs:
      - source_labels: [__meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
        action: keep
        regex: istio-telemetry;http-monitoring
    - job_name: 'pilot'
      scrape_interval: 5s
      kubernetes_sd_configs:
      - role: endpoints
        namespaces:
          names:
          - istio-system
      relabel_configs:
      - source_labels: [__meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
        action: keep
        regex: istio-pilot;http-monitoring
    - job_name: 'galley'
      scrape_interval: 5s
      kubernetes_sd_configs:
      - role: endpoints
        namespaces:
          names:
          - istio-system
      relabel_configs:
      - source_labels: [__meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
        action: keep
        regex: istio-galley;http-monitoring

Conclusiones

En conclusión, el operador de Prometheus es probablemente uno de los más avanzados de la actualidad y simplifica enormemente las tareas de instalación y configuración del aplicativo, por lo que no hay motivo para no lanzarse de lleno a la aventura.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s