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