Metrics Server collecte les métriques 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'autocompletionkubectl -n kube-system get configmapsNAME DATA AGEcalico-config 4 79mcoredns 1 5h49mextension-apiserver-authentication 6 5h49mkube-proxy 2 5h49mkube-root-ca.crt 1 5h49mkubeadm-config 1 5h49mkubelet-config-1.23 1 5h49mkubectl -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 master1vagrant@master1:~$ sudo suroot@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 csrNAME AGE SIGNERNAME REQUESTOR REQUESTEDDURATION CONDITIONcsr-fjfpn 2m17s kubernetes.io/kubelet-serving system:node:worker1 <none> Approved,Issuedcsr-mh2vl 4s kubernetes.io/kubelet-serving system:node:master1 <none> Pendingcsr-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-mh2vlcertificatesigningrequest.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.yamlserviceaccount/metrics-server createdclusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader createdclusterrole.rbac.authorization.k8s.io/system:metrics-server createdrolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader createdclusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator createdclusterrolebinding.rbac.authorization.k8s.io/system:metrics-server createdservice/metrics-server createddeployment.apps/metrics-server createdapiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created
Vérifions le status du pod metrics-server :
kubectl get pod -ANAMESPACE NAME READY STATUS RESTARTS AGEkube-system calico-kube-controllers-647d84984b-pl26z 1/1 Running 0 8m20skube-system calico-node-bl2cw 1/1 Running 0 8m21skube-system calico-node-cfqvd 1/1 Running 0 8m21skube-system coredns-64897985d-kbf5d 1/1 Running 0 4h38mkube-system coredns-64897985d-xtv92 1/1 Running 0 4h38mkube-system etcd-master1 1/1 Running 5 4h38mkube-system kube-apiserver-master1 1/1 Running 5 4h38mkube-system kube-controller-manager-master1 1/1 Running 5 4h38mkube-system kube-proxy-2h652 1/1 Running 0 4h38mkube-system kube-proxy-6sz96 1/1 Running 0 8m42skube-system kube-scheduler-master1 1/1 Running 5 4h38mkube-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 nodeNAME CPU(cores) CPU% MEMORY(bytes) MEMORY%master1 147m 7% 1116Mi 68%worker1 58m 5% 572Mi 64%
Pour les pods
kubectl top pod -ANAMESPACE NAME CPU(cores) MEMORY(bytes)kube-system calico-kube-controllers-647d84984b-pl26z 2m 15Mikube-system calico-node-bl2cw 24m 122Mikube-system calico-node-cfqvd 26m 126Mikube-system coredns-64897985d-kbf5d 2m 20Mikube-system coredns-64897985d-xtv92 1m 17Mikube-system etcd-master1 13m 52Mikube-system kube-apiserver-master1 38m 310Mikube-system kube-controller-manager-master1 16m 55Mikube-system kube-proxy-2h652 1m 18Mikube-system kube-proxy-6sz96 1m 16Mikube-system kube-scheduler-master1 3m 24Mikube-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.