Monto un cluster Kubernetes con Raspberry Pi (parte V)

Esta es una serie de posts en la que voy a explicar cómo he montado un cluster de Kubernetes utilizando Raspberry Pi y algún ejemplo de uso.

Parte Título
P01 Hardware
P02 Sistema Operativo y Docker
P03 Cluster K3S
P04 Consumo eléctrico
P05 Monitorización
P06 (proximamente)

Para la monitorización del cluster he decidido utilizar el stack:

  • Prometheus
  • Alertmanager
  • Grafana

Estos componentes pueden ser instalados muy fácilmente en un cluster de kubernetes gracias al proyecto kube-prometheus. Sin embargo, existe un inconveniente con este proyecto, y es que no todas las imágenes que se utilizan se distribuyen para la arquitectura arm64, por lo que no es apto para mi cluster. Gracias a @geerlingguy, he encontrado el proyecto cluster-monitoring, de @carlosedp, que partiendo del proyecto kube-prometheus, ha realizado un gran trabajo realizando las adaptaciones necesarias poder instalarlo sobre la arquitectura arm64. Además, también está adaptado para ser instalado sobre K3s.

Prometheus

Prometheus es una base de datos de series temporales que permite almacenar métricas de diversos sistemas. Tiene un lenguaje de consulta PromQL que ha sido específicamente diseñado para la explotación de series temporales.

Prometheus se alimenta recuperando métricas de sistemas externos. Para ello, tiene definico una serie de targets, que son enpoints en los sistemas externos donde exponen sus propias métricas y que son consultados periódicamente por Prometheus. Prometheus proporciona lo que denomina Exporters que facilitan la integración con infinidad de sistemas, exponiendo la métricas de dichos sistemas en el formato esperado por Prometheus.

Prometheus permite realizar representaciones gráficas de las diferentes métricas, aunque considero que no es la mejor manera de realizar esta tarea. Existen otras alternativas, como Grafana, mucho más adecuados para este propósito.

Además permite crear alertas, mediante la definición reglas basadas en las métricas, que serán disparadas y permitirán actuar en consecuencia. Por ejemplo, si disponemos de una métrica que indica el espacio disponible en disco, podríamos crear una alerta en base a esta métrica y que se dispare cuando el espacio disponible sea inferior a un determinado porcentaje.

Alertmanager

Alertmanager es un sistema que se encarga de gestionar alertas, en este caso es utilizado para gestionar las alertas disparadas por Prometheus. Permite agrupar las alertas, silenciarlas temporalmente, quitar duplicadas, así como notificarlas vía email o a sistemas especializados como PagerDuty u OpsGeanie.

Grafana

Grafana permite realizar cuadros de mando basados en métricas almacenadas en sistemas externos. Se integra muy fácilmente con infinidad de sistemas de almacenamiento de métricas, como por ejemplo Prometheus. Los cuadros de mando son dinámicos e interactivos, permiten filtrar en uno de los gráficos y el resto de los gráficos del cuadro de mando se actualizan aplicando el mismo filtro.

Cluster Monitoring

A continuación voy a explicar algunos de los conceptos necesarios para comprender cómo se instalan y configuran todas las piezas de este proyecto. Comenzaré explicando algunos conceptos generales de kubernetes. Después explicaré los tipos de recursos de kubernetes que se utilizan en dicho proyecto. Y por último, explicaré los recursos que se crean para cada una de las piezas del proyecto.

Disclaimer: En lugar de limitarme a poner en marcha este proyecto y convertirme en un mero usuario, he aprovechado la ocasión para intentar comprender un poco más en detalle este proyecto y familiarizarme con los elementos de kubernetes que se están utilizando.

Conceptos generales de Kubernetes

Operator

Tipos de recursos de Kubernetes

Concepto API Alias Descripción
Namespace v1 -  
Service v1 -  
ServiceAccount v1 -  
Secret v1 -  
ConfigMapList v1 -  
ConfigMap v1 -  
Endpoints v1 -  
Deployment apps/v1 -  
DaemonSet apps/v1 -  
Ingress extensions/v1beta1 -  
CustomResourceDefinition apiextensions.k8s.io/v1 CRD  
ClusterRole rbac.authorization.k8s.io/v1 -  
ClusterRoleBinding rbac.authorization.k8s.io/v1 -  
RoleBinding rbac.authorization.k8s.io/v1  
APIService apiregistration.k8s.io/v1 -  

Componentes

Este proyecto está compuesto de las siguientes piezas:

  • prometheus-operator
  • alertmanager
  • armexporter
  • grafana
  • ingress
  • kube-state-metrics
  • node-exporter
  • prometheus-adapter
  • prometheus

prometheus-operator

Tipo Nombre Namespace Descripción
CRD Alertmanager -  
CRD PodMonitor -  
CRD Prometheus -  
CRD PrometheusRule -  
CRD ServiceMonitor -  
CRD ThanosRuler -  
ClusterRole prometheus-operator -  
ClusterRoleBinding prometheus-operator -  
Deployment prometheus-operator monitoring  
Service prometheus-operator monitoring  
ServiceAccount prometheus-operator monitoring  
ServiceMonitor prometheus-operator monitoring  
Imagen Nombre
carlosedp/prometheus-operator:v0.40.0 prometheus-operator
carlosedp/kube-rbac-proxy:v0.5.0 kube-rbac-proxy

alertmanager

Tipo Nombre Namespace Descripción
Alertmanager main monitoring  
Secret alertmanager-main monitoring  
Service alertmanager-main monitoring  
ServiceAccount alertmanager-main monitoring  
ServiceMonitor alertmanager-main monitoring  
Imagen Nombre
prom/alertmanager:v0.21.0 ?

armexporter

Tipo Nombre Namespace Descripción
ClusterRole arm-exporter -  
ClusterRoleBinding arm-exporter -  
DaemonSet arm-exporter monitoring  
Service arm-exporter monitoring  
ServiceAccount arm-exporter monitoring  
ServiceMonitor arm-exporter monitoring  
Imagen Nombre
carlosedp/arm_exporter:latest arm-exporter
carlosedp/kube-rbac-proxy:v0.5.0 kube-rbac-proxy

grafana

Tipo Nombre Namespace Descripción
Secret grafana-config monitoring  
Secret grafana-datasources monitoring  
ConfigMapList - -  
ConfigMap grafana-dashboard-apiserver monitoring  
ConfigMap grafana-dashboard-cluster-total monitoring  
ConfigMap grafana-dashboard-controller-manager monitoring  
ConfigMap grafana-dashboard-coredns-dashboard monitoring  
ConfigMap grafana-dashboard-k8s-resources-cluster monitoring  
ConfigMap grafana-dashboard-k8s-resources-namespace monitoring  
ConfigMap grafana-dashboard-k8s-resources-node monitoring  
ConfigMap grafana-dashboard-k8s-resources-pod monitoring  
ConfigMap grafana-dashboard-k8s-resources-workload monitoring  
ConfigMap grafana-dashboard-k8s-resources-workloads-namespace monitoring  
ConfigMap grafana-dashboard-kubelet monitoring  
ConfigMap grafana-dashboard-kubernetes-cluster-dashboard monitoring  
ConfigMap grafana-dashboard-namespace-by-pod monitoring  
ConfigMap grafana-dashboard-namespace-by-workload monitoring  
ConfigMap grafana-dashboard-node-cluster-rsrc-use monitoring  
ConfigMap grafana-dashboard-node-rsrc-use monitoring  
ConfigMap grafana-dashboard-nodes monitoring  
ConfigMap grafana-dashboard-persistentvolumesusage monitoring  
ConfigMap grafana-dashboard-pod-total monitoring  
ConfigMap grafana-dashboard-prometheus-dashboard monitoring  
ConfigMap grafana-dashboard-prometheus-remote-write monitoring  
ConfigMap grafana-dashboard-prometheus monitoring  
ConfigMap grafana-dashboard-proxy monitoring  
ConfigMap grafana-dashboard-scheduler monitoring  
ConfigMap grafana-dashboard-statefulset monitoring  
ConfigMap grafana-dashboard-workload-total monitoring  
ConfigMap grafana-dashboards monitoring  
Deployment grafana monitoring  
Service grafana monitoring  
ServiceAccount grafana monitoring  
ServiceMonitor grafana monitoring  
Imagen Nombre
grafana/grafana:7.0.3 grafana

ingress

Tipo Nombre Namespace Descripción
Ingress alertmanager-main monitoring  
Ingress grafana monitoring  
Ingress prometheus-k8s monitoring  

kube-state-metrics

Tipo Nombre Namespace Descripción
ClusterRole kube-state-metrics -  
ClusterRoleBinding kube-state-metrics -  
Deployment kube-state-metrics monitoring  
Service kube-state-metrics monitoring  
ServiceAccount kube-state-metrics monitoring  
ServiceMonitor kube-state-metrics monitoring  
Imagen Nombre
carlosedp/kube-state-metrics:v1.9.6 kube-state-metrics
carlosedp/kube-rbac-proxy:v0.5.0 kube-rbac-proxy-main
carlosedp/kube-rbac-proxy:v0.5.0 kube-rbac-proxy-self

node-exporter

Tipo Nombre Namespace Descripción
ClusterRole node-exporter -  
ClusterRoleBinding node-exporter -  
DaemonSet node-exporter monitoring  
Service node-exporter monitoring  
ServiceAccount node-exporter monitoring  
ServiceMonitor node-exporter monitoring  
Imagen Nombre
prom/node-exporter:v0.18.1 node-exporter
carlosedp/kube-rbac-proxy:v0.5.0 kube-rbac-proxy

prometheus-adapter

Tipo Nombre Namespace Descripción
APIService v1beta1.metrics.k8s.io -  
ClusterRole prometheus-adapter -  
ClusterRole system:aggregated-metrics-reader -  
ClusterRole resource-metrics-server-resources -  
ClusterRoleBinding prometheus-adapter -  
ClusterRoleBinding resource-metrics:system:auth-delegator -  
RoleBinding resource-metrics-auth-reader kube-system  
ConfigMap adapter-config monitoring  
Deployment prometheus-adapter monitoring  
Service prometheus-adapter monitoring  
ServiceAccount prometheus-adapter monitoring  
Imagen Nombre
directxman12/k8s-prometheus-adapter:v0.7.0 prometheus-adapter

prometheus

Tipo Nombre Namespace Descripción
ClusterRole prometheus-k8s -  
ClusterRoleBinding prometheus-k8s -  
Endpoints kube-controller-manager-prometheus-discovery kube-system  
Service kube-controller-manager-prometheus-discovery kube-system  
Service kube-dns-prometheus-discovery kube-system  
Endpoints kube-scheduler-prometheus-discovery kube-system  
Service kube-scheduler-prometheus-discovery kube-system  
Prometheus k8s monitoring  
RoleBinding prometheus-k8s-config monitoring  
RoleBindingList - -  
RoleBinding prometheus-k8s default  
RoleBinding prometheus-k8s kube-system  
RoleBinding prometheus-k8s monitoring  
Role prometheus-k8s-config monitoring  
RoleList - -  
Role prometheus-k8s default  
Role prometheus-k8s kube-system  
Role prometheus-k8s monitoring  
PrometheusRule prometheus-k8s-rules monitoring  
Service prometheus-k8s monitoring  
ServiceAccount prometheus-k8s monitoring  
ServiceMonitor prometheus monitoring  
ServiceMonitor kube-apiserver monitoring  
ServiceMonitor coredns monitoring  
ServiceMonitor kube-controller-manager monitoring  
ServiceMonitor kubelet monitoring  
ServiceMonitor kube-scheduler monitoring  

(reglas: no se enumeran porque son +170)

Imagen Nombre
prom/prometheus:v2.19.1 ?
Diego Castro
Diego Castro
Ingeniero en Informática

Apasionado de la programación

Relacionado