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.
- Практические команды и файлы конфигурации, которые можно скопировать и вставить.
- Разделы по проверке, устранению неполадок, альтернативам и безопасности.

Основной сценарий и предположения
Целевая конфигурация:
- 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).
План действий (кратко)
- Настроить hostname и /etc/hosts.
- Настроить UFW и открыть порты для Kubernetes.
- Включить модули ядра overlay и br_netfilter, включить ip_forward, отключить SWAP.
- Установить containerd и настроить SystemdCgroup.
- Установить kubelet, kubeadm, kubectl.
- Проинициализировать control-plane и установить Flannel.
- Добавить worker-узлы командой kubeadm join.
- Проверить 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
На 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
На worker-узлах откройте порты kubelet и NodePort range:
sudo ufw allow 10250/tcp
sudo ufw allow 30000:32767/tcp
sudo ufw status
Примечание: для продакшна рассмотрите использование облачной / аппаратной фильтрации трафика и ограничение доступа по 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 <
Добавьте sysctl-параметры:
cat <
Отключите SWAP:
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
sudo swapoff -a
free -mПроверьте, что swap = 0.

Важно: 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
Установите containerd:
sudo apt install -y 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
Проверьте статус:
sudo systemctl is-enabled containerd
sudo systemctl status 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
Установите kubeadm, kubelet, kubectl:
sudo apt install -y kubelet kubeadm kubectl
Фиксируем версии, чтобы пакеты не обновлялись автоматически и чтобы избежать «version skew» между компонентами:
sudo apt-mark hold kubelet kubeadm kubectl6. Установка 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
Позже мы применим манифест 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
Запустите 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 для рабочих узлов.

После успешной инициализации выполните настройку 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
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
Если некоторые 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


Проверка: все узлы должны иметь статус Ready. Pod-ы kube-system должны быть Running/Completed.
Критерии приёмки
- kubeadm init завершился успешно на control-plane.
- kubeconfig скопирован в $HOME/.kube/config и kubectl работает.
- Flannel pods в namespace kube-system имеют STATUS=Running.
- Все три узла отображаются в kubectl get nodes со статусом Ready.
- 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)
Pod в состоянии ImagePullBackOff
- Проверьте сетевой доступ к Docker Hub / репозиторию.
- Убедитесь, что DNS внутри кластера работает (CoreDNS pods Running).
Узел NotReady
- Посмотрите логи kubelet: sudo journalctl -u kubelet -b
- Проверьте, включён ли swap (swap должен быть отключён).
- Проверьте состояние containerd: sudo systemctl status containerd
Flannel не создаёт сеть
- Убедитесь, что pod-network-cidr совпадает с настройкой Flannel (10.244.0.0/16).
- Просмотрите логи flannel-подов: kubectl -n kube-system logs
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 |
| Calico | Prod, политики сети | Нужны 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
- Подготовить ОС (закрыть лишние сервисы, обновить пакеты).
- Настроить имена и /etc/hosts.
- Настроить firewall и открыть нужные порты.
- Включить kernel модули и отключить swap.
- Установить runtime и Kubernetes пакеты.
- Инициализировать control-plane.
- Применить CNI.
- Добавить workers.
- Проверить работоспособность приложений.
Глоссарий в одну строку
- 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: Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента