Этап 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- для проверки подписей пакетов
1.3. Установка runc (OCI Runtime)¶
Зачем: runc - это низкоуровневый runtime для запуска контейнеров. containerd использует runc для фактического создания и запуска контейнеров. Без 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):
После перезагрузки проверьте снова: 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- то же для IPv6net.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