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 |
? |