Перейти к содержанию

Этап 1: Подготовка всех нод

Выполнить на ВСЕХ нодах

k8scontrolplane01, k8scontrolplane02, k8scontrolplane03, k8sworker01, k8sworker02

1.1. Настройка /etc/hosts

Зачем: OrbStack DNS (.orb.local) может возвращать IP из другой подсети. Статические записи в /etc/hosts гарантируют, что ноды всегда будут находить друг друга по правильным IP адресам.

sudo tee -a /etc/hosts <<EOF
192.168.139.105 k8scontrolplane01 k8scontrolplane01.orb.local
192.168.139.152 k8scontrolplane02 k8scontrolplane02.orb.local
192.168.139.188 k8scontrolplane03 k8scontrolplane03.orb.local
192.168.139.69  k8sworker01 k8sworker01.orb.local
192.168.139.184 k8sworker02 k8sworker02.orb.local
192.168.139.101 kube-api kube-api.orb.local
EOF

1.2. Установка базовых зависимостей

Что устанавливаем:

  • apt-transport-https - позволяет apt работать с HTTPS репозиториями
  • ca-certificates - корневые SSL сертификаты для проверки HTTPS соединений
  • curl - для скачивания файлов
  • gpg - для проверки подписей пакетов
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gpg

1.3. Установка runc (OCI Runtime)

Зачем: runc - это низкоуровневый runtime для запуска контейнеров. containerd использует runc для фактического создания и запуска контейнеров. Без runc контейнеры не смогут запуститься.

sudo apt-get install -y runc

1.4. Установка CNI плагинов

Зачем: CNI (Container Network Interface) плагины предоставляют базовые сетевые примитивы (bridge, loopback, host-local IP allocation). Хотя Cilium будет основным CNI, некоторые базовые плагины нужны для bootstrap процесса и для kubelet.

sudo apt-get install -y containernetworking-plugins

# Проверяем установку
ls /usr/lib/cni/
# Должны увидеть: bandwidth, bridge, dhcp, firewall, host-device, ipvlan, 
# loopback, macvlan, portmap, ptp, sbr, static, tuning, vlan, vrf

1.4.1. Отключение swap (обязательно для kubelet)

Зачем: kubelet по умолчанию отказывается работать при включённом swap. Если отключить только командой swapoff -a, после перезагрузки swap снова включится — нужно отключить и сохранить это навсегда.

# Отключить swap сейчас
sudo swapoff -a

# Убрать автоматическое включение swap при загрузке:
# закомментировать строки со swap в /etc/fstab
sudo sed -i '/\sswap\s/s/^/#/' /etc/fstab

# Проверить: swap не должен быть в списке
free -h
# В строке "Swap:" должно быть 0 (или 0B)

Если swap включается через systemd (например, swapfile в /swapfile):

# Отключить и скрытить unit swap
sudo systemctl mask swap.target
sudo swapoff -a

После перезагрузки проверьте снова: free -h и sudo systemctl status kubelet.

1.5. Настройка модулей ядра

Зачем эти модули:

  • overlay - overlay filesystem для контейнерных образов (слои)
  • br_netfilter - позволяет iptables обрабатывать bridge трафик (нужно для Kubernetes network policies)

ВАЖНО: Модули должны быть загружены ДО запуска containerd!

# Создаем конфиг для автозагрузки модулей при старте системы
sudo tee /etc/modules-load.d/k8s.conf <<EOF
overlay
br_netfilter
EOF

# Загружаем модули СЕЙЧАС
sudo modprobe overlay
sudo modprobe br_netfilter

# Проверяем (могут не показаться в lsmod на OrbStack - это нормально, если встроены в ядро)
lsmod | grep -E "overlay|br_netfilter"

1.6. Настройка sysctl параметров

Зачем эти параметры:

  • net.bridge.bridge-nf-call-iptables = 1 - позволяет iptables видеть bridged трафик (критично для CNI)
  • net.bridge.bridge-nf-call-ip6tables = 1 - то же для IPv6
  • net.ipv4.ip_forward = 1 - включает IP forwarding (маршрутизацию между pod'ами)

Без этих параметров: Pod'ы не смогут общаться между собой через сеть.

# Создаем sysctl конфиг для Kubernetes
sudo tee /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

# Применяем настройки
sudo sysctl --system

# Проверяем
sysctl net.bridge.bridge-nf-call-iptables net.ipv4.ip_forward
# Должно показать: = 1 для обоих

1.7. Установка containerd 2.2.1

Почему именно 2.2.1:

  • Kubernetes 1.35 требует containerd 2.0+ для RuntimeConfig CRI метода
  • Версия 2.2.1 - последняя стабильная на момент написания
  • Ubuntu 24.04 поставляется с containerd 1.7.x, который не подходит

Почему вручную, а не через apt:

  • Репозиторий Ubuntu содержит только старую версию 1.7.x
  • Нам нужна именно 2.2.1 для полной совместимости с K8s 1.35
# Скачиваем containerd 2.2.1 для ARM64
cd /tmp
curl -L https://github.com/containerd/containerd/releases/download/v2.2.1/containerd-2.2.1-linux-arm64.tar.gz \
  -o containerd-2.2.1-linux-arm64.tar.gz

# Распаковываем в /usr/local
sudo tar Cxzvf /usr/local containerd-2.2.1-linux-arm64.tar.gz

# Проверяем установку
/usr/local/bin/containerd --version
# Должно показать: containerd github.com/containerd/containerd/v2 v2.2.1

1.8. Создание systemd service для containerd

Зачем systemd service:

  • Автоматический запуск containerd при загрузке системы
  • Управление процессом (restart, stop, status)
  • Логирование через journald

Объяснение параметров:

  • ExecStartPre=-/sbin/modprobe overlay - загружает overlay модуль (на случай если не загружен)
  • Знак - означает "игнорировать ошибку если модуль уже загружен"
  • Type=notify - containerd уведомит systemd когда полностью запустится
  • Delegate=yes - позволяет containerd управлять cgroups для контейнеров
  • KillMode=process - при остановке убивать только главный процесс, не дочерние
  • Restart=always - автоматический перезапуск при сбоях
  • TasksMax=infinity - без лимитов на количество процессов
  • OOMScoreAdjust=-999 - защита от OOM killer (не убивать containerd при нехватке памяти)
sudo tee /etc/systemd/system/containerd.service > /dev/null <<'EOF'
[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target local-fs.target

[Service]
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/local/bin/containerd
Type=notify
Delegate=yes
KillMode=process
Restart=always
RestartSec=5
LimitNPROC=infinity
LimitCORE=infinity
LimitNOFILE=infinity
TasksMax=infinity
OOMScoreAdjust=-999

[Install]
WantedBy=multi-user.target
EOF

1.9. Конфигурация containerd

Зачем конфигурация:

  • Включить SystemdCgroup - Kubernetes требует systemd cgroup driver для совместимости
  • Настроить runtime для работы с Kubernetes

Почему SystemdCgroup = true:

  • Kubernetes kubelet по умолчанию использует systemd cgroup driver
  • Если containerd использует cgroupfs, а kubelet systemd - будет конфликт
  • Приведет к неправильному управлению ресурсами контейнеров
# Создаем директорию для конфига
sudo mkdir -p /etc/containerd

# Генерируем дефолтный конфиг
sudo /usr/local/bin/containerd config default | sudo tee /etc/containerd/config.toml

# Включаем SystemdCgroup (КРИТИЧЕСКИ ВАЖНО для Kubernetes 1.35+)
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml

1.10. Запуск containerd

# Перечитываем systemd конфиги
sudo systemctl daemon-reload

# Включаем автозапуск
sudo systemctl enable containerd

# Запускаем
sudo systemctl start containerd

# Проверяем статус
sudo systemctl status containerd --no-pager
# Должно быть: Active: active (running)

1.11. Установка Kubernetes пакетов

Что устанавливаем:

  • kubelet - агент на каждой ноде, управляет pod'ами и контейнерами
  • kubeadm - утилита для bootstrap кластера
  • kubectl - CLI для управления кластером

Почему hold: Предотвращает автоматическое обновление при apt upgrade, т.к. обновление Kubernetes требует специальной процедуры.

# Добавляем GPG ключ Kubernetes репозитория
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.35/deb/Release.key | \
  sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

# Добавляем репозиторий Kubernetes v1.35
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.35/deb/ /' | \
  sudo tee /etc/apt/sources.list.d/kubernetes.list

# Обновляем индекс пакетов
sudo apt-get update

# Устанавливаем Kubernetes компоненты
sudo apt-get install -y kubelet kubeadm kubectl

# Блокируем автообновление
sudo apt-mark hold kubelet kubeadm kubectl

# Проверяем версии
kubelet --version
kubeadm version
kubectl version --client
# Все должны показать v1.35.1