Aller au contenu principal

Metrics Server collecte les métriques kubernetes

· 4 minutes de lecture
Stéphane ROBERT
Consultant DevOps

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.