Aller au contenu principal

Metrics Server collecte les métriques kubernetes

· 4 minutes de lecture
Stéphane ROBERT

logo kubernetes

Metrics Server est venue remplacer rapidement Heapster, et permet de collecter et d'aggreger des metriques de consommation en provenance des nodes et des pods du cluster Kubernetes.

Prérequis

Pour que Metrics Server fonctionne correctement il faut au préalable activer la diffustion des certificats généré par kubelet, pour les faire signer par l'autorité de certification du cluster. Si vous ne faites pas cela vous obtiendrez des erreurs dans les logs du pods metrics-server avec ce genre de contenu :

"Failed to scrape node" err="Get \"https://192.168.121.106:10250/stats/summary?only_cpu_and_memory=true\": x509: cannot validate certificate for 192.168.121.106 because it doesn't contain any IP SANs" node="master1"

On pourrait désactiver le controle des certificats mais j'aime pas ça. Donc dans un premier il faut éditer le configmap kubelet-config appartenant au namespace kube-system :

source <(kubectl completion bash) # Activation de l'autocompletion
kubectl -n kube-system get configmaps
NAME DATA AGE
calico-config 4 79m
coredns 1 5h49m
extension-apiserver-authentication 6 5h49m
kube-proxy 2 5h49m
kube-root-ca.crt 1 5h49m
kubeadm-config 1 5h49m
kubelet-config-1.23 1 5h49m
kubectl -n kube-system edit configmaps kubelet-config-1.23

Rechercher la ligne contenant kind: KubeletConfiguration et ajouter juste en dessous ceci :

    kind: KubeletConfiguration
serverTLSBootstrap: true

Comme sous vi :wq

Ensuite sur tous les noeuds du cluster (master et worker) éditer de la même façon le fichier /var/lib/kubelet/config.yaml. Je fourni les exemples de commande à réaliser dans ma CKASandBox :

ssh master1
vagrant@master1:~$ sudo su
root@master1:/home/vagrant# vi /var/lib/kubelet/config.yaml

De la même manière que précédement :

    kind: KubeletConfiguration
serverTLSBootstrap: true

Sauvegardez et quittez. Il faut ensuite relancer le service kubelet

root@master1:/home/vagrant# systemctl restart kubelet

Répétez l'opération sur tous les noeuds du cluster !

Maintenant nous allons signer les certificats.

kubectl get csr
NAME AGE SIGNERNAME REQUESTOR REQUESTEDDURATION CONDITION
csr-fjfpn 2m17s kubernetes.io/kubelet-serving system:node:worker1 <none> Approved,Issued
csr-mh2vl 4s kubernetes.io/kubelet-serving system:node:master1 <none> Pending
csr-t6nxf 10m kubernetes.io/kube-apiserver-client-kubelet system:bootstrap:kh6206 <none> Approved,Issued

Pour tous les certificats en status pending :

kubectl certificate approve csr-mh2vl
certificatesigningrequest.certificates.k8s.io/csr-mh2vl approved

Installation de Metrics Server

C'est assez simple il suffit de lancer cette commande kubectl :

kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/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

Vérifions le status du pod metrics-server :

kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system calico-kube-controllers-647d84984b-pl26z 1/1 Running 0 8m20s
kube-system calico-node-bl2cw 1/1 Running 0 8m21s
kube-system calico-node-cfqvd 1/1 Running 0 8m21s
kube-system coredns-64897985d-kbf5d 1/1 Running 0 4h38m
kube-system coredns-64897985d-xtv92 1/1 Running 0 4h38m
kube-system etcd-master1 1/1 Running 5 4h38m
kube-system kube-apiserver-master1 1/1 Running 5 4h38m
kube-system kube-controller-manager-master1 1/1 Running 5 4h38m
kube-system kube-proxy-2h652 1/1 Running 0 4h38m
kube-system kube-proxy-6sz96 1/1 Running 0 8m42s
kube-system kube-scheduler-master1 1/1 Running 5 4h38m
kube-system metrics-server-6c49cf6978-hxcsw 0/1 Running 0 8s

Si au bout de quelques minutes il n'est pas Ready (1/1). Alors consulter ces logs :

kubectl -n kube-system logs -f metrics-server-6c49cf6978-hxcsw

Consultation des metriques remontées par Metrics Server

Kubectl permet d'afficher et d'exploiter les informations stockées dans metrics-server.

Pour les nodes :

kubectl top node
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
master1 147m 7% 1116Mi 68%
worker1 58m 5% 572Mi 64%

Pour les pods

kubectl top pod -A
NAMESPACE NAME CPU(cores) MEMORY(bytes)
kube-system calico-kube-controllers-647d84984b-pl26z 2m 15Mi
kube-system calico-node-bl2cw 24m 122Mi
kube-system calico-node-cfqvd 26m 126Mi
kube-system coredns-64897985d-kbf5d 2m 20Mi
kube-system coredns-64897985d-xtv92 1m 17Mi
kube-system etcd-master1 13m 52Mi
kube-system kube-apiserver-master1 38m 310Mi
kube-system kube-controller-manager-master1 16m 55Mi
kube-system kube-proxy-2h652 1m 18Mi
kube-system kube-proxy-6sz96 1m 16Mi
kube-system kube-scheduler-master1 3m 24Mi
kube-system metrics-server-6c49cf6978-hxcsw 3m 16Mi

Ces informations vont vous permettre de mettre en place des limites de ressources à chacun des composants de kubernetes.

Plus loin avec Metrics Server

Metrics-Server ne propose aucune historisation des données collectées. Pour cela il faut installer par exemple Prometheus, pour le stockage, et Grafana, pour la visualisation des données collectées. Cela fera le sujet d'un prochain billet.

Autre point Metrics Server intègre un outil d'autoscaling Horizontal qui fera aussi le sujet d'un autre billet.