Статья опирается на официальную документации, ссылка — https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/high-availability/
Но чтобы упростить установку собрал команды и оформил из них скрипт, который нужно запустить на всех нодах кластера:
#!/bin/bash
apt update
apt install -y apt-transport-https ca-certificates curl gnupg2
mkdir /etc/apt/keyrings/
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
apt update
apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl
wget https://github.com/containerd/containerd/releases/download/v1.7.0/containerd-1.7.0-linux-amd64.tar.gz
tar Cxzvf /usr/local containerd-1.7.0-linux-amd64.tar.gz
wget https://raw.githubusercontent.com/containerd/containerd/main/containerd.service
mkdir /usr/local/lib/systemd
mkdir /usr/local/lib/systemd/system
mv containerd.service /usr/local/lib/systemd/system/
rm containerd-1.7.0-linux-amd64.tar.gz
systemctl daemon-reload
systemctl enable --now containerd
wget https://github.com/opencontainers/runc/releases/download/v1.1.7/runc.amd64
install -m 755 runc.amd64 /usr/local/sbin/runc
rm runc.amd64
wget https://github.com/containernetworking/plugins/releases/download/v1.2.0/cni-plugins-linux-amd64-v1.2.0.tgz
mkdir -p /opt/cni/bin
tar Cxzvf /opt/cni/bin cni-plugins-linux-amd64-v1.2.0.tgz
rm cni-plugins-linux-amd64-v1.2.0.tgz
echo br_netfilter > /etc/modules-load.d/br_netfilter.conf
systemctl restart systemd-modules-load.service
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
echo 1 > /proc/sys/net/bridge/bridge-nf-call-ip6tables
sed -i '/net.ipv4.ip_forward=1/s/^#//g' /etc/sysctl.conf
sysctl -p
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
sed -i -r "s/SystemdCgroup.+$/SystemdCgroup = true/g" /etc/containerd/config.toml
systemctl restart containerd
После запуска скрипта на первой мастер ноде (control-plane) запускаем инициализацию кубера:
kubeadm init --control-plane-endpoint "сервер:порт" --upload-certs
Тут стоит уточнить по адресу сервера в строке выше. Лучше заранее настроить haproxy+keepalived на мастер ноды и при инициализации указывать адрес сервера haproxy.
В выводе копируем команды для добавления мастер нод (control-plan) и воркер нод.
Настраиваем управление кластером через kubectl. Для этого копируем данные для входя из файла /etc/kubernetes/admin.conf себе на компьютер в файл .kube/config
Далее устанавливаем calico.
curl https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml -O
kubectl apply -f calico.yaml
Далее разворачиваем остальные ноды.
Также стоит учитывать, что сертификаты для добавления мастер нод протухают через 2 часа. Если нужно добавить мастер ноду после истечения 2 часов нужно запустить команду kubeadm init phase upload-certs —upload-certs на любой из уже настроенных мастер нод.