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.