Installer k3OS
Découvrons ensemble K3OS, une distribution sous Alpine Linux et basé sur K3s de Rancher Labs.
Au sommaire :
- 1-Qu'est-ce que k3OS ?
- 2-Prérequis
- 3-Installation
- 4-Accéder au cluster de l'extérieur
1-Qu'est-ce que K3OS ?
K3OS est un système Linux basé sur Alpine conçu pour les appareils basses consommation de type IOT, Edge Computing et processeurs ARM.
Contrairement à ce que l'on pourrait penser, ce n'est pas un système immuable comme pourrait l'être Talos Linux mais un système minimaliste comportant le strict minimum pour faire fonctionner un cluster k3S (voir mon tutoriel à ce sujet).
Pour la petite histoire, c'est la deuxième tentative de Rancher dans l'univers des systèmes minimalistes. Ils ont déjà tenter le coup avec RancherOS entre 2015 et 2021, un système entièrement basé sur Docker.
Voici quelques unes de ses caractéristiques de K3OS :
- Installation rapide.
- kubectl pré installé.
- Démarrage en moins de 10 secondes.
- Compatible cloud-init.
- Qemu-guest-agent installé d'office.
Les deux dernières caractéristiques sont intéressantes car Proxmox VE propose de configurer les machines virtuelles avec cloud-init et le paquet "qemu-guest-agent" est très utile pour remonter certaine informations (adresse MAC, adresse IP) ainsi que pour éteindre, allumer et redémarrer le système via Proxmox VE.
De plus, c'est le genre de distribution parfaitement calibrée pour Pimox, le portage de Proxmox VE pour processeurs ARM.
2-Prérequis
Il vous faudra une machine virtuelle sous Ubuntu Server 22.04 LTS.
Voici le guide pour ceux qui veulent repartir de zéro.
Si vous voulez gagner du temps, utilisez un template cloud-init.
Optionnel mais si vous avez une instance Pi-Hole à domicile et que Unbound est activé, pensez à ajouter les entrées DNS pour vos nœuds K3OS, cela vous évitera d'indiquer les adresses IP.
3-Installation
Créer une machine virtuelle
Récupérez la dernière version de l'ISO sur Github (v0.21.5-k3s2r1 au moment où j'écris) : https://github.com/rancher/k3os/releases/download/v0.21.5-k3s2r1/k3os-amd64.iso
Ou allez sur le terminal de PVE à la racine du dossier contenant vos ISO et téléchargez le avec ce lien et la commande "wget" :
wget https://github.com/rancher/k3os/releases/download/v0.21.5-k3s2r1/k3os-amd64.iso
Puis commencez par créer une machine virtuelle vierge en suivant mes instructions.
General
- Choisissez un VMID disponible et un nom
OS
- Storage : Sélectionnez l'image ISO de k3OS.
- Guest OS : laissez par défaut.
System
Laissez tout par défaut et activez Qemu Agent.
Disks
Laissez tout par défaut et cochez deux options :
- SSD emulation : indique à l'OS qu'il démarre sur un SSD et non sur un disque rotatif,
- Discard : active le TRIM.
CPU
- Cores: 2 cores sont suffisants.
Memory
- Mémory : laissez par défaut.
Network
Laissez tout par défaut.
Vérifiez que tout est correct puis finalisez la création de la machine virtuelle.
Configuration de cloud-init
On souhaite accéder à K3OS via une connexion SSH. Pour cela, cloud-init est parfait car Proxmox VE le gére nativement.
Je me suis aider de ce tutoriel pour le coup.
Il y a également la possibilité d'aller plus loin avec le fichier "config.yml" mais on en parlera dans un prochain tutoriel histoire de pousser la configuration beaucoup plus loin.
Ajoutez un lecteur cloud-init à votre machine virtuelle.
Ensuite, indiquez les informations suivantes :
- User : indiquez rancher (k3OS n'accepte pas d'autres utilisateurs)
- Password : n'indiquez aucun mot de passe
- DNS domain/servers : laissez par défaut
- SSH public key : ajoutez votre clé SSH
- IP Config (net0) : n'indiquez rien
Démarrez la machine virtuelle et sélectionnez la première option.
Identifiez-vous avec le nom d'utilisateur "rancher".
Note : clavier configuré en QWERTY donc faites gaffe!!!
Ensuite, créez un dossier "cd" à la racine du dossier utilisateur "/home/rancher".
mkdir cd
Puis, montez le lecteur cloud-init "/dev/cdrom" dans le dossier nouvellement créer.
sudo mount /dev/cdrom /home/rancher/cd
Le fichier qui nous intéresse est "user-data" qui contient entres autre la clé SSH.
Enfin, lancez la procédure d'installation de k3OS.
sudo k3os install
- Sélectionnez l'option "1" (Install to disk) pour installer k3OS sur le disque
- Indiquez le chemin du fichier "user-data" qui se trouve dans "/home/rancher/cd/user-data"
- Validez par "y" pour installer k3OS sur le disque
L'installation sera extrêmement rapide et le système va redémarrer au bout de quelques secondes.
Au démarrage, choisissez la première option.
Enfin, connectez-vous en SSH à votre instance et BINGO, ça devrait fonctionner.
Trois petits bémol :
- Le mot de passe ajouté dans cloud-init ne semble pas pris en compte par k3OS
- On récupère une adresse IP du serveur DHCP, impossible de configurer une IP statique à partir de cloud-init
- qemu-guest-agent est installé mais semble insensible aux appels de commande de PVE
Ajouter une adresse IP statique
En faisant des recherches, Zwindler indique dans son article comment ajouter une adresse IP statique à K3OS.
Vu que je connais pas encore Alpine Linux, c'est l'occasion de s'y mettre.
Tapez la commande suivante pour trouver la carte réseau.
sudo connmanctl services
Affichez ensuite la configuratio par défaut.
sudo connmanctl services ethernet_5abc0be616d4_cable
Dans "Nameservers", l'adresse IP 192.168.0.12 correspond au serveur DNS Unbound de mon serveur Pi-hole (pas de 8.8.8.8 chez moi, non mais).
Enfin, tapez la commande suivante pour configurer la carte réseau de K3OS :
- connmanctl : l'appel de commande pour gérer les interfaces réseaux
- config <card_name> : on indique qu'on souhaite configurer la carte réseau en indiquant son nom
- --ipv4 manual : on indique une adresse IP statique (192.168.0.119), le masque de sous réseau (255.255.255.0) et la passerelle (192.168.0.254)
- nameservers : l'adresse IP du serveur DNS (192.168.0.12, mon serveur domestique mais cela peut-être 8.8.8.8 ou 1.1.1.1)
sudo connmanctl config ethernet_5abc0be616d4_cable --ipv4 manual 192.168.0.119 255.255.255.0 192.168.0.254 --nameservers 192.168.0.12
Vous serez déconnecté. Il vous faudra vous connecté avec la nouvelle adresse IP.
BINGO!!!! Ça fonctionne!!!!
Revers de la médaille, c'est pas très "clé en main" pour le coup.
hostname: master
ssh_authorized_keys:
- ssh-rsa YOUR_PUBLIC_SSH_KEY
write_files:
- path: /var/lib/connman/default.config
content: |-
[service_eth0]
Type=ethernet
IPv4=192.168.0.11/255.255.255.0/192.168.0.1
IPv6=off
Nameservers=8.8.8.8
k3os:
dns_nameservers:
- 8.8.8.8
ntp_servers:
- 0.us.pool.ntp.org
password: rancher
token: myclustersecret
k3s_args:
- server
- "--write-kubeconfig-mode"
- "644
hostname: node01
ssh_authorized_keys:
- ssh-rsa YOUR_PUBLIC_SSH_KEY
write_files:
- path: /var/lib/connman/default.config
content: |-
[service_eth0]
Type=ethernet
IPv4=192.168.0.12/255.255.255.0/192.168.0.1
IPv6=off
Nameservers=8.8.8.8
k3os:
server_url: https://192.168.0.11:6443
token: myclustersecret
dns_nameservers:
- 8.8.8.8
ntp_servers:
- 0.us.pool.ntp.org
password: rancher
4-Accéder au cluster de l'extérieur
Si vous souhaitez accéder à votre cluster de l'extérieur via un poste client, suivez la procédure suivante et ayez à disposition un poste sous Linux ou Windows avec WSL (Windows Subsystem for Linux) d'installé.
Avec la commande "curl", récupérez le binaire de kubectl.
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
Optionnel : vous pouvez également vérifier le checksum du binaire (c'est une bonne habitude à prendre en compte).
Récupérez le checksum.
curl -LO "https://dl.k8s.io/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl.sha256"
Et vérifiez si cela correspond.
echo "$(cat kubectl.sha256) kubectl" | sha256sum --check
Enfin, appliquez les droits 755 au fichier (lecture/écriture/exécution pour l'utilisateur root, lecture/écriture pour les personnes du groupe et les personnes extérieures).
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
À partir du noeud master, copiez le contenu du fichier "k3s.yaml" vers le le fichier config (home/<username>/.kube/config).
Puis eemplacez la valeur suivante.
server: https://127.0.0.1:6443
Par celle-ci
server: https://MASTER_IP:6443
Enfin, changez la permission du fichier.
chmod 0400 ~/.kube/config
Tapez la commande suivante pour tester la connexion au cluster
kubectl get nodes