Введение / Зачем это нужно
Kubernetes стал де-факто стандартом для оркестрации контейнеров в производственной среде. Развернув его на Linux, вы получаете масштабируемую платформу, которая автоматически управляет жизненным циклом ваших приложений, балансирует нагрузку и восстанавливает сервисы при сбоях. Этот гайд поможет вам собрать стабильный кластер с помощью официальных пакетов kubeadm, минуя устаревшие обёртки и сложные скрипты.
Требования / Подготовка
Перед началом убедитесь, что у вас есть как минимум один сервер или виртуальная машина. Минимальные ресурсы — 2 CPU и 2 ГБ ОЗУ. Вам потребуется доступ по SSH с правами sudo, стабильное интернет-соединение для загрузки пакетов и открытые порты 6443, 80, 443, 10250–10252. Если вы планируете масштабировать кластер, подготовьте дополнительные узлы с теми же параметрами.
Шаг 1: Подготовка системы и отключение подкачки
Kubernetes требует отключённого swap для корректного планирования ресурсов. Выполните команду:
sudo swapoff -a
Чтобы изменение сохранялось после перезагрузки, откройте /etc/fstab и закомментируйте строку, содержащую swap. Также убедитесь, что модули ядра для сетевых фильтров загружены:
sudo modprobe overlay
sudo modprobe br_netfilter
Примените параметры ядра для проброса трафика между интерфейсами:
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system
Шаг 2: Установка и настройка Container Runtime
Для работы Kubernetes требуется среда выполнения контейнеров. Мы используем containerd как наиболее стабильный вариант, рекомендованный сообществом.
sudo apt update
sudo apt install -y containerd
Создайте конфигурационный файл по умолчанию:
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
Откройте файл /etc/containerd/config.toml, найдите секцию [plugins."io.containerd.grpc.v1.cri"] и установите SystemdCgroup = true. Без этого kubelet не сможет корректно управлять cgroup. Перезапустите и включите службу:
sudo systemctl restart containerd
sudo systemctl enable containerd
Шаг 3: Добавление репозитория и установка компонентов k8s
Установите утилиты для работы с HTTPS и добавьте официальный ключ Kubernetes:
sudo apt install -y apt-transport-https ca-certificates curl
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/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.30/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
Установите компоненты, зафиксировав версию, чтобы избежать автоматических обновлений, нарушающих работу кластера:
sudo apt update
sudo apt install -y kubelet=1.30.0-1.1 kubeadm=1.30.0-1.1 kubectl=1.30.0-1.1
sudo apt-mark hold kubelet kubeadm kubectl
kubeadm разворачивает кластер, kubelet управляет контейнерами на узле, а kubectl — ваш CLI-инструмент для общения с API-сервером.
Шаг 4: Инициализация управляющего узла
Запустите инициализацию. Параметр --pod-network-cidr задаёт подсеть для внутренних подов, она обязательна для большинства плагинов:
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
Дождитесь завершения. В терминале появится команда для копирования конфигурации администратора и строка kubeadm join для подключения дополнительных узлов. Сохраните их в безопасном месте.
Настройте доступ для текущего пользователя:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Шаг 5: Подключение сетевого плагина и проверка работоспособности
Без CNI-плагина поды не получат IP-адреса. Установим Flannel, так как он не требует дополнительных настроек:
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
Подождите 1–2 минуты. Проверьте статус ядра:
kubectl get nodes
Все узлы должны перейти в состояние Ready.
Проверка результата
Разверните тестовый под, чтобы убедиться, что планировщик и сеть работают:
kubectl run nginx-test --image=nginx:latest
Проверьте статус и внутренний IP:
kubectl get pods -o wide
Если вы видите статус Running и назначенный адрес из подсети 10.244.x.x, кластер полностью готов к развёртыванию ваших сервисов. Удалите тестовый объект: kubectl delete pod nginx-test.
Возможные проблемы
Error: failed to run Kubelet: failed to create kubelet: failed to get container info for "/system.slice/kubelet.service": проверьте, чтоcontainerdзапущен и параметрSystemdCgroupустановлен вtrue.- Узел остаётся в статусе
NotReadyилиNetworkUnavailable: убедитесь, что командаkubectl apply -f ...для CNI-плагина выполнилась успешно. Ошибка часто возникает при блокировке портов 8472 и 4789 фаерволом. kubeadm initпадает на этапеkubelet-start: проверьте, чтоswapдействительно отключён, а версияcontainerdсовместима с Kubernetes v1.30. Выводjournalctl -u kubelet -fпокажет точную причину сбоя.