logo le blog invivoo blanc

K3S “Kubernetes enfin ultra simple et léger avec k3s”

14 février 2022 | Design & Code | 0 comments

Introduction

Kubernetes (k8s), plateforme d’orchestration de conteneurs, s’est ancrée aujourd’hui dans le paysage du cloud. En effet, fort de sa communauté, k8s est devenu l’option majeure pour la mise en place d’un cluster. Toutefois, l’installation et le paramétrage d’un cluster k8s reste plus au moins difficile. Par ailleurs, k8s est relativement consommateur en ressources ce qui ne facilite pas son utilisation dans les environnements légers (IOT, Edge computing, Rasberry,…). Dans ce contexte, k3s offre une alternative fiable et moins coûteuse en ressource, idéale pour les environnements limités. Cet article s’inspire de la conférence Devoxx “Kubernetes enfin ultra simple et léger avec k3s” présentée par Sébastien Moreno, architecte, expert DevOps et développeur Java et Remi Jacques Le Seigneur, consultant chez Ippon technologies.

K3s

Proposé par Rancher, k3s est une version kubernetes light qui vise au moins la moitié de la taille de k8s (k8letters) particulièrement adaptée pour l’IOT, le edge computing ou bien les environnements CI/CD. Il s’agit d’un binaire unique ~50Mo nécessitant 512 de RAM. Il est sécurisé par défaut et préconfiguré avec Containerd, CoreDNS, Flannel… En plus, un local storage provider, Helm controller, un load balancer (Traefik Ingress), entre autres, sont pré-installés. Enfin, K3s est certifié CNCF (Cloud Native Computing Foundation).

Architecture

K3s comprend un seul processus qui peut jouer le rôle du serveur ou d’agent. Par défaut, la configuration du cluster est stockée dans une base de données (SQLite). Il peut être déployé avec un seul nœud serveur ou plusieurs en mode HA (high availability) avec une base de données externe (Etcd, Postgres, MySql)

Installation sur un seul serveur

K3s peut être déployé en mode serveur unique avec une base de données interne (SQLite). Le nœud serveur peut également jouer le rôle agent sinon un ou plusieurs nœuds agents peuvent être ajoutés. L’image, ci-dessous, de la documentation officielle illustre ce mode :

Mode HA (high availability)

En mode haute disponibilité, K3s peut être déployé avec plusieurs serveurs avec une base de données externe (Etcd, Postgres, MySql), comme illustré ci-dessous :

Installation k3s avec un seul serveur

L’installation de k3s sur avec un seul serveur est très simple. Il suffit de récupérer le binaire et l’installer :

curl -sfL https://get.k3s.io | sh -

Vérification de l’installation

Une fois l’installation K3s terminée, nous pouvons vérifier le service k3s est bien démarré :

Notre cluster, composé d’un seul nœud jouant le rôle du serveur et d’agent, est maintenant disponible :

Nous pouvons vérifier le nœud unique composant le cluster :

Installation k3s avec plusieurs nœuds agents

Pour le déploiement d’un cluster avec plusieurs agents, il suffit d’ajouter deux variables d’environnement pour permettre l’agent de joindre un cluster existant :

  • Token
  • Serveur ip

Le token peut être récupéré depuis le noeud serveur comme suit :

L’installation d’un nœud agent consiste à installer k3s et exporter le K3S_URL et le K3S_TOKEN comme suit :

Une fois les deux variables exportées, l’ajout d’un nœud agent revient simplement à lancer la commande k3s agent :

Installation avec l’utilitaire k3sup

L’installation k3s est encore plus rapide avec l’utilisation de k3sup. Il s’agit d’un utilitaire permettant de simplifier davantage l’installation de k3s en local ou en remote.

Helm installation

K3s est, par défaut, préconfiguré avec un contrôleur Helm. La configuration du cluster est accessible dans le fichier k3s.yaml. Il suffit d’ajouter notre variable KUBECONFIG :

De même, l’installation de Helm est aussi simple en ligne de commande :

Une fois l’installation de Helm est terminée, nous pouvons vérifier le déploiement de Traefik sur le namespace kube-system :

Exemple de déploiement

Afin de tester un premier déploiement sur notre cluster k3s, nous allons déployer l’application basique Node suivante :

Pour déployer notre application dans le cluster nous allons créer une image Docker associée via le fichier dockerfile suivant :

Pour des raisons de simplicité, nous allons utiliser le registry local de docker (cf https://docs.docker.com/registry/deploying/ ) pour déployer notre image. Une fois notre image créée et déployée sur le registry docker, nous allons déployer cette application à l’aide de Helm. Créons tout d’abord le Helm Chart :

Ci-dessous, l’arborescence créée par Helm :

Modifions les values.yaml de Helm comme suit :

Ceci permet de déclarer notre configuration du :

  • nombre de replicas (ici 3)
  • l’image Docker (repository et tag)
  • le type de service (ClusterIP) ainsi que le port associé (80)

Modifions le fichier du deployment.yaml comme suit :

Ainsi que le service :

Créons également notre objet ingress :

Pour déployer l’application il suffit de lancer l’install Helm comme suit :

Vérifions que notre application est bien déployée :

Notons la création des 3 pods tels que décrits dans notre fichier values (replicaCount: 3) :

L’utilisation d’un alias pour la commande kubectl ainsi que les différents raccourcis (po, rs, svc,..) ,comme ci-après, est bien pratique. Toutefois, nous gardons les commandes en entier pour plus de clarté.

Vérifions la création du Replicaset associé à notre déploiement :

Ainsi que l’objet deployment :

et notre service :

et notre Ingress :

L’application est maintenant accessible depuis l’extérieur et le Traefik Ingress gère son accès. A noter également la configuration minimaliste en https :

Un loopcurl sur l’application montre que le load balancing sur les 3 replicas :

Essayons maintenant de scaler horizontalement notre application en augmentant le nombre de réplicas à 10 :

Maintenant la charge est répartie sur 10 replicas :

Comme le montre un nouveau loop curl :

k3d

Comme k3s consiste à un seul processus, il est tout à fait possible de le dockeriser. D’où l’émergence d’un nouvel outil k3d. Son installation est assez simple en ligne de commande :

Une fois installé, la commande k3d est disponible :

La création d’un cluster revient simplement à lancer la commande k3d :

Conclusion

K3s offre une alternative assez simple à appréhender pour mettre en place un cluster kubernetes. Son utilisation est bien adaptée non seulement pour des besoins de développement en local mais également pour la production sur des environnement à ressources limitées.K3s offre une alternative assez simple à appréhender pour mettre en place un cluster kubernetes. Son utilisation est bien adaptée non seulement pour des besoins de développement en local mais également pour la production sur des environnement à ressources limitées.