Aller au contenu principal

Apprendre Kubernetes en montant un cluster K3s

Kubernetes et K3s sont devenus des termes essentiels dans nos domaines, en particulier dans celui de l'orchestration de conteneurs. Mais qu'est-ce que cela signifie réellement et pourquoi est-ce important pour ceux qui débutent dans l'informatique en nuage ou cherchent à optimiser leurs applications ?

Pour les petites équipes ou les environnements avec des ressources limitées, Kubernetes peut sembler intimidant ou surdimensionné. C'est là que K3s entre en scène. K3s est une distribution légère de Kubernetes. Elle a été spécialement conçue pour être rapide à installer, facile à gérer et moins gourmande en ressources, tout en offrant la plupart des fonctionnalités de Kubernetes. K3s est donc une solution idéale pour les débutants, les petits environnements, ou même pour ceux qui souhaitent expérimenter avec Kubernetes sans s'engager dans une installation plus lourde.

Pré-requis pour Installer K3s

Avant de plonger dans l'installation de K3s, il est important de s'assurer que vous disposez de l'environnement et des connaissances nécessaires. Cette section couvre les aspects essentiels pour préparer votre système et comprendre les bases de Kubernetes, ce qui est crucial pour une installation réussie et une gestion efficace de votre cluster K3s.

Configuration minimale requise

Pour installer et exécuter K3s de manière optimale, votre système doit répondre à certaines exigences. Voici les spécifications minimales recommandées :

  • Système d'exploitation : Une distribution Linux récente. K3s peut être installé sur la plupart des distributions Linux, mais les versions courantes comme Ubuntu, Debian, ou CentOS sont recommandées pour une meilleure compatibilité et facilité d'utilisation.
  • Processeur : Un CPU moderne avec au moins 1 GHz de fréquence. Plus le CPU est puissant, meilleure sera la performance de votre cluster.
  • Mémoire : Au moins 512 Mo de RAM. Si vous prévoyez de déployer plusieurs applications ou services, une mémoire plus importante sera nécessaire.
  • Espace disque : Minimum 1 Go d'espace disque disponible. Cela dépendra de la taille et du nombre d'applications que vous envisagez de déployer.
  • Accès réseau : Une connexion Internet pour télécharger K3s et accéder aux images de conteneurs.

Comprendre les bases de Kubernetes

Avant d'installer K3s, il est crucial de comprendre certains concepts de base de Kubernetes. Même si K3s est simplifié, une compréhension de base des éléments suivants vous aidera à gérer votre cluster plus efficacement :

  • Pods : Les plus petites unités déployables dans un cluster Kubernetes. Un pod représente un ou plusieurs conteneurs qui doivent être hébergés ensemble.
  • Déploiements : Ils vous permettent de déclarer l'état souhaité pour vos pods. Kubernetes s'assure que l'état réel correspond à l'état souhaité.
  • Services : Un moyen d'exposer une application exécutée sur un ensemble de pods en tant que service réseau.

Plus d'infos sur cette documentation.

Installer K3S sur un seul Noeud

Prérequis :

  • Un serveur ou une machine virtuelle avec une distribution Linux (Ubuntu, CentOS, etc.).
  • Accès root ou privilèges sudo.

Mettez à jour votre système pour vous assurer que toutes les dépendances sont à jour.

sudo apt update && sudo apt upgrade -y # Pour les distributions basées sur Debian/Ubuntu
sudo yum update -y # Pour les distributions basées sur RedHat/CentOS

Exécutez la commande suivante pour installer K3s. Cette commande télécharge et installe K3s en tant que service sur votre système.

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

Après l'installation, vérifiez que K3s fonctionne correctement.

sudo cat /etc/rancher/k3s/k3s.yaml > ~/.kube/config
kubectl get node

NAME       STATUS   ROLES                  AGE    VERSION
internal   Ready    control-plane,master   7m1s   v1.28.4+k3s2

Cette commande devrait afficher votre nœud avec un statut Ready.

Installer K3S sur un cluster de VM Ubuntu

Pour cette démonstration, je vais utiliser une machine hôte Ubuntu sur laquelle je vais provisionner 3 VM (1 master + 2 workers) avec vagrant et libvirt.

En premier lieu, il faut installer vagrant et ansible. Je vous renvoie à mes billets d'introduction sur vagrant et ansible pour cela.

Il faut ensuite cloner mon projet :

git clone git@github.com:stephrobert/k3sSandbox.git

Il faut aussi créer le certificat racine avec mkcert. Vous devriez retrouver dans le répertoire ~/.local/share/mkcert/ les fichiers suivants :

-r-------- 1 bob bob 2,5K déc.   1 13:56 rootCA-key.pem
-rw-r--r-- 1 bob bob 1,6K déc.   1 13:56 rootCA.pem

Ensuite provisionnons nos 3 VM (pour le serveur plus sage de mettre 1GB de Ram) :

vagrant up

Installons k3s sur tous les nodes :

vagrant push

Au bout de quelques minutes, vous devriez avoir accès à votre cluster k3s.

Un petit contrôle de l’état des nodes du cluster :

vagrant ssh master1
kubectl get nodes
NAME      STATUS   ROLES                  AGE   VERSION
master1   Ready    control-plane,master   46m   v1.27.9+k3s1
worker1   Ready    <none>                 46m   v1.27.9+k3s1
worker2   Ready    <none>                 46m   v1.27.9+k3s1

Maintenant, vous pouvez utiliser les commandes classiques de kubectl :

kubectl get pod -A
NAMESPACE     NAME                                     READY   STATUS      RESTARTS   AGE
kube-system   coredns-77ccd57875-s2v2s                 1/1     Running     0          7m34s
kube-system   local-path-provisioner-957fdf8bc-frvl4   1/1     Running     0          7m34s
kube-system   helm-install-traefik-crd-mvdfz           0/1     Completed   0          7m34s
kube-system   helm-install-traefik-d242g               0/1     Completed   1          7m34s
kube-system   svclb-traefik-d1243e35-rvcft             2/2     Running     0          7m10s
kube-system   traefik-768bdcdcdd-jzxkt                 1/1     Running     0          7m10s
kube-system   metrics-server-648b5df564-md7bk          1/1     Running     0          7m34s
kube-system   svclb-traefik-d1243e35-7gh5q             2/2     Running     0          2m45s
kube-system   svclb-traefik-d1243e35-6vr26             2/2     Running     0          2m35s
astuce

Le playbook créé aussi la config du cluster k3s dans votre répertoire ~/.kube sur le nom k3s ! Vous pouvez utiliser les commandes kubectl depuis votre machine.

Quelques explications sur le provisioning

Voici le fichier Vagrantfile :

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure(2) do |config|

  base_ip_str = "10.240.0.1"
  cpu_master = 1
  mem_master = 1792
  number_workers = 2 # Number of workers nodes kubernetes
  cpu_worker = 1
  mem_worker = 1024
  config.vm.box = "generic/ubuntu2204" # Image for all installations
  kubectl_version = "1.28.4-00"

  nodes = []
  (0..number_workers).each do |i|
    case i
      when 0
        nodes[i] = {
          "name" => "master#{i + 1}",
          "ip" => "#{base_ip_str}#{i}"
        }
      when 1..number_workers
        nodes[i] = {
          "name" => "worker#{i }",
          "ip" => "#{base_ip_str}#{i}"
        }
    end
  end

# Provision VM
  nodes.each do |node|
    config.vm.define node["name"] do |machine|
      machine.vm.hostname = node["name"]
      machine.vm.provider "libvirt" do |lv|
        if (node["name"] =~ /master/)
          lv.cpus = cpu_master
          lv.memory = mem_master
        else
          lv.cpus = cpu_worker
          lv.memory = mem_worker
        end
      end
      machine.vm.synced_folder '.', '/vagrant', disabled: true
      machine.vm.network "private_network", ip: node["ip"]
      machine.vm.provision "ansible" do |ansible|
        ansible.playbook = "provision.yml"
        ansible.groups = {
          "master" => ["master1"],
          "workers" => ["worker[1:#{number_workers}]"],
          "kubernetes:children" => ["masters", "workers"],
          "all:vars" => {
            "base_ip_str" => "#{base_ip_str}",
            "kubectl_version" => "#{kubectl_version}"
          }
        }
      end
    end
  end
  config.push.define "local-exec" do |push|
    push.inline = <<-SCRIPT
      ansible-playbook -i .vagrant/provisioners/ansible/inventory/vagrant_ansible_inventory master.yml
      ansible-playbook -i .vagrant/provisioners/ansible/inventory/vagrant_ansible_inventory slave.yml
    SCRIPT
  end
end

Après l'initialisation des variables et du tableau contenant tous les nodes, nous entrons dans une boucle each qui va permettre d'adapter la configuration des nodes en fonction des paramètres tirés du tableau node. Cela permet de configurer des nodes master et workers avec des ressources mem et cpu différentes.

Après cette boucle, nous retrouvons une commande que j'utilise pour la première fois. La commande push permet de lancer des scripts depuis le noeud local. Pourquoi avoir choisi cette option plutôt que de tout intégrer dans le playbook lancé dans la boucle. Tout simplement que dans la boucle les playbooks ne sont pas lancés une fois, mais à chaque fois qu'un node devient disponible. Du coup le playbook des workers nodes se lance avant même que le token du master soit créé. Cela a comme bénéfice de pouvoir simplifier l'écriture du playbook.

Gestion et surveillance

Une fois votre application "Hello World" déployée sur K3s, il est crucial de savoir comment gérer et surveiller votre cluster pour assurer son bon fonctionnement et sa sécurité. Ce chapitre vous fournira des conseils pratiques sur la surveillance de l'état de votre cluster et sur les procédures de mise à jour et de maintenance.

Surveillance de l'état du cluster

Surveiller l'état de votre cluster K3s est essentiel pour détecter et résoudre rapidement les problèmes qui pourraient survenir.

  1. Utilisez kubectl get nodes : Cette commande vous permet de voir l'état de tous les nœuds dans votre cluster. Un nœud en bon état sera marqué comme Ready.
  2. Surveillance des pods : La commande kubectl get pods vous donne des informations sur l'état de chaque pod dans votre cluster. Vous chercherez des états comme Running ou Completed et voudrez enquêter sur tout état comme Error ou CrashLoopBackOff.
  3. Logs : Les logs sont cruciaux pour le débogage. Utilisez kubectl logs [nom-du-pod] pour obtenir des logs détaillés d'un pod spécifique.
  4. Outils de surveillance externes : Envisagez d'utiliser des outils de surveillance tiers tels que Prometheus et Grafana pour une surveillance plus détaillée et des visualisations.

Mise à jour et maintenance

Garder votre cluster K3s à jour et bien entretenu est essentiel pour la sécurité et la performance.

  1. Mises à jour régulières : Suivez les annonces de nouvelles versions de K3s et planifiez les mises à jour pour bénéficier des dernières fonctionnalités et correctifs de sécurité.
  2. Stratégie de sauvegarde : Mettez en place une stratégie de sauvegarde régulière pour vos données de cluster. Cela inclut les configurations des applications et les données de cluster essentielles.
  3. Testez les mises à jour : Avant d'appliquer des mises à jour sur votre cluster en production, testez-les dans un environnement de staging pour vous assurer qu'elles ne perturbent pas vos applications.
  4. Documentation : Gardez une documentation à jour de votre architecture de cluster, de vos configurations et de vos procédures de maintenance. Cela est essentiel pour la résolution rapide des problèmes et la gestion des changements.

Déploiement de votre première application sur K3s

Maintenant que K3s est installé et prêt, il est temps de déployer une application. Pour les besoins de ce guide, nous allons déployer une simple application "Hello World".

Déployer l'application "Hello World" sur K3s

Je vous ai fourni dans le projet un fichier nommé helloworld.yaml :

apiVersion: apps/v1
kind: Deployment
metadata:
  name: helloworld
spec:
  selector:
    matchLabels:
      app: helloworld
  replicas: 1 # tells deployment to run 1 pods matching the template
  template: # create pods using pod definition in this template
    metadata:
      labels:
        app: helloworld
    spec:
      containers:
      - name: helloworld
        image: karthequian/helloworld:latest
        ports:
        - containerPort: 80

Déployons-le, depuis votre fenêtre de Terminal, tapez la commande suivante :

kubectl create -f helloworld.yaml
deployment.apps/helloworld created

Pour confirmer que les pods de votre application sont en cours d'exécution, tapez la commande suivante :

kubeclt get pods
NAME                          READY   STATUS    RESTARTS   AGE
helloworld-749bd5b4d7-4bmdp   1/1     Running   0          11s

Vous avez maintenant déployé avec succès une application "Hello World" sur K3s . Cette expérience vous donne une base pour explorer des déploiements plus complexes et gérer votre cluster K3s de manière plus efficace.

Sécurisation de votre cluster K3s

La sécurité est un aspect crucial dans la gestion d'un cluster Kubernetes, y compris K3s . Cette section aborde les meilleures pratiques de sécurité et comment mettre en œuvre des politiques efficaces pour protéger votre cluster.

Destruction des VM

Il suffit de lancer la commande :

vagrant destroy -f
==> worker2: Removing domain...
==> worker2: Deleting the machine folder
==> worker1: Removing domain...
==> worker1: Deleting the machine folder
==> master1: Removing domain...
==> master1: Deleting the machine folder

Et voilà.

Conclusion

Nous avons parcouru un chemin significatif dans l'exploration de K3s , depuis l'installation initiale jusqu'au déploiement d'une application. En déployant votre première application "Hello World", vous avez franchi une étape importante dans le monde de l'orchestration de conteneurs avec Kubernetes.

Plus d'infos

Pour approfondir vos connaissances et compétences sur K3s et Kubernetes, voici quelques ressources utiles :

N'oubliez pas que la pratique est la clé de la maîtrise de K3s . Expérimentez avec différents scénarios de déploiement, testez différentes configurations et explorez les nombreuses fonctionnalités que K3s a à offrir. Bonne continuation dans votre voyage avec K3s !