логотип PurpleSchool
логотип PurpleSchool

Руководство по развертыванию 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 легко выдержит отказ одной из нод:

  1. Kubernetes автоматически переназначит поды на здоровые ноды.
  2. Для обновления приложения используйте команды 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-адрес ноды и не нарушить работу кластера?

  1. Остановите kubelet на ноде: sudo systemctl stop kubelet.
  2. Измените IP-адрес через сетевые настройки ОС.
  3. Перезапустите kubelet: sudo systemctl start kubelet.
  4. Если после этого нода не видна — убедитесь, что 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) в уже существующем кластере?

  1. Удалите старый сетевой плагин: kubectl delete -f <old-network.yaml>
  2. Примените манифест нового плагина (например, Calico или Flannel).
  3. Проверьте, чтобы поды kube-system были в состоянии Ready.

Как увеличить размер диска под etcd в production?

  1. Остановите etcd.
  2. Увеличьте диск на уровне гипервизора или облака.
  3. Смонтируйте расширенный том.
  4. Перезапустите etcd и проверьте его состояние.
Установка и настройка Kubernetes на сервереСтрелочка вправо

Постройте личный план изучения Kubernetes до уровня Middle — бесплатно!

Kubernetes — часть карты развития DevOps

  • step100+ шагов развития
  • lessons30 бесплатных лекций
  • lessons300 бонусных рублей на счет

Бесплатные лекции

Все гайды по Kubernetes

Terraform и Kubernetes инфраструктура как кодНастройка и использование Runners в KubernetesНастройка и деплой PostgreSQL в KubernetesСравнение и интеграция Openshift и KubernetesПримеры интеграции GitHub Actions и KubernetesDeploy приложений в Kubernetes - пошаговое руководство для начинающих и не толькоКак настроить CD в KubernetesИнтеграция Ansible в KubernetesИнтеграция CI/CD с Jenkins и KubernetesИнтеграция Kubernetes с GitLab - Автоматизация CI CD в облачной инфраструктуреГайд по DevOps инструментам в KubernetesОсобенности платформы Deckhouse в Kubernetes
Открыть базу знаний

Лучшие курсы по теме

изображение курса

Kubernetes и Helm

Антон Ларичев
AI-тренажеры
Гарантия
Бонусы
иконка звёздочки рейтинга4.9
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Docker и Ansible

Антон Ларичев
AI-тренажеры
Гарантия
Бонусы
иконка звёздочки рейтинга4.8
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Микросервисы

Антон Ларичев
Гарантия
Бонусы
иконка звёздочки рейтинга4.8
3 999 ₽ 6 990 ₽
Подробнее

Отправить комментарий