Criando Cluster com Kubeadm
Para criar um cluster com o kubeadm é um processo bastante simples.
Alguns requisitos são necessários para as máquinas.
Em ambiente de prova provavelmente não será necessário se atentar a isso, mas é bom conhecer para garantir.
Primeiro o swap e o firewall precisam estar desligados e alguns módulos carregados.
## Seguindo a documentação https://kubernetes.io/docs/setup/production-environment/
## https://docs.docker.com/engine/install/ubuntu/container-runtimes/
echo -e "\n##### Desativando o swap #####"
sudo sed -i '/swap/d' /etc/fstab
sudo swapoff -a
echo -e "\n##### Desativando o firewall #####"
sudo systemctl disable --now ufw >/dev/null 2>&1
echo -e "\n##### Ativando módulos do kernel necessários para o 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
# sysctl params required by setup, params persist across reboots
# Pode ser removido os ipv6 se não for 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
# Apply sysctl params without reboot
sudo sysctl --system
#sudo mkdir -p /var/lib/kubernetes/
Depois é necessário que as máquinas tenham um container runtime instalado assim como o kubeadm kubelet e kubectl. O containerd já está no repositório do Kubernetes.
echo -e "\n##### Instalando Container Runtime Interface #####"
echo -e "\n##### 1 - Adicionando o repositório do kubernetes #####"
sudo mkdir -p /etc/apt/keyrings
# A última versão pode ser consultada no link https://dl.k8s.io/release/stable.txt. O valor exemplo seria 1.29.3 mas só precisamos de 1.29. Para facilitar temos o comando abaixo.
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
# Esse seria um exemplo para uma versão específica do 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 os pacotes #####"
sudo apt update
sudo apt install -y containerd ipvsadm ipset
echo -e "\n##### 3 - Ativando o systemd Cgroups no 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
# Depois que temos o container runtime instalado podemos colocar o kubeadm kubelet e 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
Geralmente esse processo todo não deve ser pedido durante a prova, mas se for é bom conhecer.
O kubeadm verifica se o node atende os requisitos. É necessário 2 GiB ou mais de RAM e pelo menos 2 CPUs nas máquinas control-plane. Isso pode ser ignorado no comando que vamos executar. No exame se isso for pedido eles talvez não disponibilizem máquinas com esse recurso, afinal não é um ambiente produtivo.
Uma vez que tenhamos disponível no node master o kubeadm kubectl e kubelet podemos executar
# Para facilitar o comando é bom executar um completion
source <(kubeadm completion bash)
# Se não for passada a versão ele irá instalar a ultima disponível para o kubeadm especificado. Podemos fazer uma verificação do que temos disponível no kubeadm antes de instalar.
# Para ver as versões podemos usar baseado na versão instalada
apt-cache madison kubeadm
# Aqui estamos montando 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
No caso dos workers todo o bootstrap é igual, mas comando do kubeadm será o join fornecido pelo comando kubeadm init
Caso tenha perdido o comando join na saída do kubeadm no control-plane podemos gerar outro.
controlplane $ kubeadm token create --print-join-command
#kubeadm join 172.30.1.2:6443 --token i80ben.9k3mlcpc0flghkny --discovery-token-ca-cert-hash sha256:190ba21620d6cd0fa70a014fa5c7f66e48055885cd844eba55d85a4eac0bb8aa