Todos los archivos estan en: 20-grafana-promethus. Se va hacer deploy de
- Imagen de Prometheus (sever)
- URL: 'http://192.168.49.2:30000/'
- kube-state-metrics (servicio definicion de una alerta)
- Alert Manager (manager)
- Grafana (UI)
Se creará un clusterRol (rol prometheus) para otorgar los permisos necesarios para Prometheus. Cualquier usario que pertenezca a ese rol recibirá los permisos del rol. \
La configuración se realiza por medio de un archivo: authorization-prometheus.yaml que contiene basicamente lo siguiente. \
Permisos
- obtener
- listar
- consultar
Objetos a los que tiene permitido acceder
- nodes
- nodes/proxy
- services
- endpoints
- pods
La configuración del rol debe ser almacenada persistente para que se pueda aplicar a cualquier pods que se cree en cualquier momento y no se elimine cuando sea eliminado el pod, esto se puede hacer globalmente con un configmap, esta configuración esta en configmap-prometheus.yaml, esta configuración se monta como un volumen. Este archivo usa el namespace monitoring definido en authorization-prometheus.yaml. \
En configmap-prometheus.yaml se crea prometheus.rules y prometheus.yml que es donde se configuran las reglas, para el ejercicio solo se crea una regla.
Reglas
- Alerta cuando el contenedor supere 1 byte de memoria
- Se realiza la verificación cada 5s
- Se define que la regla se envie al alert manager por el puerto 9093
A medida que se vayan probando las reglas se puede ir ajustando, asi mismo, este valor de 1 se puede ir cambiando. La estructura basica de una reglas es la que se define entre gropus: y summary. \
Tambien se definen los exportes o jobs con job_name que define su funcionamiento y que información recopila. \
En job_name: 'k8-state-metrics' usa la configuración definida en el deploymente kube-state-metrics en el archivo kube-state-metrics/deployment-ksm.yaml \
La instalación de Prometheus se hará por medio de un contenedor definido en deployment-ksm.yaml con una imagen del repositorio de Prometheus.
En el archivo kube-state-metrics/cluster-role-ksm.yaml se definen las propiedades del servicio.
Entre otros objetos a los que tiene permitido acceder estan
- configmaps
- secrets
- nodes
- pods
- services
- resourcequotas
- replicationcontrollers
- limitranges
- persistentvolumeclaims
- persistentvolumes
- namespaces
- endpoints
Acá tambien se definen que grupo de recursos tienen que permisos. Por cada grupo se define un set de permisos. \
Se crea un service account en kube-state-metrics/authorization-ksm.yaml que usa el kube-state-metrics/cluster-role-ksm.yaml, la definición de como es el servicio y la imagen que usa se encuentra en kube-state-metrics/deployment-ksm.yaml. Se define requiere que se defina como servicio, porque se requiere que sea un servicio accesible por IP por el servicio por Prometheus.
- Ver namespaces:
kubectl get namespace - Crear namespace para monitoring llamado monitoring:
kubectl create namespace monitoring - Aplicar role de monitorizacion llamado prometheus:
kubectl apply -f authorization-prometheus.yaml- Verificar rol: ir a dashboard kubenetes > Cluster Roles >> prometheus
- Aplicar configuración global de configuración para Prometheus:
kubectl apply -f configmap-prometheus.yaml- Verificar condigmap: ir a dashboard kubenetes > Config Maps >> filtrar por namespace monitoring >> prometheus-server-conf
- Hacer deploy de la imagen de Prometehus:
kubectl apply -f deployment-prometheus.yaml - Verificar los pods filtrado por el namespace monitoring:
kubectl get all --namespace=monitoring - Ver interfaz de Prometheus
- Fijarse en el puerto interno de prometheus-service > 30000
- Ir al navegador: 'minikube ip'+:+puerto > '192.168.49.2:30000'
- Instalación de servicio state-metrics
- Ejecutar despliege
kubectl apply -f kube-state-metrics/
- Ejecutar despliege
- Verificar servicio kube-state-metrics
- Prometheus > Status >> Targets, el servicio debe estar UP.
- Si aun no esta el servicio en UP, se debe recrear el primer deploy
- Eliminar definición:
kubectl delete -f deployment-prometheus.yaml - Hacer deploy de la imagen de Prometehus nuevament:
kubectl apply -f deployment-prometheus.yaml - Desde el Pods se pueden ver los errores, Kubernestes > Pods >> Filtrar por namespace monitoring
- Eliminar definición:
Aca se ven todos los Jobs definidos. Si sale el Job state-metrics esta Down debido a que aún no se ha definido el servicio.
- Prometheus > Status >> Targets
Se pueden ejecutar los querys PromQL en la lupa de la parte superior y se pueden ver un grafico basico en Garph. En Alets se ven las aletas que han sido configuradas. \
Los archivos de configuración e instalación estan en alert-manager/. Se puede configurar correo electronico para las notificación, pero para efectos practicos se usrá Slack. \
El despligue y el servicio se definen en deployment-alert-manager.yaml, en deployment-alert-manager.yaml se define el tipo de almacenamiento como persistente y se le asigna un tamaño de 500MB. La configuración del servicio esta en configmap-alert-manager.yaml en donde de crea un archivo alertmanager.yml y es donde va la configuración del canal de Slack, esto requiere usar un webhook de Slack. Para el ejercicio cree el canal en slack llamado curso-prometheus.
- Crear canal en Slack: curso-prometheus
- Ir a More > Apps, buscar: incoming webhooks
- Add to Slack
- Post to Channel > curso-prometheus
- Add Incoming Webhook integrations
- usar la url que da Slack que dice Webhook URL Send your JSON payloads to this URL: 'https://hooks.slack.com/services/T100AAAA/blablablabla'
- Pegar esta URL en el campo slack_api_url del archivo configmap-alert-manager.yaml
- Pegar nombre del canal en el campo slack_configs > channel
- En Slack se verá la notificación: añadió una integración a este canal: incoming-webhook
- Ejecutar:
kubectl apply -f alert-manager - Verificar: kubernetes dashboard > filtrar por namespace monitoring
- En Config Maps y Pods, debe estar alertmanager-conf
- Verificar interfaz del Alert Manager: 'minikube ip+31000' > 'http://192.168.49.2:31000'
En configmap-grafana.yaml se define el configmap que crea prometheus.yaml donde se especifica el datasource (de donde recibe la información), aca se pueden definir varios para usar información de varias BD. Aca esta la url del servicio de prometheus que debe ser la url del endpoint de prometheus (prometheus-service) y su puerto definido en deployment-prometheus.yaml. \
EL deploy se hace de una imagen publica de Grafana, se definen recursos y se monta el archivo de configuración del datasource definida en ConfigMap > grafana-datasources dentro de configmap-grafana.yaml. \
Se pueden usar diferentes DashBoard en: 'https://grafana.com/grafana/dashboards' \
- Ejecutar:
kubectl apply -f grafana - Verificar: minikube IP o Prometheus ip:+32000
- En este caso es: '192.168.49.2:32000'
- U: admin
- P: admin
- Descargar Template del Dashboard del sitio de Grafana
- En este caso usar 'https://grafana.com/grafana/dashboards'
- Buscar el que nos guste y copiar su ID (Copy ID Dashboard)
- En grafana > Dashboards > Import
- Import via grafana.com >> 6417 >> LOAD
- prometheus > prometheus
- Import
