Creando Cluster con Kubeadm
Crear un cluster con kubeadm es un proceso bastante simple.
Algunos requisitos son necesarios para las máquinas.
En ambiente de examen probablemente no será necesario prestar atención a esto, pero es bueno conocerlo para garantizar el correcto funcionamiento.
Primero el swap y el firewall necesitan estar desactivados y algunos módulos cargados.
## Siguiendo la documentación https://kubernetes.io/docs/setup/production-environment/
## https://docs.docker.com/engine/install/ubuntu/container-runtimes/
echo -e "\n##### Desactivando el swap #####"
sudo sed -i '/swap/d' /etc/fstab
sudo swapoff -a
echo -e "\n##### Desactivando el firewall #####"
sudo systemctl disable --now ufw >/dev/null 2>&1
echo -e "\n##### Activando módulos del kernel necesarios para containerd #####"
cat <<EOF >> /etc/modules
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
br_netfilter
nf_conntrack
EOF
systemctl restart systemd-modules-load.service
# parámetros sysctl requeridos por la configuración, los parámetros persisten después de reinicios
# Puede ser removido ipv6 si no se va a usar
cat <<EOF | sudo tee /etc/sysctl.d/10-kubernetes.conf
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
net.bridge.bridge-nf-call-iptables=1
net.ipv4.ip_forward=1
EOF
# Aplicar parámetros sysctl sin reiniciar
sudo sysctl --system
#sudo mkdir -p /var/lib/kubernetes/
Después es necesario que las máquinas tengan un container runtime instalado así como kubeadm kubelet y kubectl. El containerd ya está en el repositorio de Kubernetes.
echo -e "\n##### Instalando Container Runtime Interface #####"
echo -e "\n##### 1 - Agregando el repositorio de kubernetes #####"
sudo mkdir -p /etc/apt/keyrings
# La última versión puede ser consultada en el enlace https://dl.k8s.io/release/stable.txt. El valor ejemplo sería 1.29.3 pero solo necesitamos 1.29. Para facilitar tenemos el comando abajo.
KUBE_LATEST=$(curl -L -s https://dl.k8s.io/release/stable.txt | awk 'BEGIN { FS="." } { printf "%s.%s", $1, $2 }')
curl -fsSL https://pkgs.k8s.io/core:/stable:/${KUBE_LATEST}/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/${KUBE_LATEST}/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list
# Este sería un ejemplo para una versión específica de kubernetes
#curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
# echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list
echo -e "\n##### 2 - Instalando los paquetes #####"
sudo apt update
sudo apt install -y containerd ipvsadm ipset
echo -e "\n##### 3 - Activando systemd Cgroups en containerd #####"
sudo cp /etc/containerd/config.toml /etc/containerd/config.toml.default
containerd config default | sed 's/SystemdCgroup = false/SystemdCgroup = true/' | sudo tee /etc/containerd/config.toml
sudo systemctl restart containerd.service
systemctl status containerd.service
# Después de tener el container runtime instalado podemos instalar kubeadm kubelet y kubectl
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
sudo systemctl enable kubelet
sudo systemctl status kubelet
Generalmente todo este proceso no debe ser pedido durante el examen, pero si lo es, es bueno conocerlo.
El kubeadm verifica si el nodo cumple con los requisitos. Es necesario 2 GiB o más de RAM y al menos 2 CPUs en las máquinas control-plane. Esto puede ser ignorado en el comando que vamos a ejecutar. En el examen si esto es solicitado, es posible que no proporcionen máquinas con este recurso, ya que no es un ambiente productivo.
Una vez que tengamos disponible en el nodo master el kubeadm kubectl y kubelet podemos ejecutar:
# Para facilitar el comando es bueno ejecutar un completion
source <(kubeadm completion bash)
# Si no se pasa la versión, instalará la última disponible para el kubeadm especificado. Podemos hacer una verificación de lo que tenemos disponible en kubeadm antes de instalar.
# Para ver las versiones podemos usar basado en la versión instalada
apt-cache madison kubeadm
# Aquí estamos montando el control plane.
kubeadm init --kubernetes-version=1.29.0 --pod-network-cidr 192.168.0.0/16 --ignore-preflight-errors=NumCPU --ignore-preflight-errors=Mem
En el caso de los workers todo el bootstrap es igual, pero el comando de kubeadm será el join proporcionado por el comando kubeadm init.
En caso de haber perdido el comando join en la salida del kubeadm en el control-plane podemos generar otro.
controlplane $ kubeadm token create --print-join-command
#kubeadm join 172.30.1.2:6443 --token i80ben.9k3mlcpc0flghkny --discovery-token-ca-cert-hash sha256:190ba21620d6cd0fa70a014fa5c7f66e48055885cd844eba55d85a4eac0bb8aa