Docker Desktop le permite tener una instalación de Kubernetes en su máquina local; de forma predeterminada, proporciona la mayoría de las funciones requeridas por un desarrollador. Sin embargo, metric-server no forma parte de las características integradas de docker-desktop. Significa que si necesita o desea acceder al servidor de métricas desde su Kubernetes local (Docker-Desktop), primero deberá configurarlo.
¿Qué es Metrics Server?
El servidor de métricas de Kubernetes es un agregador de datos de uso de recursos de todo el clúster. El servidor de métricas de Kubernetes recopila métricas de recursos del kubelet que se ejecuta en cada nodo trabajador y las expone en el servidor de la API de Kubernetes a través de la API de métricas de Kubernetes.
En otras palabras, te permite saber cuántos recursos (CPU, memoria) están consumiendo los pods o nodos en un momento específico.
¿Para qué podría necesitar de Metric Server ?
Metric Server ayuda a la observabilidad del clúster, desde la verificación manual con kubectl hasta el “dashboard” de Kubernetes, alguna otra herramienta de monitoreo sobre el clúster k8s o incluso una herramienta personalizada para monitorear nuestros pods en el clúster. Cualquiera que sea el escenario, la forma de conocer la memoria y el consumo de CPU de un POD o Nodo en un momento específico es mediante el “metric server”.
En clústers listos para producción (no Docker Desktop), podría usarse para definir políticas para nodos de escalado automático horizontal. Por lo tanto, se podría agregar un nuevo nodo al clúster si los recursos del nodo existente superan un umbral definido.
Instalación de Metric Server
Es muy sencillo, simplemente copie el siguiente fragmento de código y guárdelo en un archivo con extensión yaml. Luego, apliquemos el archivo en la instancia de Kubernetes de docker-desktop.
kubectl apply -f metric-server.yaml
Este es el YAML que debe de copiar…
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
k8s-app: metrics-server
name: metrics-server
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
labels:
k8s-app: metrics-server
rbac.authorization.k8s.io/aggregate-to-admin: "true"
rbac.authorization.k8s.io/aggregate-to-edit: "true"
rbac.authorization.k8s.io/aggregate-to-view: "true"
name: system:aggregated-metrics-reader
rules:
- apiGroups:
- metrics.k8s.io
resources:
- pods
- nodes
verbs:
- get
- list
- watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
labels:
k8s-app: metrics-server
name: system:metrics-server
rules:
- apiGroups:
- ""
resources:
- pods
- nodes
- nodes/stats
- namespaces
- configmaps
verbs:
- get
- list
- watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
labels:
k8s-app: metrics-server
name: metrics-server-auth-reader
namespace: kube-system
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: extension-apiserver-authentication-reader
subjects:
- kind: ServiceAccount
name: metrics-server
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
labels:
k8s-app: metrics-server
name: metrics-server:system:auth-delegator
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:auth-delegator
subjects:
- kind: ServiceAccount
name: metrics-server
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
labels:
k8s-app: metrics-server
name: system:metrics-server
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:metrics-server
subjects:
- kind: ServiceAccount
name: metrics-server
namespace: kube-system
---
apiVersion: v1
kind: Service
metadata:
labels:
k8s-app: metrics-server
name: metrics-server
namespace: kube-system
spec:
ports:
- name: https
port: 443
protocol: TCP
targetPort: https
selector:
k8s-app: metrics-server
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
k8s-app: metrics-server
name: metrics-server
namespace: kube-system
spec:
selector:
matchLabels:
k8s-app: metrics-server
strategy:
rollingUpdate:
maxUnavailable: 0
template:
metadata:
labels:
k8s-app: metrics-server
spec:
containers:
- args:
- --cert-dir=/tmp
- --secure-port=4443
- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
- --kubelet-use-node-status-port
- --kubelet-insecure-tls
image: k8s.gcr.io/metrics-server/metrics-server:v0.4.2
imagePullPolicy: IfNotPresent
livenessProbe:
failureThreshold: 3
httpGet:
path: /livez
port: https
scheme: HTTPS
periodSeconds: 10
name: metrics-server
ports:
- containerPort: 4443
name: https
protocol: TCP
readinessProbe:
failureThreshold: 3
httpGet:
path: /readyz
port: https
scheme: HTTPS
periodSeconds: 10
securityContext:
readOnlyRootFilesystem: true
runAsNonRoot: true
runAsUser: 1000
volumeMounts:
- mountPath: /tmp
name: tmp-dir
nodeSelector:
kubernetes.io/os: linux
priorityClassName: system-cluster-critical
serviceAccountName: metrics-server
volumes:
- emptyDir: {}
name: tmp-dir
---
apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
labels:
k8s-app: metrics-server
name: v1beta1.metrics.k8s.io
spec:
group: metrics.k8s.io
groupPriorityMinimum: 100
insecureSkipTLSVerify: true
service:
name: metrics-server
namespace: kube-system
version: v1beta1
versionPriority: 100Verificando que Metric Server ya está instalado
Debe de ver un pod metric-server-XXXX corriendo en el namespace kube-system.
kubectl get pods -n kube-system | grep metrics-server

Referencias
- https://www.metricfire.com/blog/how-to-monitor-your-kubernetes-metrics-server/
- https://www.ibm.com/docs/en/spp/10.1.8?topic=prerequisites-kubernetes-verifying-whether-metrics-server-is-running
- https://kubernetes.io/docs/tasks/debug/debug-cluster/resource-metrics-pipeline/
