Kubernetes HA Cluster — установка

Инструкция по установке и первичной настройка 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

Ресурсы для нод

РольCPURAMDisk
Control-plane22GB30GB
Worker22GB50GB

Настройка /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)

ПортПротоколНазначение
6443TCPKubernetes API Server (kube-apiserver)
2379-2380TCPetcd (клиент-сервер и репликация)
10250TCPkubelet API
10257TCPkube-controller-manager
10259TCPkube-scheduler
8285 и 8472UDPFlannel VXLAN overlay network

Worker-ноды

ПортПротоколНазначение
10250TCPkubelet API (связь с master)
30000-32767TCPNodePort Services (доступ к сервисам)
8285 и 8472UDPFlannel VXLAN overlay network
2049TCP/UDPNFSv4

Открытие портов с помощью 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-сервера по ссылке

Прокрутить вверх