Гид по технологиям

Kubernetes на Ubuntu 22.04: containerd и Flannel

• 8 min read • Kubernetes • Обновлено 25 Nov 2025
Kubernetes на Ubuntu 22.04: containerd и Flannel
Kubernetes на Ubuntu 22.04: containerd и Flannel

Kubernetes (k8s) — система оркестрации контейнеров. В этом руководстве шаг за шагом развернём кластер из трёх узлов на Ubuntu 22.04 с containerd в качестве runtime и Flannel как CNI. Вы настроите /etc/hosts, UFW, включите нужные модули ядра, отключите SWAP, установите containerd, kubeadm/kubelet/kubectl, проинициализируете control-plane и подключите два worker-узла.

Важно: команды выполняйте от имени пользователя с sudo. Тщательно проверьте IP-адреса и файлы конфигурации перед применением в проде.

О чём эта статья

  • Быстрая последовательность действий для развёртывания работоспособного кластера Kubernetes на Ubuntu 22.04.
  • Практические команды и файлы конфигурации, которые можно скопировать и вставить.
  • Разделы по проверке, устранению неполадок, альтернативам и безопасности.

Схема топологии кластера Kubernetes с одним control-plane и двумя worker-узлами

Основной сценарий и предположения

Целевая конфигурация:

  • 3 сервера Ubuntu 22.04: 1 control-plane, 2 worker.
  • Привилегированный пользователь с sudo.
  • Внутренние IP-адреса, доступные между узлами.

Если у вас другой дистрибутив или версия ядра, некоторые команды и пути могут отличаться.

Основные понятия в одну строку

  • Kubernetes: система оркестрации контейнеров для автоматического развёртывания, масштабирования и управления приложениями.
  • containerd: контейнерный runtime, реализующий контейнеры и контейнерный lifecycle.
  • kubeadm: инструмент для инициализации кластера и добавления узлов.
  • Flannel: простой CNI-плагин для сетей Pod с поддержкой VXLAN.

Требования (Prerequisites)

  • Три или более сервера с Ubuntu 22.04.
  • Пользователь с правами sudo на всех серверах.
  • Открытые порты между узлами (см. раздел UFW).

План действий (кратко)

  1. Настроить hostname и /etc/hosts.
  2. Настроить UFW и открыть порты для Kubernetes.
  3. Включить модули ядра overlay и br_netfilter, включить ip_forward, отключить SWAP.
  4. Установить containerd и настроить SystemdCgroup.
  5. Установить kubelet, kubeadm, kubectl.
  6. Проинициализировать control-plane и установить Flannel.
  7. Добавить worker-узлы командой kubeadm join.
  8. Проверить pods и nodes.

1. Настройка /etc/hosts и имён узлов

Настройте hostname на каждом сервере и добавьте соответствующие записи в /etc/hosts.

В примере используются серверы:

Hostname    IP Address        Used as
--------------------------------------------
cplane1     192.168.5.10      control-plane
worker1     192.168.5.25      worker node
worker2     192.168.5.26      worker node

Установите hostname:

sudo hostnamectl set-hostname cplane1

Для worker-узлов:

# на worker1
sudo hostnamectl set-hostname worker1

# на worker2
sudo hostnamectl set-hostname worker2

Отредактируйте /etc/hosts на всех серверах:

sudo nano /etc/hosts

Добавьте строки (все строки должны присутствовать на каждом узле):

192.168.5.10 cplane1
192.168.5.25 worker1
192.168.5.26 worker2

Проверьте доступность по имени:

ping cplane1 -c3
ping worker1 -c3
ping worker2 -c3

Если ping не проходит, проверьте файрвол и сетевые настройки.

2. Настройка UFW (фаервол Ubuntu)

Kubernetes требует открытия нескольких портов. На Ubuntu по умолчанию используется UFW. Разрешите OpenSSH перед включением UFW, чтобы не потерять доступ.

sudo ufw allow "OpenSSH"
sudo ufw enable

Подтверждение включения UFW в терминале

На control-plane откройте порты API и компонентной коммуникации:

sudo ufw allow 6443/tcp
sudo ufw allow 2379:2380/tcp
sudo ufw allow 10250/tcp
sudo ufw allow 10259/tcp
sudo ufw allow 10257/tcp

sudo ufw status

Вывод ufw status для control-plane

На worker-узлах откройте порты kubelet и NodePort range:

sudo ufw allow 10250/tcp
sudo ufw allow 30000:32767/tcp

sudo ufw status

Открытие портов UFW на worker-узле

Примечание: для продакшна рассмотрите использование облачной / аппаратной фильтрации трафика и ограничение доступа по IP.

3. Включение модулей ядра и отключение SWAP

Kubernetes требует нескольких системных настроек:

  • модули overlay и br_netfilter
  • sysctl: net.bridge.bridge-nf-call-iptables, ip_forward
  • отключённый SWAP

Включите нужные модули в текущей сессии:

sudo modprobe overlay
sudo modprobe br_netfilter

Сделайте это постоянным при загрузке, создав файл:

cat <

Настройка загрузки модулей ядра overlay и br_netfilter

Добавьте sysctl-параметры:

cat <

Применение sysctl параметров для Kubernetes

Отключите SWAP:

sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
sudo swapoff -a
free -m

Проверьте, что swap = 0.

Выключение swap и проверка free -m

Важно: kubelet требует отключённого SWAP. В продакшне убедитесь, что это согласуется с вашей политикой управления памятью.

4. Установка containerd (контейнерный runtime)

В этом руководстве используем containerd. На всех узлах выполните шаги ниже.

Добавим репозиторий Docker (в нём доступен пакет containerd.io):

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt update

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

Установите containerd:

sudo apt install -y containerd.io

Установка containerd.io

Остановите сервис перед изменением конфигурации:

sudo systemctl stop containerd

Создайте резервную копию конфигурации и сгенерируйте новую:

sudo mv /etc/containerd/config.toml /etc/containerd/config.toml.orig
sudo containerd config default | sudo tee /etc/containerd/config.toml

Отредактируйте /etc/containerd/config.toml и включите systemd cgroup driver. Найдите блок:

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
    SystemdCgroup = false

Измените на:

    SystemdCgroup = true

Сохраните файл и запустите сервис:

sudo systemctl start containerd
sudo systemctl enable containerd
sudo systemctl status containerd

Запуск сервиса containerd

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

sudo systemctl is-enabled containerd
sudo systemctl status containerd

Статус containerd

Почему SystemdCgroup = true? Kubernetes (kubelet) использует systemd cgroup driver при управлении ресурсами. Согласованность драйверов между kubelet и runtime уменьшает проблемы с управлением cgroup.

5. Установка пакетов Kubernetes (kubeadm, kubelet, kubectl)

Добавим репозиторий Kubernetes и установим пакеты.

sudo apt 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 update

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

Установите kubeadm, kubelet, kubectl:

sudo apt install -y kubelet kubeadm kubectl

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

Фиксируем версии, чтобы пакеты не обновлялись автоматически и чтобы избежать «version skew» между компонентами:

sudo apt-mark hold kubelet kubeadm kubectl

6. Установка CNI-плагина Flannel (опционально)

Flannel — простой CNI, достаточный для большинства тестовых и небольших продакшн-сценариев. В этом руководстве мы скачиваем бинарник flanneld и поместим его в /opt/bin.

mkdir -p /opt/bin/
sudo curl -fsSLo /opt/bin/flanneld https://github.com/flannel-io/flannel/releases/download/v0.19.0/flanneld-amd64
sudo chmod +x /opt/bin/flanneld

Установка бинарника flanneld в /opt/bin

Позже мы применим манифест kube-flannel.yml к кластеру. Flannel создаст Pod-сеть и IP-маршрутизацию для Pod-ов.

Альтернативы Flannel: Calico (политики сети и BGP), Cilium (eBPF), Weave, AWS VPC CNI. Выберите на основе требований безопасности, производительности и интеграции с облаком.

7. Инициализация control-plane

На control-plane (cplane1) убедитесь, что модуль br_netfilter загружен:

lsmod | grep br_netfilter

Подтяните образы, необходимые kubeadm:

sudo kubeadm config images pull

Проверка br_netfilter и загрузка образов kubeadm

Запустите kubeadm init. Пример для Flannel использует Pod CIDR 10.244.0.0/16.

Пояснения флагов:

  • –pod-network-cidr: сеть Pod-ов (подбирается под CNI). Для Flannel используйте 10.244.0.0/16.
  • –apiserver-advertise-address: IP-адрес API сервера, доступный внутри кластера.
  • –cri-socket: путь к socket containerd (unix:///run/containerd/containerd.sock).
sudo kubeadm init --pod-network-cidr=10.244.0.0/16 \
  --apiserver-advertise-address=192.168.5.10 \
  --cri-socket=unix:///run/containerd/containerd.sock

Ожидаемый вывод завершения содержит инструкции по копированию kubeconfig и команду kubeadm join для рабочих узлов.

Вывод kubeadm init

После успешной инициализации выполните настройку kubeconfig для текущего пользователя:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

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

kubectl cluster-info
kubectl get nodes

Сообщение об успешной инициализации control-plane

8. Установка Flannel в кластер

Примените манифест Flannel (kube-flannel.yml) из официального репозитория:

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

Подождите, пока flannel pods станут Ready:

kubectl get pods -n kube-system --watch

Проверьте список всех Pod-ов:

kubectl get pods --all-namespaces

kubectl get pods --all-namespaces вывод

Если некоторые Pod-ы в состоянии ImagePullBackOff или CrashLoopBackOff — см. раздел Устранение неполадок.

9. Добавление worker-узлов

На каждом рабочем узле выполните команду kubeadm join, которую kubeadm init сгенерировал на control-plane. Пример:

kubeadm join 192.168.5.10:6443 --token po3sb1.oux4z76nwb0veuna \
  --discovery-token-ca-cert-hash sha256:f5068150fabaf85f3d04e19a395c60d19298ba441e2d9391e20df3267ea6cd28

После успешного выполнения на control-plane проверьте узлы:

kubectl get nodes -o wide

kubeadm join output для worker1

kubeadm join output для worker2

kubectl get pods --all-namespaces после добавления worker

Проверка: все узлы должны иметь статус Ready. Pod-ы kube-system должны быть Running/Completed.

Критерии приёмки

  1. kubeadm init завершился успешно на control-plane.
  2. kubeconfig скопирован в $HOME/.kube/config и kubectl работает.
  3. Flannel pods в namespace kube-system имеют STATUS=Running.
  4. Все три узла отображаются в kubectl get nodes со статусом Ready.
  5. kubelet и containerd запущены и активны на всех узлах.

Полезные команды- шпаргалка (Cheat sheet)

  • Проверка узлов: kubectl get nodes -o wide
  • Проверка Pod-ов: kubectl get pods –all-namespaces
  • Логи Pod: kubectl logs -n [-c ]
  • Остановка/запуск systemd: sudo systemctl restart kubelet
  • Проверка статуса containerd: sudo systemctl status containerd
  • Применение манифеста: kubectl apply -f

Сохраните токен join, если потребуется подключать дополнительные узлы:

kubeadm token create --print-join-command

Устранение неполадок (Troubleshooting)

  1. Pod в состоянии ImagePullBackOff

    • Проверьте сетевой доступ к Docker Hub / репозиторию.
    • Убедитесь, что DNS внутри кластера работает (CoreDNS pods Running).
  2. Узел NotReady

    • Посмотрите логи kubelet: sudo journalctl -u kubelet -b
    • Проверьте, включён ли swap (swap должен быть отключён).
    • Проверьте состояние containerd: sudo systemctl status containerd
  3. Flannel не создаёт сеть

    • Убедитесь, что pod-network-cidr совпадает с настройкой Flannel (10.244.0.0/16).
    • Просмотрите логи flannel-подов: kubectl -n kube-system logs
  4. kubeadm join выдаёт ошибку discovery

    • Проверьте доступность порта 6443 (ufw, cloud firewall).
    • Убедитесь, что токен ещё действует или создайте новый: kubeadm token create –print-join-command

Альтернативные контейнерные рантаймы и примечания

  • Docker Engine: требует cri-dockerd (deprecated в некоторых сценариях). Если вы хотите использовать Docker, установите cri-dockerd.
  • CRI-O: подходит для строгих контейнерных runtime-подходов, часто используется в OpenShift.
  • Mirantis Container Runtime: коммерческая альтернатива.

Выбор runtime зависит от требований безопасности, поддержки cgroup, совместимости и ваших внутренних стандартов.

Сравнение CNI: краткая матрица

CNIПодходит дляПолезно, когдаОсобенности
FlannelПростые кластерыНужна простая настройкаЛёгкий, использует VXLAN или host-gw
CalicoProd, политики сетиНужны NetworkPolicy и масштабBGP/политики/высокая производительность
CiliumВысокая нагрузкаНужен eBPF и фильтрация L7Высокая производительность, eBPF

Выбор: Flannel — простой старт. Для политики безопасности и масштабируемости выбирайте Calico или Cilium.

Рекомендации по безопасности

  • Минимизируйте доступ к API серверу по IP.
  • Включите RBAC и выдайте минимальные роли.
  • Используйте NetworkPolicy для контроля трафика между Pod-ами.
  • Храните сертификаты и kubeconfig в защищённых местах.
  • Регулярно обновляйте kubelet и kubeadm в согласованной последовательности (control-plane перед workers).

Резервирование и откат

  • Сделайте бэкап etcd перед крупными обновлениями (если etcd локальный): etcdctl snapshot save <файл>.
  • Для отката: восстановите snapshot etcd и перезапустите компоненты control-plane.
  • Для одиночных проблем с kubelet — перезапустите systemd unit и просмотрите логи.

Модель принятия решений (мерджейн диаграмма)

flowchart TD
  A[Нужна сеть Pod?] -->|Да| B{High perf or Policies?}
  B -->|Да| C[Calico или Cilium]
  B -->|Нет| D[Flannel]
  A -->|Нет| E[Использовать host networking]
  C --> F[Настроить NetworkPolicy]
  D --> F
  E --> G[Простая настройка, но без изоляции]

Контрольные списки по ролям

Администратор (pre-deploy):

  • Проверьте сеть и DNS между узлами.
  • Настройте /etc/hosts на всех узлах.
  • Отключите SWAP и примените sysctl.
  • Настройте UFW/слои безопасности.

DevOps-инженер (deploy):

  • Установить containerd и kubeadm/kubelet/kubectl.
  • Проинициализировать control-plane.
  • Применить CNI и проверить pods kube-system.
  • Добавить worker-узлы и проверить nodes.

Operator (post-deploy):

  • Настроить мониторинг (Prometheus, Alertmanager).
  • Настроить логирование (ELK/EFK).
  • Настроить бэкап etcd и план обновлений.

Факты в цифрах (Fact box)

  • Минимум узлов в примере: 3 (1 control-plane + 2 worker).
  • Рекомендуемый Pod CIDR для Flannel: 10.244.0.0/16.
  • NodePort range по умолчанию: 30000–32767.

Частые ошибки и когда этот процесс не подойдёт

  • Если у вас краткая оконная сеть с NAT и нет стабильной маршрутизации между хостами, некоторые CNI-режимы могут не работать.
  • Если на узлах используется устаревшая версия ядра (<4.19), функции eBPF и современные CNI могут работать некорректно.
  • Для production с высокими требованиями по безопасности рассматривайте HA control-plane (несколько control-plane с внешним etcd) и квалифицированные решения облачных провайдеров.

Короткая методология: быстрый playbook

  1. Подготовить ОС (закрыть лишние сервисы, обновить пакеты).
  2. Настроить имена и /etc/hosts.
  3. Настроить firewall и открыть нужные порты.
  4. Включить kernel модули и отключить swap.
  5. Установить runtime и Kubernetes пакеты.
  6. Инициализировать control-plane.
  7. Применить CNI.
  8. Добавить workers.
  9. Проверить работоспособность приложений.

Глоссарий в одну строку

  • kubelet: агент на каждом узле, который запускает контейнеры.
  • kubeadm: инструмент для инициализации и присоединения узлов.
  • kubectl: CLI для управления Kubernetes.
  • CNI: Container Network Interface, плагин сети Pod.

Ключевые моменты и итоги

  • Kubernetes автоматизирует управление контейнерами. containerd — надёжный runtime.
  • Отключение swap и включение overlay/br_netfilter — обязательны.
  • Flannel — удобный стартовый CNI, но для политики сети лучше Calico/Cilium.
  • Всегда фиксируйте версии kubelet/kubeadm/kubectl и планируйте обновления.

Заключение

Вы развернули базовый, но рабочий кластер Kubernetes на Ubuntu 22.04 с containerd и Flannel. Дальше можно развернуть приложения, настроить мониторинг и CI/CD. Для продакшна подумайте об HA control-plane, TLS, политике RBAC и backup etcd.


Ключевые команды ещё раз (список для копирования):

# hostname
sudo hostnamectl set-hostname cplane1

# /etc/hosts (повторить на всех узлах)
# 192.168.5.10 cplane1
# 192.168.5.25 worker1
# 192.168.5.26 worker2

# UFW
sudo ufw allow "OpenSSH"
sudo ufw enable
sudo ufw allow 6443/tcp
sudo ufw allow 2379:2380/tcp
sudo ufw allow 10250/tcp
sudo ufw allow 10259/tcp
sudo ufw allow 10257/tcp
sudo ufw allow 30000:32767/tcp

# modules & sysctl
sudo modprobe overlay
sudo modprobe br_netfilter
cat < --discovery-token-ca-cert-hash sha256:
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро