J'assume complètement dans les lignes qui suivent de ne pas être un "pro" de Kubernetes. Bien au contraire ! Si par contre vous souhaitez découvrir - avec moi - ce monde qui fait tant parler de lui depuis maintenant quelques temps, alors allons-y! 😃

Avant-propos

  1. Pourquoi ne pas avoir sauté le pas vers Kubernetes et son petit frère K3S plus tôt ?

Tout simplement, parce que Docker, Docker-compose et même Docker Swarm m'ont toujours offert avec simplicité ce que j'attendais de la containerisation.

De plus, j'ai toujours trouvé les tutoriels sur Kubernetes inadaptés à mes besoins et mes attentes ( Je suis un homme basique ! )

  1. Pourquoi maintenant alors ?

Il n'y a que les idiots qui ne changent pas d'avis !

Cette envie à terme d'essayer OpenFaaS sur K3S !

K3S c'est quoi?

K3S est une version allégée de k8S qui est proposée par Rancher. D'une taille de 40 Mo, elle n'a besoin que de 512Mo de RAM pour s'exécuter. Le souhait est clairement affiché sur le site de K3S, décliner Kubernetes pour les équipements légers : IoT, edge server et Raspberry PI.

En résumé, certaines fonctionnalités devenues trop gourmandes en ressources de k8s sont abandonnées, en voici une liste rapide :

  • Suppression des fonctionnalités taggées “legacy”, “alpha”, “non-default”
  • Suppression des addons
  • Utilisation de SQLite3 comme stockage par défaut
  • Gestion automatique du TLS
  • Pas ou peu de dépendances avec le système d'exploitation.

Pour découvrir la spécifité des configurations Kubernetes, cela me semble parfait. Il faut savoir que k3s fonctionne avec cette base :

  • containerd (en remplacement de docker)
  • flannel
  • coredns
  • traefik 😍

Installation de K3S

Vraiment enthousiaste à l'idée de tester cette légèreté, je décide de ne pas y aller par 4 chemins dans le choix du VPS chez OVH : Le moins cher. 🤑

ovhvps

Pourquoi OVH ? Aucune raison, hormis d'avoir déjà un compte chez eux et n'avoir jamais eu de soucis avec les services proposés.

Après quelques minutes, accès reçu, allons-y.

Première habitude de SysAdmin :

apt update && apt upgrade -y 

J'en profite pour redémarrer après cet upgrade pour finaliser la mise à jour du kernel et démarrer sur celui-ci.

Enfin installons la seule dépendance de K3S : curl. Et installons K3S :

apt install curl -y
curl -sfL https://get.k3s.io | sh -
[INFO]  Finding latest release
[INFO]  Using v1.17.2+k3s1 as release
[INFO]  Downloading hash https://github.com/rancher/k3s/releases/download/v1.17.2+k3s1/sha256sum-amd64.txt
[INFO]  Downloading binary https://github.com/rancher/k3s/releases/download/v1.17.2+k3s1/k3s
[INFO]  Verifying binary download
[INFO]  Installing k3s to /usr/local/bin/k3s
[INFO]  Creating /usr/local/bin/kubectl symlink to k3s
[INFO]  Creating /usr/local/bin/crictl symlink to k3s
[INFO]  Creating /usr/local/bin/ctr symlink to k3s
[INFO]  Creating killall script /usr/local/bin/k3s-killall.sh
[INFO]  Creating uninstall script /usr/local/bin/k3s-uninstall.sh
[INFO]  env: Creating environment file /etc/systemd/system/k3s.service.env
[INFO]  systemd: Creating service file /etc/systemd/system/k3s.service
[INFO]  systemd: Enabling k3s unit
Created symlink /etc/systemd/system/multi-user.target.wants/k3s.service → /etc/systemd/system/k3s.service.
[INFO]  systemd: Starting k3s

Pas grand chose à dire, c'est efficace. Je n'aime pas trop lancer un script sh sans savoir ce qu'il fait, je vous laisse vous même vérifier le script exécuté !

Les bases

Testons notre installation avec notre première commande :

root@vpsXXXXXX:~# kubectl get nodes
NAME        STATUS   ROLES    AGE     VERSION
vpsXXXXXX   Ready    master   6m32s   v1.17.2+k3s1

Tout est ok. Ça tombe bien, dans ce cas réalisons notre premier déploiement.

Pour notre premier service, nous allons déployer une instance de Nginx. Voici un lien vers un dépôt avec les fichiers nécessaires : nginx-deployment.

Téléchargez les 3 fichiers que nous allons appliquer à un nouveau namespaces. Les namespaces sont des "cloisons" virtuelles qui vont nous permettre de séparer nos applications.

kubectl create namespace nginx

Il existe de nombreuses "versions courtes" des arguments sous k3s ou k8s. D'ailleurs, la commande précédente et la suivante sont similaires :

kubectl create ns nginx

Appliquons nos 3 fichiers à notre namespace nginx :

kubectl -n nginx create -f nginx-deployment.yml
kubectl -n nginx create -f nginx-service.yml 
kubectl -n nginx create -f nginx-ingress.yml 

Pour chaque commande, vous allez obtenir la validation de la création :

  • namespace/nginx created
  • deployment.apps/nginx created
  • service/nginx created
  • ingress.extensions/nginx created

On peut valider la création et vérifier notre installation avec les commandes suivantes :

kubectl --namespace nginx get deployments
kubectl --namespace nginx get pods
kubectl --namespace nginx get ingresses
kubectl --namespace nginx get services

Quelques explications :

  • Deployment : Un objet permettant de lancer des Pods ( En terme de concepts Docker, un pod est modélisé par un groupe de conteneurs Docker ayant des namespaces et des volumes partagés. ).
  • Service : Un service est un groupe de pods qui travaille ensemble. Le service est une couche d'abstraction supplémentaire qui offre une exposition à ce groupe de pods.
  • Ingress : Similaire à Docker, c'est un objet qui gère l'accès externe aux services dans un cluster.

Via votre navigateur, rendez-vous sur http://nginx.k3s.local pour afficher la page HTML par défaut de nginx !


Voilà qui clôt ce premier article autour de K3S et d'un premier exemple de diffusion de service. L'exemple technique est certes sommaire, mais je pense qu'il faut du temps pour digérer le changement de configuration et de vision entre du Docker 'out of the box' et Kubernetes.

J'espère que cet article vous aura tout de même plu ! En tout cas n'hésitez pas à m'apporter des remarques ou des commentaires sur Twitter