Kubernetes : flatcar worker node
Bonjour,
Aujourd'hui, un billet rapide sur l'ajout d'un node worker mais avec l'OS Flatcar.
Context : cluster avec 1 master et 2 workers le tout sous Ubuntu 22.
L'installation se fait via un iso et un fichier de configuration spécifique à Flatcar.
Boot via PXE :
LABEL Flatcar
MENU LABEL Flatcar
KERNEL memdisk
APPEND iso
INITRD http://deploy.adm.securmail.fr/images/flatcar/flatcar_production_iso_image.iso
Il faut ensuite générer une commande pour join le nouveau node au cluster existant :
kubeadm token create --print-join-command
kubeadm join k8s-master.adm.securmail.fr:6443 --token veXXXXXXXXXXXXX --discovery-token-ca-cert-hash sha256:acaXXXXXXXXXXXXX
Avant de pouvoir faire l'installation, il faut créer le fichier d'installation en langage butane qu'il faudra convertir en langage ignition (du json).
Exemple :
variant: flatcar
version: 1.0.0
passwd:
users:
- name: monuser
ssh_authorized_keys:
- ssh-rsa AAAAB3NzaC1yc2CCCCCCCCCCCCCCC
groups: [ sudo, docker ]
storage:
links:
- target: /opt/extensions/kubernetes/kubernetes-v1.30.1-x86-64.raw
path: /etc/extensions/kubernetes.raw
hard: false
files:
- path: /etc/hostname
contents:
inline: |
flc-node1.adm.securmail.fr
- path: /etc/systemd/network/00-eth0.network
contents:
inline: |
[Match]
Name=eth0
[Network]
Address=192.168.0.34/24
Address=2a0e:f41:0:3::19/64
Gateway=192.168.0.21
DNS=192.168.0.21
DNS=2a0e:f41:0:3::1
[Route]
Metric=1024
Destination=::/0
Gateway=2a0e:f41:0:3::1
GatewayOnLink=yes
- path: /etc/sysupdate.kubernetes.d/kubernetes.conf
contents:
source: https://github.com/flatcar/sysext-bakery/releases/download/latest/kubernetes.conf
- path: /etc/sysupdate.d/noop.conf
contents:
source: https://github.com/flatcar/sysext-bakery/releases/download/latest/noop.conf
- path: /opt/extensions/kubernetes/kubernetes-v1.30.1-x86-64.raw
contents:
source: https://github.com/flatcar/sysext-bakery/releases/download/latest/kubernetes-v1.30.1-x86-64.raw
systemd:
units:
- name: systemd-sysupdate.timer
enabled: true
- name: systemd-sysupdate.service
dropins:
- name: kubernetes.conf
contents: |
[Service]
ExecStartPre=/usr/bin/sh -c "readlink --canonicalize /etc/extensions/kubernetes.raw > /tmp/kubernetes"
ExecStartPre=/usr/lib/systemd/systemd-sysupdate -C kubernetes update
ExecStartPost=/usr/bin/sh -c "readlink --canonicalize /etc/extensions/kubernetes.raw > /tmp/kubernetes-new"
ExecStartPost=/usr/bin/sh -c "[[ $(cat /tmp/kubernetes) != $(cat /tmp/kubernetes-new) ]] && touch /run/reboot-required"
- name: kubeadm.service
enabled: true
contents: |
[Unit]
Description=Kubeadm service
Requires=containerd.service
After=containerd.service
[Service]
ExecStart=/usr/bin/kubeadm join XXXXXXXXXXXX
[Install]
WantedBy=multi-user.target
Il faut penser à remplacer la commande kubeadm join avec celle générée juste avant.
Avec cette configuration on a :
- le réseau configuré en dual stack
- un compte utilisable uniquement en ssh mais sans password
- installation de la stack kubernetes : kubeadm, kubelet, containerd etc
- intégration automatique au cluster existant
Convertion du fichier de configuration via docker :
cat flatcar.bu | docker run --rm -i quay.io/coreos/butane:latest > ignition.json
Il faut ensuite exposer ce fichier pour le récupérer côté VM flatcar.
Une fois la VM démarrée :
curl -LO http://deploy.adm.securmail.fr/preseed/ignition.json > ignition.json
sudo flatcar-install -d /dev/vda -i ignition.json
Une fois l'installation terminée, reboot de la VM :
sudo reboot -i
Après le reboot, le node est intégré au cluster :
kubectl get nodes
NAME STATUS ROLES AGE VERSION
flc-node1.adm.securmail.fr Ready <none> 14m v1.27.6
k8s-master.adm.securmail.fr Ready control-plane 191d v1.27.6
k8s-node1.adm.securmail.fr Ready <none> 191d v1.27.6
k8s-node2.adm.securmail.fr Ready <none> 191d v1.27.6
Tous les pods nécessairs (kured, zabbix, etc) seront créés dessus automatiquement.
Have fun.