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: 100
Verificando 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/