Skip to main content

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