Utiliser Kubernetes en local

Posted on December 18, 2019 | 4 minute read

Kubernetes, ou k8s, est un des grands topics du moment pour les devops. Mais concrètement, c’est quoi ? Ce n’est pas si compliqué, c’est un orchestrateur de conteneurs. Pour faire simple: vous avez déjà joué avec Docker, lancé un conteneur ici et là, linker un conteneur à un autre, et j’en passe…

Hé bien, Kubernetes est un peu le maître d’orchestre de tout cela : il permet de gérer à votre place le déploiement de grappes de conteneurs, leur mise en oeuvre ainsi que leur scalabilité, le tout automatiquement. Il fonctionne avec plusieurs systèmes de conteneurisation mais est tout de même beaucoup utilisé avec Docker.

A mettre en place pour jouer avec et se familiariser avec les commandes et les concepts, c’est un peu plus complexe. Il est cependant possible de déployer un environnement Kubernetes de test en local, qui vous donnera accès à toutes les fonctionnalités de cette techno : microk8s, développé par Canonical.

Contrairement à Minikube qui est plutôt en vogue, microk8s ne déploie pas et n’utilise pas de VM, et vous donne accès au panel complet de fonctionnalités d’un vrai cluster Kubernetes.

Prérequis: votre OS doit supporter les snaps.

L’installation se fait assez simplement :

% sudo snap install microk8s --classic
microk8s v1.17.0 par Canonical✓ installé

C’est déjà up and running :

% sudo microk8s.status
microk8s is running
addons:
cilium: disabled
dashboard: disabled
dns: disabled
fluentd: disabled
gpu: disabled
helm: disabled
ingress: disabled
istio: disabled
jaeger: disabled
juju: disabled
knative: disabled
kubeflow: disabled
linkerd: disabled
metallb: disabled
metrics-server: disabled
prometheus: disabled
rbac: disabled
registry: disabled
storage: disabled

En premier lieu, je suis fainéant donc il convient de mettre l’alias suivant :

% sudo snap alias microk8s.kubectl kubectl
Ajouté:
  - microk8s.kubectl as kubectl
  

Et de m’ajouter au bon groupe système pour éviter d’avoir à travailler en sudo :

% sudo gpasswd -a kharec microk8s
Ajout de l'utilisateur kharec au groupe microk8s

Après rechargement de ma session, kubectl est exploitable, je vois mon unique noeud qui est donc mon poste local:

% kubectl get nodes
NAME    STATUS   ROLES    AGE     VERSION
matty   Ready    <none>   9m52s   v1.17.0

Maintenant, que puis-je faire avec ? C’est la beauté de la chose, tout ce que peut faire un cluster Kubernetes en conditions réelles. Par exemple, je peux activer le dashboard Kubernetes pour avoir un visu plus sexy de mes ressources:

% kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yaml
namespace/kubernetes-dashboard created
serviceaccount/kubernetes-dashboard created
service/kubernetes-dashboard created
secret/kubernetes-dashboard-certs created
secret/kubernetes-dashboard-csrf created
secret/kubernetes-dashboard-key-holder created
configmap/kubernetes-dashboard-settings created
role.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrole.rbac.authorization.k8s.io/kubernetes-dashboard created
rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
deployment.apps/kubernetes-dashboard created
service/dashboard-metrics-scraper created
deployment.apps/dashboard-metrics-scraper created
% kubectl proxy
Starting to serve on 127.0.0.1:8001

Je démarre un proxy qui rendra mon dashboard accessible sur http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/, mais il me faudra un token pour m’y connecter. Token que que je génère via :

% kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')

Voici un aperçu dudit dashboard :

dashboard k8s

Et c’est aussi visible depuis kubectl qui me remonte également plein d’infos sympas :

% kubectl get all --all-namespaces
NAMESPACE              NAME                                             READY   STATUS    RESTARTS   AGE
kubernetes-dashboard   pod/dashboard-metrics-scraper-76585494d8-k6dgr   1/1     Running   0          13h
kubernetes-dashboard   pod/kubernetes-dashboard-5996555fd8-gl5lz        1/1     Running   0          13h

NAMESPACE              NAME                                TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
default                service/kubernetes                  ClusterIP   10.152.183.1     <none>        443/TCP    14h
kubernetes-dashboard   service/dashboard-metrics-scraper   ClusterIP   10.152.183.182   <none>        8000/TCP   13h
kubernetes-dashboard   service/kubernetes-dashboard        ClusterIP   10.152.183.22    <none>        443/TCP    13h

NAMESPACE              NAME                                        READY   UP-TO-DATE   AVAILABLE   AGE
kubernetes-dashboard   deployment.apps/dashboard-metrics-scraper   1/1     1            1           13h
kubernetes-dashboard   deployment.apps/kubernetes-dashboard        1/1     1            1           13h

NAMESPACE              NAME                                                   DESIRED   CURRENT   READY   AGE
kubernetes-dashboard   replicaset.apps/dashboard-metrics-scraper-76585494d8   1         1         1       13h
kubernetes-dashboard   replicaset.apps/kubernetes-dashboard-5996555fd8        1         1         1       13h

Je vais aller plus loin et lancer un déploiement d’une stack type, par exemple nginx, et je vais l’appeler sobrement nginx-test-article.

% kubectl create deployment nginx-test-article --image nginx
deployment.apps/nginx-test-article created

Rapide, efficace. Comme je n’ai pas précisé de namespace, kubectl a créé tout ça dans le namespace default, je n’ai donc rien à préciser quand je requête l’API pour voir les ressources.

% kubectl get all
NAME                                      READY   STATUS              RESTARTS   AGE
pod/nginx-test-article-54798f58fc-nlpnx   0/1     ContainerCreating   0          57s

NAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.152.183.1   <none>        443/TCP   14h

NAME                                 READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-test-article   0/1     1            0           57s

NAME                                            DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-test-article-54798f58fc   1         1         0       57s

J’ai également les infos que je peux parcourir plus simplement dans mon dashboard :

nginx in k8s

Je vous laisse parcourir ledit dashboard mais c’est dingue toutes les informations qu’on y trouve !

Et pour nettoyer tout ça en fin d’article (en l’occurence), snap nous aide encore :

% sudo snap remove microk8s
microk8s supprimé
% sudo groupdel microk8s
% id
uid=1000(kharec) gid=1000(kharec) groupes=1000(kharec),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),119(lpadmin),130(lxd),131(sambashare),133(kismet),134(docker),135(libvirt),144(wireshark)

Voilà qui clot ma démo visant à vous montrer comment se familiariser avec Kubernetes, ses commandes, ses composants, ses concepts dans un environnement de test nettoyable facilement.

Enjoy ! 🐳 🚀

tags:kubernetes infrastructure