Инструкция по установке и первичной настройка Kubernetes HA кластера на базе Ubuntu 24.04
Описание инфраструктуры
Кластер состоит из:
3 Control-plane нодыmaster1 192.168.0.101
master2 192.168.0.102
master3 192.168.0.103
Haproxy (балансировщик)haproxy 192.168.0.100
3 Worker-нодыworker1 192.168.0.104
worker2 192.168.0.105
worker3 192.168.0.106
NFS-сервер (для PV)nfs 192.168.0.110
CNI-плагин: Flannel
ОС: Ubuntu 24.04
Виртуализация: KVM
Ресурсы для нод
| Роль | CPU | RAM | Disk |
|---|---|---|---|
| Control-plane | 2 | 2GB | 30GB |
| Worker | 2 | 2GB | 50GB |
Настройка /etc/hosts на всех нодах
Открой файл /etc/hosts и добавь следующие строки:
127.0.0.1 localhost
127.0.1.1 master1
192.168.0.100 haproxy
192.168.0.101 master1
192.168.0.102 master2
192.168.0.103 master3
192.168.0.104 worker1
192.168.0.105 worker2
192.168.0.106 worker3
192.168.0.110 nfs
Отключение swap
Swap должен быть отключён, иначе kubelet не запустится:
sudo swapoff -a
Чтобы отключить swap на постоянной основе, закомментируй строку с swap в /etc/fstab.
Установка необходимых пакетов
Обнови пакеты и установи зависимости:
sudo apt update && sudo apt install -y apt-transport-https curl containerd
sudo apt install -y nfs-common
Настройка containerd
Создай конфиг по умолчанию и включи поддержку systemd:
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
В файле /etc/containerd/config.toml найди параметр:
SystemdCgroup = false
и замени на:
SystemdCgroup = true
Перезапусти сервис:
sudo systemctl restart containerd
Настройка sysctl
Добавь необходимые модули и параметры ядра:
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
sudo modprobe br_netfilter
sudo sysctl --system
Установка CNI-плагинов
Скачай и установи CNI-плагины:
curl -L https://github.com/containernetworking/plugins/releases/download/v1.7.1/cni-plugins-linux-amd64-v1.7.1.tgz -o cni-plugins.tgz
sudo mkdir -p /opt/cni/bin
sudo tar -xzvf cni-plugins.tgz -C /opt/cni/bin
ls /opt/cni/bin
Настройка Firewall (открытие портов)
Для корректной работы Kubernetes необходимо открыть следующие порты на разных типах нод.
Control-plane ноды (master)
| Порт | Протокол | Назначение |
|---|---|---|
| 6443 | TCP | Kubernetes API Server (kube-apiserver) |
| 2379-2380 | TCP | etcd (клиент-сервер и репликация) |
| 10250 | TCP | kubelet API |
| 10257 | TCP | kube-controller-manager |
| 10259 | TCP | kube-scheduler |
| 8285 и 8472 | UDP | Flannel VXLAN overlay network |
Worker-ноды
| Порт | Протокол | Назначение |
|---|---|---|
| 10250 | TCP | kubelet API (связь с master) |
| 30000-32767 | TCP | NodePort Services (доступ к сервисам) |
| 8285 и 8472 | UDP | Flannel VXLAN overlay network |
| 2049 | TCP/UDP | NFSv4 |
Открытие портов с помощью UFW
# Control-plane ноды
sudo ufw allow 6443/tcp
sudo ufw allow 2379:2380/tcp
sudo ufw allow 10250/tcp
sudo ufw allow 10257/tcp
sudo ufw allow 10259/tcp
# Worker-ноды
sudo ufw allow 10250/tcp
sudo ufw allow 30000:32767/tcp
# Flannel (на всех нодах)
sudo ufw allow 8285/udp
sudo ufw allow 8472/udp
Установка HAProxy
Открой конфиг:
sudo nano /etc/haproxy/haproxy.cfg
Добавь/измени содержимое на следующее:
global
stats socket /run/haproxy/admin.sock mode 660 level admin # Сокет для управления HAProxy
stats timeout 30s # Таймаут для админ-сессий
maxconn 4096 # Максимальное число одновременных соединений
listen stats
bind *:8404 # Веб-интерфейс статистики HAProxy
mode http # Режим HTTP для страницы статистики
stats enable # Включить статистику
stats uri /stats # URL для доступа (/stats)
stats refresh 10s # Обновление страницы каждые 10 секунд
stats show-node # Показывать имя ноды
stats auth admin:admin # Логин/пароль для доступа (admin/admin)
defaults
mode tcp # Режим TCP (Kubernetes API использует TCP)
timeout connect 10s # Таймаут подключения
timeout client 1m # Таймаут клиента
timeout server 1m # Таймаут сервера
frontend kubernetes-frontend
bind *:6443 # Слушаем порт 6443 (API Kubernetes)
default_backend k8s_masters # Перенаправляем трафик на backend с мастерами
backend k8s_masters
balance roundrobin # Балансировка Round Robin
option tcp-check # Проверка TCP доступности мастеров
default-server inter 5s fall 5 rise 3 # Интервал и условия проверки серверов
server master1 192.168.0.101:6443 check # Первый мастер
server master2 192.168.0.102:6443 check # Второй мастер
server master3 192.168.0.103:6443 check # Третий мастер
Перезапускаем haproxy:
sudo systemctl restart haproxy
sudo systemctl enable haproxy
Замечание:
Порт 6443 (API Kubernetes) должен быть открыт на HAProxy и на всех master-нодах.
Установка Kubernetes компонентов
На всех нодах (control-plane и worker) нужно установить kubeadm, kubelet, kubectl:
# Добавляем ключ и репозиторий
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.33/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.33/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
# Устанавливаем пакеты
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
# Фиксируем версию (чтобы не обновились случайно)
sudo apt-mark hold kubelet kubeadm kubectl
Инициализация первой control-plane ноды
На master1 выполняем:
sudo kubeadm init \
--apiserver-advertise-address=192.168.0.101 \
--control-plane-endpoint=192.168.0.100:6443 \
--upload-certs \
--pod-network-cidr=10.244.0.0/16
Пояснения:
—apiserver-advertise-address — IP текущей ноды (master1).
—control-plane-endpoint — IP или DNS HAProxy.
—upload-certs — позволяет использовать один токен для присоединения других control-plane.
—pod-network-cidr — подсеть для подов (Flannel использует 10.244.0.0/16).
После успешной инициализации kubeadm выведет:
✅ Команду для подключения других control-plane нод.
✅ Команду для подключения worker-нод.
Сохрани их.
Настройка kubectl для пользователя
mkdir -p $HOME/.kube
sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Установка сетевого плагина (Flannel)
После инициализации кластера на master1 установи Flannel, чтобы поды могли общаться между собой:
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
Убедись, что все поды Flannel в состоянии Running:
kubectl get pods -n kube-flannel
✅ После того как Flannel заработает, можно подключать другие control-plane ноды и worker-ноды.
Подключение остальных нод к кластеру
После инициализации первой control-plane ноды (master1), kubeadm выводит две команды:
— Для присоединения других control-plane нод.
— Для присоединения worker-нoд.
Пример для control-plane (master2, master3):
sudo kubeadm join 192.168.0.100:6443 --token <TOKEN> \
--discovery-token-ca-cert-hash sha256:<HASH> \
--control-plane --certificate-key <CERT_KEY>
Пояснения:
192.168.0.100:6443 — IP HAProxy (общая точка входа для API).
—control-plane — присоединение как master.
—certificate-key — общий ключ для обмена сертификатами.
Пример для worker-нoд:
sudo kubeadm join 192.168.0.100:6443 --token <TOKEN> \
--discovery-token-ca-cert-hash sha256:<HASH>
Если забыл команды
Можно вывести их заново:
kubeadm token create --print-join-command
Проверка состояния кластера
После подключения всех нод проверь:
kubectl get nodes
Ожидаемый вывод: все control-plane и worker-ноды в статусе Ready.
Проверка всех подов:
kubectl get pods -A
Все системные поды (kube-system, flannel) должны быть Running.
На этом базовая настройка HA-кластера Kubernetes завершена. В отдельной статье составил шпаргалку по основным командам для работы с кластером.
Инструкция по настройке NFS-сервера по ссылке