Олег Марков
Руководство по развертыванию Kubernetes
Введение
Kubernetes стал стандартом управления контейнерами в масштабируемых распределённых системах. Благодаря своей гибкости, платформу внедряют как небольшие стартапы, так и гиганты индустрии. Давайте разберёмся, как правильно развернуть Kubernetes — начиная с основных теоретических моментов и заканчивая практическими примерами установки, настройки и запуска первого приложения.
В этом руководстве я покажу вам, как подготовить инфраструктуру, выбрать подходящий способ установки, установить и эффективно настроить кластер, чтобы вы уверенно управляли своими контейнеризованными приложениями.
Что такое Kubernetes и зачем он нужен
Kubernetes — это система управления контейнеризованными приложениями. Она помогает автоматизировать развертывание, масштабирование и администрирование контейнеров, таких как Docker. Представьте себе Kubernetes как оркестратор, который управляет большим "ансамблем" контейнеров и следит за их здоровьем и доступностью.
Вот какие задачи умеет решать Kubernetes:
- Автоматическое размещение контейнеров на доступных серверах (нодах)
- Автоматическое восстановление приложений (рестарт контейнера при сбое)
- Масштабирование приложений "на лету"
- Бесперебойные обновления (rolling updates) и откаты (rollbacks)
- Организация сетевого взаимодействия между сервисами (Service Discovery)
- Управление секретами и настройками приложений
Архитектура Kubernetes-кластера
Давайте разберёмся с основными компонентами Kubernetes:
Контрольный узел (Control Plane)
Это мозг вашей системы. Он принимает решения, планирует, следит за состоянием, управляет настроенными объектами.
- kube-apiserver: главный API-сервер, с которым взаимодействуют пользователи и компоненты
- etcd: ключ-значение база данных, где хранится всё состояние кластера
- kube-scheduler: назначает поды на ноды, основываясь на доступных ресурсах и политиках
- kube-controller-manager: следит, чтобы кластер соответствовал желаемому состоянию
Узлы-вычислители (Worker Nodes)
На них запускаются непосредственно контейнеры.
- kubelet: агент, запускающий контейнеры, отслеживающий их состояние
- kube-proxy: отвечает за сети и пробрасывание портов
- Container Runtime: среда выполнения контейнеров, например, Docker или containerd
Как компоненты взаимодействуют
Контрольный узел управляет рабочими нодами посредством kubelet через API, обеспечивает коммуникацию и мониторинг.
Вот облегчённая схема:
Пользователь —> API Server —> etcd
|
Scheduler —> Worker Nodes (через Kubelet)
Controllers
Выбор метода развертывания Kubernetes
Есть разные способы развернуть кластер. Вот основные варианты, подходящие для разных задач:
1. Minikube — для локальной разработки
Minikube допускает быстрый старт Kubernetes на вашем ноутбуке или рабочей станции. Отлично подходит для обучения и тестирования.
2. kubeadm — для production и частных кластеров
kubeadm предоставляет утилиты для ручного развертывания на физических или виртуальных серверах. Это один из самых популярных и гибких способов.
3. Управляемые сервисы (EKS, AKS, GKE)
Если вы используете облака, такие как AWS, Azure или Google Cloud, вы можете воспользоваться готовыми сервисами развертывания Kubernetes одним кликом.
4. K3s и MicroK8s — для IoT, edge, малых систем
Упрощённые/лёгкие дистрибутивы для специфических случаев, например, для устройств или разработки.
Теперь давайте разберём основные сценарии более детально.
Разворачиваем Kubernetes с помощью Minikube
Если вам нужен быстрый старт без сложностей — этот способ для вас.
Установка Minikube
На Linux (Ubuntu):
# Устанавливаем необходимые зависимости
sudo apt-get update
sudo apt-get install -y curl
# Скачиваем и устанавливаем Minikube
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
# Проверяем версию
minikube version
На macOS:
brew install minikube
Запуск кластера Minikube
# Запускаем кластер с двумя виртуальными процессорами и 4 ГБ ОЗУ
minikube start --cpus=2 --memory=4096
# Проверяем статус
minikube status
Использование kubectl для управления кластером
Minikube автоматически устанавливает и конфигурирует kubectl.
# Получаем список всех нод в кластере
kubectl get nodes
# Пробуем развернуть простой под
kubectl run nginx --image=nginx
kubectl get pods
Поясню, что при такой установке кластер будет одновузловым, что подходит только для тестирования и локальной разработки.
Развертывание Kubernetes с помощью kubeadm
Этот способ подойдет для тестовых и боевых (production) сред и требует ручной подготовки инфраструктуры.
Подготовка серверов
Вам потребуется минимум две машины (виртуальные или физические): одна для control plane, остальные — под worker nodes.
- ОС: Ubuntu 20.04/22.04 или CentOS 7/8
- Настроенный доступ по SSH
- Отключены swap-файлы (
swapoff -a
)
Установка Docker и kubeadm
Шаг 1. Устанавливаем Docker
sudo apt-get update
sudo apt-get install -y docker.io
sudo systemctl enable docker
sudo systemctl start docker
Шаг 2. Устанавливаем kubeadm, kubelet и kubectl
sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | 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
Инициализация кластера на главном узле
# Выполняем только на главной (master) ноде
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
--pod-network-cidr=10.244.0.0/16
— стандартно для большинства сетевых плагинов (Flannel/Cilium).- В выводе команды появится токен для присоединения воркеров. Сохраните его.
Настройка kubectl для вашего пользователя
# Создаем директорию конфигурации
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Теперь kubectl работает без sudo.
Установка сетевого плагина (напр. Flannel)
Без сетевого плагина поды не запустятся:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
Присоединение worker-нод
На каждой воркер-ноде выполните команду, которую указал kubeadm после инициализации control plane. Пример:
sudo kubeadm join 192.168.1.10:6443 --token abcd1234.efgh5678ijkl9012 --discovery-token-ca-cert-hash sha256:abcdefgh12345678...
Проверяем статус кластера:
kubectl get nodes
Увидите список всех нод и их статус Ready.
Пример деплоя приложения
Давайте задеплоим nginx в вашем кластере.
kubectl create deployment nginx --image=nginx
kubectl get pods
Теперь откроем доступ к nginx извне через сервис типа NodePort:
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get services
В выводе посмотрите значение NODE-PORT
. Теперь, обращаясь к IP любого воркера на этом порту, вы получите ответ от nginx.
Управление и масштабирование кластера
Kubernetes дает вам простой способ масштабировать приложения:
# Масштабируем nginx до 3 инстансов
kubectl scale deployment nginx --replicas=3
# Проверяем поды
kubectl get pods
Вы видите, как быстро появляются новые поды.
Отказоустойчивость и обновления
Кластер Kubernetes легко выдержит отказ одной из нод:
- Kubernetes автоматически переназначит поды на здоровые ноды.
- Для обновления приложения используйте команды rolling update:
kubectl set image deployment/nginx nginx=nginx:1.19
Kubernetes обновит поды по очереди, чтобы не было недоступности.
Настройка доступа и безопасности
Вы можете создать роли и права доступа с помощью RBAC (Role-Based Access Control), хранить секреты для приложений в секции secrets
, а файлы конфигураций — в configmaps
.
Вот пример создания секрета:
kubectl create secret generic my-secret --from-literal=password=supersecret
Установка Kubernetes в облачных сервисах
Большие облачные провайдеры предлагают готовый Kubernetes как услугу. Например:
- Amazon EKS — через AWS Management Console или командную строку (eksctl)
- Google GKE — интегрируется с Google Console
- Azure AKS — через Azure Portal или CLI
Процесс везде схож: вы выбираете количество нод, их характеристики и нажимаете кнопку "Создать". Облачная платформа берёт на себя установку control plane и поддержку отказоустойчивости.
Лучшие практики развертывания
- Обновляйте компоненты: следите за версиями Kubernetes и плагинов.
- Мониторинг и логирование: внедряйте системы, такие как Prometheus и Grafana.
- Резервное копирование данных etcd: часто делайте backup etcd.
- Используйте namespaces: разграничивайте окружения и проекты.
Заключение
Развертывание Kubernetes может показаться сложной задачей, но если двигаться пошагово, вы быстро освоитесь с основными концепциями, конфигурациями и типичными сценариями развертывания. Доступность разных способов установки — от Minikube до облачных сервисов — позволяет выбрать подход, исходя из ваших целей. Главное — знать архитектуру, назначение компонентов, соблюдать лучшие практики безопасности и регулярно улучшать автоматизацию управления кластером.
Частозадаваемые технические вопросы по теме статьи и ответы на них
Как поменять IP-адрес ноды и не нарушить работу кластера?
- Остановите kubelet на ноде:
sudo systemctl stop kubelet
. - Измените IP-адрес через сетевые настройки ОС.
- Перезапустите kubelet:
sudo systemctl start kubelet
. - Если после этого нода не видна — убедитесь, что kubelet использует новый IP (опция
--node-ip
) в файле/etc/systemd/system/kubelet.service.d/10-kubeadm.conf
.
Как быстро удалить ноду из кластера?
Выполните на master:
bash
kubectl drain <NODE_NAME> --delete-local-data --force --ignore-daemonsets
kubectl delete node <NODE_NAME>
На воркере удалите все компоненты Kubernetes или переустановите ОС.
Как перенести кластер Kubernetes с одного сервера на другой?
- Сделайте бэкап etcd на старом сервере
- Разверните control plane на новом сервере с теми же версиями
- Восстановите данные etcd из бэкапа
- Заново присоедините все worker-нодs
Как сменить сеть (pod network) в уже существующем кластере?
- Удалите старый сетевой плагин:
kubectl delete -f <old-network.yaml>
- Примените манифест нового плагина (например, Calico или Flannel).
- Проверьте, чтобы поды kube-system были в состоянии Ready.
Как увеличить размер диска под etcd в production?
- Остановите etcd.
- Увеличьте диск на уровне гипервизора или облака.
- Смонтируйте расширенный том.
- Перезапустите etcd и проверьте его состояние.
Постройте личный план изучения Kubernetes до уровня Middle — бесплатно!
Kubernetes — часть карты развития DevOps
100+ шагов развития
30 бесплатных лекций
300 бонусных рублей на счет
Бесплатные лекции
Все гайды по Kubernetes
Лучшие курсы по теме

Kubernetes и Helm
Антон Ларичев
Docker и Ansible
Антон Ларичев