Хотите управлять своими микросервисами как профи? Рассказали, как быстро собрать полноценный Kubernetes-кластер на нескольких VPS и запустить в нём приложения.

Когда проект только запускает первые сервисы, часто хватает одной виртуальной машины и пары команд, чтобы всё работало. Контейнеры запускаются, пользователи довольны, инфраструктура понятна. Но рост проекта меняет всё. Появляются новые сервисы, микросервисы, базы данных, нагрузка растёт, и один VPS перестаёт справляться. Возникает необходимость быстро наращивать мощности, распределять приложения по нескольким серверам и управлять всем этим централизованно. В этот момент на сцену выходит Kubernetes.
В материале рассказали, как развернуть собственный кластер Kubernetes на нескольких серверах: как их подготовить, установить и настроить, правильно объединить узлы в кластер, подключить сетевую подсистему, а затем развернуть первое масштабируемое приложение.
Что такое Kubernetes и зачем он нужен
Раньше, чтобы запустить веб-приложение, достаточно было арендовать сервер, установить операционную систему, поднять веб-сервер и запустить приложение. Но с переходом к микросервисной архитектуре всё усложнилось. Современные приложения состоят из множества независимых компонентов — базы данных, бэкенда, фронтенда, брокеров сообщений. Управлять этим вручную — всё равно что пытаться вести сразу несколько поездов без диспетчера и автоматической сигнализации. Kubernetes как раз и стал таким диспетчером.
Kubernetes — инструмент для автоматизации запуска, работы и расширения контейнерных приложений в распределённой инфраструктуре. Он создаёт единое поле управления для десятков, сотен или даже тысяч контейнеров на разных серверах, превращая их в единую управляемую систему. Всё становится похоже на суперкомпьютер, где узлы объединены в общую инфраструктуру.
Возьмём практическую ситуацию. У интернет-магазина началась сезонная распродажа, и трафик вырос в несколько раз. Без Kubernetes команде пришлось бы вручную добавлять мощности, запускать дополнительные сервисы, перенастраивать балансировщики. С Kubernetes система сама запускает новые контейнеры, если нагрузка растёт, и отключает их, когда всплеск трафика заканчивается.
Kubernetes также помогает быстро восстановить работу, если один из серверов выходит из строя. Контейнеры автоматически запускаются на других узлах, данные кеша и активные процессы продолжают работу без участия администратора.
В итоге Kubernetes превращает сложную инфраструктуру из множества разбросанных серверов в управляемую систему, где процессы выполняются чётко и без сбоев, даже если нагрузка меняется каждую минуту.
Подготовка VPS для кластера
Прежде чем создавать кластер Kubernetes, нужно подготовить сами серверы, которые станут его основой. Обычно берут несколько VPS с предустановленной Linux-системой, чаще всего с Ubuntu 20.04 LTS. Один сервер выделяется под управляющий узел, остальные под рабочие.
Популярным выбором для развёртывания Kubernetes остаются VPS от AdminVPS. Такой вариант позволяет быстро запустить нужное количество узлов с подходящими характеристиками.
Подготовка начинается с обновления системы. Это минимизирует возможные конфликты версий и зависимостей. На каждом сервере выполняют стандартную команду:
sudo apt update && sudo apt upgrade -y
Kubernetes не работает с включённым swap, поэтому его отключают. Сначала временно:
sudo swapoff -a
А затем комментируют строку в файле /etc/fstab, чтобы swap не включился после перезагрузки:
sudo sed -i '/ swap / s/^/#/' /etc/fstab
Далее необходимо включить сетевые модули ядра, которые позволяют Kubernetes корректно передавать трафик между контейнерами:
sudo modprobe overlay
sudo modprobe br_netfilter
И задать параметры ядра, добавив их в файл /etc/sysctl.d/kubernetes.conf:
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
После этого изменения применяют:
sudo sysctl --system
Только после этих шагов можно переходить к установке Kubernetes и формированию кластера.
Установка Kubernetes с помощью kubeadm
Когда серверы подготовлены, можно переходить к установке Kubernetes. Самый удобный и универсальный способ — использовать утилиту kubeadm. Она упрощает процесс и помогает быстро развернуть кластер.
На каждом сервере сначала устанавливают контейнерный runtime. В большинстве случаев это Docker. На Ubuntu достаточно выполнить:
sudo apt install -y docker.io
sudo systemctl enable docker
sudo systemctl start docker
Далее добавляют официальный репозиторий Kubernetes и устанавливают его компоненты. Это делается на всех узлах кластера:
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt update
sudo apt install -y kubelet kubeadm kubectl
Команды kubelet, kubeadm и kubectl лучше сразу заблокировать от случайных обновлений:
sudo apt-mark hold kubelet kubeadm kubectl
Инициализация управляющего узла
Когда все компоненты установлены, первым запускается управляющий узел — он станет ядром будущего кластера Kubernetes. Этот сервер отвечает за планирование контейнеров, контроль состояния узлов, распределение ресурсов и другие ключевые задачи. Без управляющего узла кластер существовать не может.
На управляющем сервере выполняют команду инициализации кластера. Обычно её выполняют с указанием диапазона IP-адресов для сети подов. Для небольших кластеров на VPS часто используют CIDR 10.244.0.0/16, который совместим с популярным сетевым плагином Flannel:
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
После запуска выводятся инструкции, в том числе готовая команда для подключения рабочих узлов.
Чтобы управлять кластером с помощью kubectl, нужно настроить права пользователя:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Далее устанавливается сетевой плагин, который отвечает за взаимодействие между контейнерами на разных серверах. Один из самых часто используемых вариантов — Flannel:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
После настройки сети кластер можно подключать к рабочим серверам.
Присоединение рабочих узлов
Когда управляющий узел готов, настал момент собрать остальные серверы в единый кластер. Рабочие узлы выполняют основную нагрузку — на них запускаются контейнеры с приложениями.
Сам управляющий узел после инициализации выдаёт специальную команду, которая используется для подключения рабочих серверов. Её можно получить в любой момент, выполнив на управляющем сервере:
kubeadm token create --print-join-command
Эта команда выглядит примерно так:
kubeadm join 192.168.0.10:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:1234567890abcdef...
Внимание! IP-адрес, токен и хэш будут уникальными для вашего кластера. Они подставляются автоматически после выполнения команды. Её копируют и выполняют на каждом рабочем сервере. После выполнения узел автоматически присоединится к кластеру и станет доступен для размещения контейнеров.
Когда все рабочие узлы успешно подключены, можно проверить их статус с управляющего сервера командой:
kubectl get nodes
Все узлы должны находиться в статусе Ready, что означает их полную готовность к запуску контейнеров.
Проверка состояния кластера
Когда управляющий узел и рабочие серверы объединены в кластер, важно сразу убедиться, что всё работает как задумано. На этом этапе можно поймать возможные ошибки — от неправильных IP-адресов до сбоев в сети между узлами.
Для проверки используется команда:
kubectl get nodes
Выводится список всех серверов, подключённых к кластеру. У каждого должно стоять состояние Ready. Если статус другой, например, NotReady, это сигнал о проблемах с сетью, настройками kubelet или подкачкой (swap), которая не была отключена.
Проверка состояния кластера — это обязательный шаг перед тем, как приступить к развёртыванию реальных приложений. Только после этого можно быть уверенным, что кластер стабильно функционирует и готов к работе.
Развёртывание приложений в кластере
Когда кластер готов и все узлы находятся в статусе Ready, можно переходить к самой важной части — запуску приложений. Kubernetes использует манифесты, описанные в формате YAML, чтобы задать параметры запуска контейнеров: образ, количество реплик, используемые порты и другие настройки.
Для примера можно создать простое приложение на основе веб-сервера Nginx. На управляющем узле создают файл nginx-deployment.yaml с описанием будущего развёртывания:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
Для тестового запуска можно оставить значения как есть. Для использования собственного образа достаточно изменить параметры image и name. Здесь Kubernetes поднимает три контейнера Nginx и перезапускает их при сбое без участия администратора.
Примените манифест и разверните приложение в кластере командой:
kubectl apply -f nginx-deployment.yaml
После запуска приложения тестируют, все ли поды развернулись:
kubectl get pods
При правильной настройке в списке отобразятся три работающих контейнера.
После успешного теста с Nginx можно переходить к развёртыванию собственных приложений, добавлять базы данных, сервисы очередей и другие компоненты, которые будут работать в кластере как в единой системе.
Итоги
Создание собственного Kubernetes-кластера на VPS — это переход от ручного управления к системному подходу, когда приложения запускаются, перезапускаются и масштабируются автоматически. Такой кластер даёт разработчикам возможность управлять инфраструктурой чётко, по заранее заданным сценариям, без хаоса и спешки.
После первого успешного развёртывания появляются новые горизонты — добавление новых узлов, интеграция с системами мониторинга, автоматическое обновление контейнеров. Kubernetes позволяет расти и усложнять инфраструктуру постепенно, в том темпе, который нужен команде и проекту.
Читайте в блоге:
- Облачные серверы с GPU или покупка видеокарты: что выгоднее
- Как работает дедупликация данных и зачем она нужна
- Безопасность WordPress на VPS: как защитить сайт от DDoS и хакеров