miércoles, 18 de octubre de 2017

Kubernetes monitoring with Prometheus in 15 minutes


Si no ha oído hablar de Kubernetes (o su nombre comúnmente conocido K8s), es hora de salir de su cueva. K8s es una plataforma de auto-gestión de código abierto para desplegar, escalar y operar contenedores. Originalmente diseñado por Google (inspirado por Borg) y luego donado a la CNCF.

Comprender todos los componentes de k8s no es trivial, lleva tiempo tener un control total en una plataforma tan sofisticada y poderosa. También es importante darse cuenta de que los nodos, aplicaciones o redes pueden fallar en un momento particular, como todo en TI. Por lo tanto, tener alertas, registros, métricas y paneles de supervisión es fundamental para evitar interrupciones y otros problemas.

Durante mi último proyecto, pasando del baremetal a la nube, tuve tiempo de investigar el monitoreo proactivo con k8s. Después de algunos puntos de referencia y golpeando mi cabeza contra la pared, finalmente encontré a Prometheus. El proyecto k8s ya ha adoptado esta asombrosa herramienta, exponiendo las métricas de Prometeo en casi todos los componentes.

La supervisión de su clúster k8s ayudará a su equipo a:
  • Monitoreo proactivo
  • Visibilidad del clúster y planificación de capacidad
  • Activar alertas y notificaciones
  • Tableros de métricas


Durante el tiempo que estaba investigando sobre cómo Prometheus se integra con k8s, Coreos lanzó Prometheus-Operator; Se ajusta perfectamente a mis necesidades, facilitando la configuración de toda la instalación.

Operador Kubernetes

"Llamamos a esta nueva clase de Operadores de software. Un operador es un controlador específico de la aplicación que extiende la API de Kubernetes para crear, configurar y administrar instancias de aplicaciones complejas con estado en nombre de un usuario de Kubernetes. Se basa en los conceptos básicos de recursos y controladores de Kubernetes, pero incluye el dominio o el conocimiento específico de la aplicación para automatizar tareas comunes ".
Brandon Philips, de Coreos

Los operadores de Kubernetes fueron introducidos por Coreos en 2016, y tiene el poder de resumir implementaciones y configuración de aplicaciones. En una nota personal, he estado usando una gran cantidad de operador elasticsearch-operador y prometheus. No es el objetivo de este artículo extenderse en los operadores de k8, pero si estás interesado puedes ver a otros operadores de k8 aquí.


Prometeo


Prometheus es un tookit de herramientas de código abierto para monitorear y alertar, inspirado en Google Borg Monitor. Fue previamente desarrollado por SoundCloud y luego donado a la CNCF.

Prometheus tiene soporte para la aplicación de instrumentos en muchos idiomas. También brinda a los exportadores la conexión de aplicaciones (Postgresql, Mysql, AWS Cloudwatch, ETCD y K8), al tiempo que sigue siendo una excelente solución para monitorear la infraestructura y las aplicaciones.

Operador de Prometheus

La misión del Prometheus Operator es hacer que ejecutar Prometheus encima de Kubernetes sea lo más fácil posible, a la vez que preserva la configurabilidad y hace que la configuración sea nativa de Kubernetes. https://coreos.com/operators/prometheus/docs/latest/user-guides/getting-started.html

El Operator Prometheus proporciona una supervisión sencilla para los servicios y las implementaciones de k8 además de la configuración de Prometheus, Alertmanager y Grafana.


¿Como funciona?


Cuando implementa una nueva versión de su aplicación, k8s crea un nuevo pod (contenedor) y después de que el pod está listo, k8s destruye el anterior. Prometheus está en una vigilancia constante, mirando el k8s api y cuando detecta un cambio crea una nueva configuración de Prometheus, basada en los cambios de los servicios (pods).

ServiceMonitor

Operator-prometheus utiliza una Definición de recursos personalizados (CRD), denominada ServiceMonitor, para abstraer la configuración al destino. Como ejemplo a continuación, veamos cómo monitorear un pod NGINX con ServiceMonitor. El ServiceMonitor seleccionará el pod NGINX, usando el selector matchLabels. El operator-prometheus buscará los pods en función del selector de etiquetas y creará un objetivo prometheus, por lo que prometheus raspará el punto final de métricas.



apiVersion: monitoring.coreos.com/v1

kind: ServiceMonitor
metadata:
name: nginx
spec:
selector:
matchLabels:
app: nginx
namespaceSelector:
matchNames:
- default
endpoints:
- port: web
interval: 30s


Inténtalo tú mismo

Este tutorial se puede ejecutar en menos de 15 minutos, como registro que ya tiene:
  • Kubernetes en cluster y corriendo
  • Helm está instalado y funcionando
  • helm list

Instalación


1.Cree un nuevo espacio de nombres, clone el repositorio git prometheus-operator
kubectl create ns monitoring
git clone git@github.com:coreos/prometheus-operator.git
cd prometheus-operator

2. Instalar y delpliege prometheus-operator
helm install --name prometheus-operator --set rbacEnable=true --namespace=monitoring helm/prometheus-operator

3. Instale las especificaciones de Prometheus y Alertmanager y la implementación de grafana.
helm install --name prometheus --set serviceMonitorsSelector.app=prometheus --set ruleSelector.app=prometheus --namespace=monitoring helm/prometheus
helm install --name alertmanager --namespace=monitoring helm/alertmanager
helm install --name grafana --namespace=monitoring helm/grafana

4. Instale kube-prometheus para cargar exportadores y serviceMonitors predefinidos de k8s.
helm install --name kube-prometheus --namespace=monitoring helm/kube-prometheus

Suponiendo que todo esté bien, puede ejecutar el siguiente comando para enumerar las aplicaciones que veremos más a fondo en la próxima sesión.
$ kubectl get pods -n monitoring
NAME                                                      READY     STATUS    RESTARTS   AGE
alertmanager-alertmanager-0                               2/2       Running   0          3m
grafana-grafana-3066287131-brj8n                          2/2       Running   0          4m
kube-prometheus-exporter-kube-state-2696859725-s8m56      2/2       Running   0          3m
kube-prometheus-exporter-node-029w0                       1/1       Running   0          3m
kube-prometheus-exporter-node-n3txz                       1/1       Running   0          3m
kube-prometheus-exporter-node-q2rk3                       1/1       Running   0          3m
prometheus-operator-prometheus-operator-514889780-qm3fp   1/1       Running   0          4m
prometheus-prometheus-0                                   2/2       Running   0          3m

Prometeo

Reenvíe el servidor Prometheus a su máquina para que pueda ver mejor el dashboard abriendo http: // localhost: 9090
kubectl port-forward -n monitoring prometheus-prometheus-0 9090




En el panel Prometheus, puede: consultar las métricas, ver todas las alertas predefinidas y los destinos Prometheus.

Nota: Si algunos objetivos están cayendo con un error inalcanzable, verifique las reglas del grupo de seguridad o firewall. Si no tiene los mismos objetivos que la imagen de arriba, consulte las etiquetas de sus pods de k8s, a veces la herramienta que utilizó para implementar el cluster no sigue los patrones de etiquetas de k8s.

Nota 2: El proyecto prometheus-operator está trabajando para proporcionar alertas predeterminadas para k8s empaquetadas en un gráfico de helm. Por ahora, ejecute los siguientes comandos para cargar las reglas de alerta. En el futuro, este comando no será exigido.

sed -ie 's/role: prometheus-rulefiles/app: prometheus/g' contrib/kube-prometheus/manifests/prometheus/prometheus-k8s-rules.yaml
sed -ie 's/prometheus: k8s/prometheus: prometheus/g' contrib/kube-prometheus/manifests/prometheus/prometheus-k8s-rules.yaml
sed -ie 's/job=\"kube-controller-manager/job=\"kube-prometheus-exporter-kube-controller-manager/g' contrib/kube-prometheus/manifests/prometheus/prometheus-k8s-rules.yaml
sed -ie 's/job=\"apiserver/job=\"kube-prometheus-exporter-kube-api/g' contrib/kube-prometheus/manifests/prometheus/prometheus-k8s-rules.yaml
sed -ie 's/job=\"kube-scheduler/job=\"kube-prometheus-exporter-kube-scheduler/g' contrib/kube-prometheus/manifests/prometheus/prometheus-k8s-rules.yaml
sed -ie 's/job=\"node-exporter/job=\"kube-prometheus-exporter-node/g' contrib/kube-prometheus/manifests/prometheus/prometheus-k8s-rules.yaml
kubectl apply -n monitoring -f contrib/kube-prometheus/manifests/prometheus/prometheus-k8s-rules.yaml

Grafana


Prometheus tiene un navegador de expresiones para el propósito de depuración. Para tener un tablero atractivo, use Grafana, tiene una fuente de datos lista para consultar en Prometheus.

Nota: El proyecto prometheus-operator está funcionando para proporcionar un despliegue fácil para Grafana, probablemente usando un nuevo CRD. Por ahora, ejecute los siguientes comandos para configurar y cargar los paneles. En el futuro, este comando no será necesario.

sed -ie 's/grafana-dashboards-0/grafana-grafana/g' contrib/kube-prometheus/manifests/grafana/grafana-dashboards.yaml
sed -ie 's/prometheus-k8s.monitoring/prometheus-prometheus.monitoring/g' contrib/kube-prometheus/manifests/grafana/grafana-dashboards.yaml
kubectl apply -n monitoring -f contrib/kube-prometheus/manifests/grafana/grafana-dashboards.yaml
kubectl port-forward -n monitoring $(kubectl get pods --selector=app=grafana-grafana -n monitoring --output=jsonpath={.items..metadata.name})  3000

Espere unos segundos hasta que grafana cargue los paneles, abra su navegador en http: // localhost: 3000 para ver su impresionante dashboard nuevo !!!

Grafana - Tableros Kubernetes

Grafana - Tablero de planificación de capacidad de Kubernetes

Alertmanager

Alertmanager maneja alertas enviadas por aplicaciones cliente como el servidor Prometheus. Se ocupa de desduplicar, agrupar y enrutarlos a la integración correcta del receptor, como correo electrónico, PagerDuty u OpsGenie. También se ocupa del silenciamiento y la inhibición de alertas.

Ya instalamos Alertmanager, ahora el comando a continuación, para reenviar el puerto a su máquina y abrir la URL http: // localhost: 9093 en su navegador
kubectl port-forward -n monitoring alertmanager-alertmanager-0 9093