Kubernetes Metrics: entendiendo el rendimiento real de nuestra clúster

En cualquier clúster de Kubernetes, la capacidad para observar qué ocurre realmente dentro de los nodos y los pods es esencial para tomar decisiones informadas. Kubernetes, por sí mismo, proporciona información estructural sobre los objetos del clúster, como qué está desplegado, en qué estado se encuentra, cuántas réplicas existen, etc.,  pero no ofrece de forma nativa datos sobre el uso de recursos como CPU, memoria o consumo del sistema por parte de los contenedores.

Ahí es donde entra en juego Kubernetes Metrics, un conjunto de componentes que permiten recopilar, exponer y consultar métricas fundamentales para entender el comportamiento del clúster.

Gracias a estos datos es posible desde ajustar límites y peticiones de recursos hasta detectar picos de carga, planificar capacidad, configurar autoescalado con Horizontal Pod Autoscaler o simplemente diagnosticar un rendimiento deficiente en algún servicio. En entornos de producción o incluso en escenarios de desarrollo donde queremos afinar despliegues, disponer de métricas fiables se vuelve imprescindible.

Logo de Kubernetes

Instalar Kubernetes Metrics en nuestro clúster

Vamos a ver como desplegar este conjunto de herramientas en nuestro clúster.

Descargar el fichero de configuración y despliegue

Vamos a utilizar el fichero de despliegue ofrecido directamente por el propio proyecto, así:

wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

De esta manera ya tendremos el fichero YAML a nuestra disposición.

Además, esto nos permitirá poder modificarlo de forma fácil.

Modificar como se conecta con los nodos

Por defecto se conecta con los nodos por IP, pero eso a mi no me interesa, le vamos a decir que lo haga por nombre DNS, esta línea tiene que quedar así:

- --kubelet-preferred-address-types=Hostname,InternalIP,ExternalIP

Deshabilitar la consulta TLS

Para deshabilitar la consulta TLS, debemos añadir esta línea:

- --kubelet-insecure-tls

Desplegamos

Una vez hemos realizado los cambios en el fichero, deberia quedar así:

(...)
spec:
      containers:
      - args:
        - --cert-dir=/tmp
        - --secure-port=10250
        - --kubelet-preferred-address-types=Hostname,InternalIP,ExternalIP
        - --kubelet-use-node-status-port
        - --metric-resolution=15s
        - --kubelet-insecure-tls
        image: registry.k8s.io/metrics-server/metrics-server:v0.8.0
        imagePullPolicy: IfNotPresent
(...)

Ahora ya podemos hacer el despliegue.

kubectl apply -f components.yml

Si todo ha ido bien, deberíamos ver algo similar a lo siguiente:

davidochobits@testkubernetes:~/deploy/devops/metrics-server$ kubectl apply -f components.yaml
serviceaccount/metrics-server created
clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader created
clusterrole.rbac.authorization.k8s.io/system:metrics-server created
rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader created
clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator created
clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server created
service/metrics-server created
deployment.apps/metrics-server created
apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created

Ejemplos de uso de Kubernetes Metrics

Ver el consumo de CPU y memoria de los pods

Esto nos permite identificar si un contenedor está usando más recursos de los esperados o si está infradimensionado.

kubectl top pod -n nombre-namespace

Monitorizar el uso de recursos de los nodos

Ayuda a detectar saturación, desequilibrios de carga o posibles problemas de capacidad.

kubectl top node

Ajustar requests y limits de los deployments

Con el histórico de las métricas puedes redefinir:

  • requests demasiado altos: desaprovechan nodos
  • requests demasiado bajos: riesgo de throttling o OOMKills

Habilitar autoscaling con el Horizontal Pod Autoscaler (HPA)

El HPA usa métricas de CPU, memoria u otras para escalar automáticamente un Deployment.

kubectl autoscale deployment mi-app --cpu-percent=80 --min=2 --max=10

A modo de resumen

Hemos visto como las métricas de Kubernetes permiten detectar rápidamente picos de carga o comportamientos anómalos, ayudan a planificar capacidad a medio y largo plazo, facilitan la identificación de problemas como memory leaks o un consumo inusual de recursos, y permiten evaluar de forma objetiva el impacto de nuevas versiones comparando su eficiencia con despliegues anteriores.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.