Cuando empezamos a mirar la documentación sobre la instalación de Kubernetes, lo primero que nos encontramos es con la necesidad de instalar un runtime para que Kubernetes haga su magia.

En la documentación, no ofrecen tres runtimes diferentes: docker, cri-o y containerd, en mi caso he instalado cri-o, pero podéis instalar containerd, qué se basa en el mismo principio por el cual escribo este post.

Porque no usar docker como runtime de kubernetes

En primer lugar por el performance, si realmente es una prueba lo que dará menos problemas en la instalación será poner docker, pero si ya es una instalación «mas sería», lo ideal es coger solo la parte que lanza los contenedores y no todos los servicios extras, haciendo que Kubernetes no tenga unos servicios que levantar que ni siquiera usa.

Si vemos la imagen anterior, eso sería lo que instalamos y utiliza Kubernetes para lanzar los contenedores si instalamos docker, los servicios externos como es el networking, volumes, los levantará conjuntamente con el runtime y esto es una tontería ya que Kubernetes lo gestiona aisladamente sin usar estos servicios.

Por ese motivo, lo razonable es sólo tener el runtime: como cri-o o containerd, de esta manera nos quitamos todo el overhead y ruido que generan estos servicios que en realidad no usaremos.

 #!/bin/bash

sudo modprobe overlay
sudo modprobe br_netfilter

cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

sudo sysctl --system

cat <<EOF | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list
deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_20.04/ /
EOF
cat <<EOF | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable:cri-o:1.18.list
deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/1.18/xUbuntu_20.04/ /
EOF

curl -L https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable:cri-o:1.18/xUbuntu_20.04/Release.key | sudo apt-key --keyring /etc/apt/trusted.gpg.d/libcontainers.gpg add -
curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_20.04/Release.key | sudo apt-key --keyring /etc/apt/trusted.gpg.d/libcontainers.gpg add -

sudo apt-get update
sudo apt-get install cri-o cri-o-runc ipvsadm

echo 'KUBELET_EXTRA_ARGS=--cgroup-driver=systemd --container-runtime=remote --container-runtime-endpoint="unix:///var/run/crio/crio.sock"' > /etc/default/kubelet

sudo systemctl daemon-reload
sudo systemctl enable crio
sudo systemctl start crio

Este que veis aquí arriba es el script que he usado para lanzar y montar mis nodos de Kubernetes

Consideraciones

Si seguís la guia hay cosas que no menciona y me gustaría comentar.

Después de hacer la instalación, os recomiendo que añadáis que nuestro servidor inicie el modulo br_netfilter. Si no lo iniciará al reiniciar nuestro servidor/máquina, nos dará un erro de ip tables.

cat <<EOF > /etc/modules-load.d/k8s.conf
br_netfilter
EOF

Por otro lado tenéis que buscar que version y sistema operativo del cual queréis bajaros la imagen

cat <<EOF | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list
deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_20.04/ /
EOF
cat <<EOF | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable:cri-o:1.18.list
deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/1.18/xUbuntu_20.04/ /
EOF

En mi caso, utilicé la version 1.18 y el sistema operativo xUbuntu_20.04. Si tenéis dudas o queréis ver la lista podéis entrar en: https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable

Por otro lado, también instalo el paquete ipvsadm, como mera utilidad si tengo que resetear el master/node y limpiar la tabla.

Para terminar le añadimos parámetros extras a kubelet

echo 'KUBELET_EXTRA_ARGS=--cgroup-driver=systemd --container-runtime=remote --container-runtime-endpoint="unix:///var/run/crio/crio.sock"' > /etc/default/kubelet

Realmente, esta parte no es muy necesaria si habéis seguido los pasos anteriores.

Espero que sea de utilidad, para cualquier cosa no dudéis contactar conmigo

Deja una respuesta