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

Установка и настройка Kubernetes на сервере

Автор

Олег Марков

Введение

Kubernetes — это открытая система оркестрации контейнеров, которая автоматизирует развёртывание, масштабирование и управление приложениями. Если у вас есть задача обеспечить отказоустойчивую и масштабируемую инфраструктуру для ваших сервисов, Kubernetes является проверенным стандартом в индустрии. В этой статье рассмотрим, как развернуть и настроить Kubernetes на отдельном сервере: вы получите готовый набор команд, увидите, что и зачем делаете на каждом этапе, и сможете самостоятельно поднять кластер для разработки или продакшн.

Предварительные требования

Для успешной установки Kubernetes на сервере потребуется:

  • Сервер (или несколько серверов) с Linux (лучше всего Ubuntu 20.04/22.04, CentOS 7/8 или Debian 10/11)
  • root-доступ или привилегии sudo
  • Минимум 2 ГБ RAM и 2 CPU на каждый сервер (этого достаточно для мастера и тестовых рабочих узлов)
  • Настроенная сеть между всеми участниками кластера (если разворачиваете на нескольких машинах)
  • Установленный SSH-доступ

Давайте разберём по шагам необходимые подготовительные действия.

Настройка среды

Перед установкой убедитесь, что ваш сервер обновлён:

sudo apt update && sudo apt upgrade -y
# Для CentOS
# sudo yum update -y

Отключите swap. Kubernetes требует, чтобы swap был выключен:

sudo swapoff -a
sudo sed -i '/ swap / s/^/#/' /etc/fstab   # Комментарий swap в конфиге для отключения после перезагрузки

Убедитесь, что включена поддержка br_netfilter и net.bridge:

sudo modprobe br_netfilter
echo '1' | sudo tee /proc/sys/net/bridge/bridge-nf-call-iptables # Включаем проброс iptables для bridge

Установка Docker (или containerd)

Kubernetes использует контейнерный runtime. По умолчанию это containerd, но допустим и Docker.

Установка Docker

sudo apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
sudo systemctl enable docker
sudo systemctl start docker

Теперь Docker настроен и выполняется в качестве системы контейнеризации.

Установка containerd (рекомендуется для Kubernetes v1.24+)

sudo apt install -y containerd
sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml
sudo systemctl restart containerd

Установка Kubernetes компонентов

Перейдем к установке основных компонентов Kubernetes: kubeadm (инструмент инициализации), kubelet (агент-исполнитель на каждой ноде) и kubectl (CLI для пользователя).

Добавление репозитория Kubernetes

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update

Установка kubeadm, kubelet, kubectl

sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl    # Предотвращает автоматические обновления

Проверьте версию, чтобы убедиться, что все установлено:

kubectl version --client && kubeadm version
# Ожидайте вывод с актуальными версиями

Инициализация кластера Kubernetes

Далее происходит инициализация мастера (control-plane). Используйте команду:

sudo kubeadm init --pod-network-cidr=10.244.0.0/16
# --pod-network-cidr - задаёт диапазон для сети подов (для Flannel/Calico рекомендуется 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

Теперь kubectl "знает", как подключаться к вашему кластеру.

Настройка сети подов (Pod Network)

Без сети подов ваш кластер не сможет запускать приложения — поды не будут видеть друг друга между нодами. Давайте установим сеть Flannel (простой вариант для старта):

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

Если вы хотите использовать Calico (альтернатива, частый выбор для production):

kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

Проверьте статус подов:

kubectl get pods --all-namespaces
# Ждём STATUS=Running без ошибок

Присоединение рабочих нод к кластеру

Если у вас несколько серверов, каждый дополнительный рабочий узел должен быть добавлен в кластер. После запуска kubeadm init мастер выдаёт строку вида:

kubeadm join <API_SERVER>:<PORT> --token <TOKEN> --discovery-token-ca-cert-hash sha256:<HASH>

Эту команду надо выполнить на каждом рабочем узле, предварительно установив туда те же пакеты (kubeadm, kubelet, docker/containerd, kubectl).

Вот ещё раз пример команд для подключения:

sudo kubeadm join 192.168.0.100:6443 --token abcd12.3456789abcdef0 --discovery-token-ca-cert-hash sha256:0123456789abcdef...

После команды рабочий узел включится в кластер. Проверить успешность можно через:

kubectl get nodes
# Вы должны увидеть мастер и все воркер-ноды в READY состоянии

Основные компоненты Kubernetes-кластера

Разберёмся, какие сервисы и процессы запускаются после установки.

kube-apiserver

Главная точка входа для всех запросов к кластеру (kubectl, пользователи, внутренние компоненты). Сервирует REST API.

kube-controller-manager

Следит за согласованностью состояния объектов: например, если указано три реплики пода, то будет пытаться всегда держать три.

kube-scheduler

Назначает поды на подходящие ноды, основываясь на ресурсах, ограничениях и политике.

etcd

Распределённое хранилище всех данных кластера (ключ-значение).

kubelet

Демон на каждой ноде, который запускает контейнеры, проверяет "живость" подов, обновляет статус.

kube-proxy

Работает на каждой ноде, обеспечивает сетевую маршрутизацию и публикацию сервисов.

Основные возможности и примеры управления

Давайте посмотрим на базовые команды kubectl для первичного управления кластером.

Проверка состояния кластера

kubectl get nodes       # Список всех нод
kubectl get pods -A     # Все поды во всех пространствах имён
kubectl get services    # Список сервисов

Деплой тестового приложения

Запустите простое приложение Nginx:

kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get services

Теперь сервис будет опубликован на случайном порту (например, 30007). Вы сможете обратиться к нему по адресу: http://<IP_NODE>:<NODE_PORT>

Масштабирование деплоймента

kubectl scale deployment nginx --replicas=3  # Теперь будет 3 пода nginx
kubectl get pods

Удаление приложения

kubectl delete deployment nginx
kubectl delete service nginx

Получить логи пода

kubectl logs <pod-name>
# Поможет при отладке

Открыть shell в контейнере пода

kubectl exec -it <pod-name> -- /bin/bash
# /bin/sh если bash недоступен

Расширенные настройки безопасности и отказоустойчивости

Настройка RBAC (контроль доступа)

Kubernetes поддерживает гибкую модель прав на основе ролей и политик:

# Пример манифеста ROLE, который даёт доступ только к подам
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: default
  name: pod-reader
rules:
- apiGroups: [""] # "" обозначает core API group
  resources: ["pods"]
  verbs: ["get", "list"]

Высокая доступность (HA)

Для продуктивного кластера стоит запускать несколько master-нод, использовать внешний etcd и балансировщик нагрузки. Этот процесс сложнее, требует отдельной настройки load balancer (например, с помощью внешнего HAProxy или IPVS), но позволяет переживать сбои отдельных ключевых узлов без простоя.

Мониторинг и логирование

Рекомендуется интегрировать инструменты мониторинга и логирования:

  • Prometheus+Grafana для сбора метрик и красивых дашбордов
  • EFK/ELK-стек (Elasticsearch, Fluentd/Logstash, Kibana) для сбора и анализа логов

Добавляйте эти решения по мере роста инфраструктуры.

Актуальная версия Kubernetes: почему важно?

Часто устаревшие версии содержат баги и уязвимости и не поддерживают новые функции. Следите за changelog и обновляйте версии согласно оф. документации.

Полезные советы

  • Всегда проверяйте, что время синхронизировано на всех нодах (ntpd, chrony — подходят)
  • Храните бэкапы etcd (это сердце кластера)
  • Используйте Namespaces для логической сегментации окружений
  • Изучите базовые абстракции Kubernetes: Pod, Deployment, Service, ConfigMap, Secret

Заключение

Вы ознакомились с основными шагами по установке и настройке Kubernetes на сервере. Теперь у вас есть понимание, какие компоненты требуются для запуска кластера, как подключать рабочие узлы и настраивать сеть подов. Освоив эти шаги, вы сможете не только развернуть кластер для себя или команды, но и постепенно расширять его, добавлять безопасность, мониторинг и другие инструменты, которые необходимы для эффективной работы с контейнеризированными приложениями.

Частозадаваемые технические вопросы по теме статьи и ответы на них

  1. Как перезапустить kubelet, если после изменений конфигурации он не применяет новые настройки?

    Перезапустите сервис командой: sudo systemctl daemon-reload sudo systemctl restart kubelet Если конфигурация всё ещё не применяется, проверьте логи с помощью: journalctl -u kubelet -xe

  2. Что делать, если после установки все узлы находятся в статусе NotReady?

    Проверьте состояние сети (firewall, iptables, установка плагина сети, например Flannel или Calico), синхронизацию времени (timedatectl status), и убедитесь, что выключен swap (swapoff -a).

  3. Можно ли безопасно обновить версию Kubernetes на работающем кластере?

    Да, но обновляйте компоненты поэтапно: сначала control plane (kubeadm upgrade), потом worker-ноды (kubectl drain <node>, обновление пакетов, kubectl uncordon <node>). Используйте инструкции с официального гайда по апдейту.

  4. Как включить автоматический запуск Docker или containerd при загрузке сервера?

    Выполните команду: sudo systemctl enable docker sudo systemctl enable containerd

  5. Где найти подробные логи kubectl и api-server?

    • Для логов kubelet: journalctl -u kubelet -f
    • Для api-server: journalctl -u kube-apiserver -f (или через docker/containerd логи, если control plane запускается в контейнере)
    • Для kubectl ошибки выводятся прямо в терминале
Стрелочка влевоРуководство по развертыванию KubernetesManaged 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 ₽
Подробнее

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