Instalando K0s en un cluster de Raspberry Pi 4

Estoy instalando un cluster de kubernetes en 3 raspberrys v4 con 8GB de RAM que compré para hacer algo así.

El despliegue con Ansible

Siguiendo la guía que está en la página de la documentación https://docs.k0sproject.io/v1.22.4+k0s.1/raspberry-pi4/ he creado el siguiente playbook de ansible para poder hacerlo de una vez y añadir nuevos nodos si se da el caso o repetirlo todo rápidamente si rompo algo por lo que sea.

---
  - hosts: all
    become: yes
    become_user: root

    tasks:
    
      - name: apt-python es requerimiento básico
        package:
          name: python-apt
          state: present
      - name: apt update
        apt: update_cache=yes
      - name: apt upgrade
        apt: upgrade=full
      - name: apt autoremove
        apt: autoremove=yes
      - name: apt autoclean
        apt: autoclean=yes

      - name: Instala cgroups
        apt:
          name:
            - cgroup-lite
            - cgroup-tools
            - cgroupfs-mount
          state: latest

      - name: añade los cgroups
        lineinfile:
          path: /boot/firmware/cmdline.txt
          backrefs: yes
          regexp: "^(.*console.*)$"
          line: '\1 cgroup_enable=cpuset cgroup_enable=memory cgroup_memory=1'
        notify:
          - reboot

      - name: añade los cgroups
        lineinfile:
          path: /etc/modules-load.d/modules.conf
          line: "{{ item }}"
        with_items:
             - overlay
             - nf_conntrack
             - br_netfilter

      - name: swap
        shell:
          cmd: fallocate -l 2G /swapfile && chmod 0600 /swapfile && mkswap /swapfile && swapon -a
        notify:
          - reboot


      - name: instala k0s
        shell: curl -sSLf https://get.k0s.sh | sudo sh

      - name: 
        shell: k0s version

    handlers:
      - name: reboot
        reboot:
          msg: "Reiniciando desde Ansible"
          connect_timeout: 5
          reboot_timeout: 600
          pre_reboot_delay: 0
          post_reboot_delay: 30
          test_command: whoami

Inicializando el controlador

Después de esto entramos a uno de los tres nodos y lo nombramos controlador.

sudo k0s install controller

Esto crea la unidad de systemD y lo deja listo para arrancar en principio.

PERO una cosa que he descubierto que no está en la guía es que ETCD no está completamente soportado para arquitectura arm64, entonces hay que añadir la variable: Environment=“ETCD_UNSUPPORTED_ARCH=arm64” a la propia unidad de systemd o de lo contrario no arranca. Tal que así:

[Unit]
Description=k0s - Zero Friction Kubernetes
Documentation=https://docs.k0sproject.io
ConditionFileIsExecutable=/usr/local/bin/k0s

After=network-online.target 
Wants=network-online.target 

[Service]
Environment="ETCD_UNSUPPORTED_ARCH=arm64"
StartLimitInterval=5
StartLimitBurst=10
ExecStart=/usr/local/bin/k0s controller

RestartSec=120
Delegate=yes
KillMode=process
LimitCORE=infinity
TasksMax=infinity
TimeoutStartSec=0
LimitNOFILE=999999
Restart=always

[Install]
WantedBy=multi-user.target

Ahora ya está listo el controlador para

sudo k0s start

Y podemos consultar el estado con systemctl status k0scontroller o k0s status

Levantando los workers

Creamos un token por cada nodo en el controlador k0s token create --role worker

En los nodos, uno por uno y utilizando siempre tokens diferentes:

TOKEN_WORKER=H4sIAAAAAAAC/2xV3Y6jPBa876fIC/R8NiTZSaS9+EjspElwxsbHBt8RzDTBQGhC54fVvvuqMzPSrrR3x6dKVbZln3rJupMq+svp3C4nV/yS15+Xoegvy5fXye96+TKZTCaXor8W/XJSDkN3Wf71F1543/D8+zfvG/Zmy/l06j9pedEPp5+nPBuK1+xzKM/9aXi82mzIlpN9jIZ9jFcCbChPwVqoEGIwIUcUxBNDw8rhMAYRCMLWXKvOIOrHEAYG1Ups3cxSmnGPXoUKA6bpwzZiKNaqZFRNY1CtRUJo6PZH3IXZ1lTSUSHgtuM1DSyyRCjLeE23XFIlgE4lzMoIm07X5c6qLoXmXhWSfmglAgPGj7Y1U0TNJIi2IJhIqZggYSna/Fa8d38w89+YhLAtiPngSq0MmmnuKFNEJHZ+CdrtdBVGcmQnDeHcVnBLXfe2R9Ydt6rKVXDleoj1psayuXsxqBM7LUa5Zb1EFy9yWOcJS6Lk793OYyBU3f6QaPd7NlPp+DtHKlak3sTAAkXgOZf3/PzPl8mkzZpiOXHo8pKf26G4D7+C4lf9Kyj+pMaT9dX4vDxXn8eiLobX4/k8XIY+6/5X7bPvi3Z4/aP0bLpTa5eT1bn9eXp/6friZ9EXbV5clpN//fvlS/Vp/lvk/8g/jZ9bGM6uaJeTvLy4fyy+fW/b9+yMprZufn7/fkIv/wkAAP//7yMXCwUHAAA=

mkdir -p /var/lib/k0s/
echo $TOKEN_WORKER > /var/lib/k0s/join-token
k0s install worker --token-file /var/lib/k0s/join-token

NOTA: se me ha dado un problema puntual en un worker me daba el error “certificate is valid for 127.0.0.1, 127.0.0.1, 10.96. 0.1, not 192.168…” Lo he solucionado haciendo un k0s reset del worker y reiniciando el controlador (no sé si hubiera funcionado igualmente sin hacer esto último, por si acaso aquí lo dejo escrito).

Y así queda, todo up and running

ubuntu@r4-01:~$ sudo k0s kc get pods --all-namespaces
NAMESPACE     NAME                              READY   STATUS    RESTARTS   AGE
kube-system   coredns-5ccbdcc4c4-mhpd2          1/1     Running   0          97m
kube-system   coredns-5ccbdcc4c4-pcw2m          1/1     Running   0          4m21s
kube-system   konnectivity-agent-l5dz5          1/1     Running   0          2m55s
kube-system   konnectivity-agent-mv9r7          1/1     Running   0          7m38s
kube-system   kube-proxy-4nmnf                  1/1     Running   0          9m42s
kube-system   kube-proxy-wf4zd                  1/1     Running   0          4m36s
kube-system   kube-router-wvvfg                 1/1     Running   0          9m42s
kube-system   kube-router-xqpzt                 1/1     Running   0          4m36s
kube-system   metrics-server-6bd95db5f4-n9rct   1/1     Running   0          97m

ubuntu@r4-01:~$ sudo k0s kc get nodes
NAME             STATUS   ROLES    AGE   VERSION
r4-02.vdr8.lan   Ready    <none>   12m   v1.22.2+k0s
r4-03.vdr8.lan   Ready    <none>   7m    v1.22.2+k0s