Установка кластера Kubernetes на Ubuntu 22.04

Введение
Kubernetes — бесплатный инструмент оркестрации контейнеров для автоматизированного развёртывания, масштабирования и управления контейнерными приложениями. Кластер состоит из master-узла (control-plane) и worker-узлов. Master управляет состоянием кластера, worker исполняют контейнерные workload. Это руководство показывает, как поднять кластер на Ubuntu 22.04 с контейнерным рантаймом containerd и сетевым плагином Calico.
Важно знать в одну строку:
- kubeadm — инструмент для инициализации и присоединения узлов; kubelet — агент на каждом узле; kubectl — клиент для управления кластером.
Основные понятия
- Master (control-plane): отвечает за API, контроль и планирование.
- Worker: запускает поды с контейнерами.
- Pod: одна или несколько контейнерных единиц, развертываемых вместе.
- Containerd: контейнерный рантайм, который управляет жизненным циклом контейнеров.
Требования
- Сервер(ы) с Ubuntu 22.04 (master и как минимум один worker).
- Настроен root-пароль или пользователь с sudo.
- Доступ к интернету для загрузки пакетов и манифестов.
План действий (коротко)
- Обновить систему и отключить swap.
- Загрузить kernel-модули и применить sysctl-параметры.
- Установить containerd и настроить Systemd cgroup.
- Установить kubeadm, kubelet, kubectl из репозитория Kubernetes.
- Инициализировать кластер на master и подключить worker-узлы.
- Установить сетевой плагин (Calico) и проверить состояние.
- Развернуть тестовое приложение (nginx).
Подробные шаги
1. Обновление пакетов и отключение swap
Выполните на всех узлах:
apt update -y
apt upgrade -yОтключите swap (Kubernetes требует его отключения):
swapoff -aЕсли хотите, удалите/закомментируйте swap-строку в /etc/fstab для постоянного отключения.
2. Загрузка kernel-модулей и sysctl-параметры
Создайте файл для загрузки модулей:
nano /etc/modules-load.d/containerd.confДобавьте:
overlay
br_netfilter
Загрузите модули:
modprobe overlay
modprobe br_netfilterСоздайте sysctl-конфигурацию:
nano /etc/sysctl.d/kubernetes.confДобавьте:
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
Примените настройки:
sysctl --system3. Установка containerd
Установите зависимости и добавьте репозиторий Docker (не меняет выбор рантайма — устанавливаем containerd.io):
apt install curl gnupg2 software-properties-common apt-transport-https ca-certificates -ycurl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmour -o /etc/apt/trusted.gpg.d/docker.gpg
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"Обновите и установите containerd:
apt update -y
apt install containerd.io -yСгенерируйте конфигурацию и включите systemd cgroup для совместимости с Kubernetes:
containerd config default | tee /etc/containerd/config.toml >/dev/null 2>&1
sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.tomlПерезапустите службу:
systemctl restart containerd4. Установка компонентов Kubernetes (kubeadm/kubelet/kubectl)
Добавьте репозиторий Kubernetes:
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"Установите пакеты:
apt update -y
apt install kubelet kubeadm kubectl -yЗаблокируйте версии (рекомендуется для production) с помощью apt-mark hold kubelet kubeadm kubectl.
5. Инициализация кластера на Master
Запустите на master:
kubeadm init --control-plane-endpoint=kubernetes-master-ipВ выводе вы получите инструкции по настройке kubectl и команду kubeadm join для worker-узлов. Пример вывода, который вы получите:
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
You can now join any number of control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root:
kubeadm join kubernetes-master-ip:6443 --token chmz7m.fbjgdcqne1q0ff4t \
--discovery-token-ca-cert-hash sha256:c614bf14af27472e470546539a9a2ff63e5d558dbbb3cc06d6f7a030fcb55426 \
--control-plane
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join kubernetes-master-ip:6443 --token chmz7m.fbjgdcqne1q0ff4t \
--discovery-token-ca-cert-hash sha256:c614bf14af27472e470546539a9a2ff63e5d558dbbb3cc06d6f7a030fcb55426
После инициализации выполните инструкции для настройки kubectl (как обычный пользователь):
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config6. Присоединение Worker-узла(ов)
На каждом Worker выполните команду join (возьмите её из вывода kubeadm init):
kubeadm join kubernetes-master-ip:6443 --token chmz7m.fbjgdcqne1q0ff4t --discovery-token-ca-cert-hash sha256:c614bf14af27472e470546539a9a2ff63e5d558dbbb3cc06d6f7a030fcb55426Пример вывода успешного присоединения:
[preflight] Running pre-flight checks
[WARNING SystemVerification]: missing optional cgroups: blkio
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Starting the kubelet
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
На master проверьте узлы:
kubectl get nodes7. Установка сетевого плагина Calico
На master скачайте и примените манифест Calico:
curl https://projectcalico.docs.tigera.io/manifests/calico.yaml -O calico.yaml
kubectl apply -f calico.yamlОжидаемый вывод создания ресурсов (фрагмент):
poddisruptionbudget.policy/calico-kube-controllers created
serviceaccount/calico-kube-controllers created
serviceaccount/calico-node created
configmap/calico-config created
customresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalico.org created
... (и другие ресурсы)Проверьте Pods в пространстве имён kube-system:
kubectl get pods -n kube-systemПример вывода:
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-58dbc876ff-nh2st 1/1 Running 0 5m58s
calico-node-7cfz7 1/1 Running 0 5m58s
calico-node-lt5cv 1/1 Running 0 5m58s
coredns-565d847f94-dm6qc 1/1 Running 0 21m
...Убедитесь, что все узлы находятся в состоянии Ready:
kubectl get nodesОжидаемый пример:
NAME STATUS ROLES AGE VERSION
k8smaster.example.net Ready control-plane 22m v1.25.0
kubernetes Ready 14m v1.25.08. Развёртывание тестового приложения (nginx)
Создайте деплоймент и service:
kubectl create deployment nginx-app --image=nginx --replicas=2
kubectl get deployment nginx-appОжидаемый вывод:
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-app 2/2 2 2 13sЭкспозиция через NodePort:
kubectl expose deployment nginx-app --type=NodePort --port=80
kubectl get svc nginx-appПример вывода:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-app NodePort 10.109.89.196 80:30921/TCP 14sДетали сервиса:
kubectl describe svc nginx-appПример вывода (фрагмент):
Name: nginx-app
Namespace: default
Labels: app=nginx-app
Selector: app=nginx-app
Type: NodePort
IP: 10.109.89.196
Port: 80/TCP
NodePort: 30921/TCP
Endpoints: 192.168.192.129:80,192.168.192.130:80Проверьте ответ сервера (замените IP на ClusterIP или используйте Node IP:NodePort для доступа извне):
curl http://10.109.89.196Вы увидите HTML-страницу приветствия nginx, если всё работает.
Критерии приёмки
- kubeadm init успешно завершён на master.
- Все узлы в kubectl get nodes имеют статус Ready.
- Pods kube-system (coredns, calico и т. п.) в состоянии Running.
- Тестовый деплоймент nginx доступен и возвращает 200 OK.
Чеклист ролей (Master / Worker / Оператор)
- Master: установка kubeadm, kubelet, kubectl; инициализация кластера; установка сетевого плагина.
- Worker: установка containerd, kubeadm, kubelet; выполнение kubeadm join.
- Оператор: проверка pod’ов, мониторинг и обновления компонентов.
Безопасность и hardening (ключевые рекомендации)
- Блокируйте версии kubelet/kubeadm/kubectl через apt-mark.
- Настройте RBAC и выдачу минимально необходимых прав сервис-аккаунтам.
- Ограничьте доступ к API-server по сети (firewall / приватные сети).
- Регулярно обновляйте образа и патчи операционной системы.
Когда этот подход не подходит
- Для локальной разработки проще использовать minikube, kind или microk8s.
- Для production с SLA и управлением лучше рассмотреть управляемые Kubernetes-сервисы (EKS/GKE/AKS или провайдеры в вашем регионе).
Альтернативы
- microk8s — лёгкий single-node / multi-node вариант от Canonical.
- kind — для тестов локально с Docker-in-Docker.
- Управляемые кластеры провайдеров (если не хочется управлять control-plane самостоятельно).
Технические советы и отладка
- Если Pods в kube-system не переходят в Running, проверьте логи kubelet и контейнеров: journalctl -u kubelet и kubectl -n kube-system logs
. - Проверьте, что swap отключён и SystemdCgroup включён в /etc/containerd/config.toml.
- Для проблем с сетью проверьте, что ip_forward включён и br_netfilter загружен.
Краткий глоссарий (1 строка на термин)
- kubeadm: инструмент для инициализации кластера и присоединения узлов.
- kubelet: агент на узле, отвечающий за запуск Pod’ов.
- kubectl: CLI для управления Kubernetes.
- containerd: контейнерный рантайм для запуска контейнеров.
- Calico: сетевой плагин для Kubernetes с поддержкой сетевых политик.
Частые вопросы
Как восстановить истёкший токен join?
Сгенерируйте новый токен на master: kubeadm token create –print-join-command.
Нужен ли Docker для Kubernetes?
Нет. В современных версиях Kubernetes Docker как runtime больше не обязателен; обычно используют containerd или CRI-O.
Как обновить Kubernetes в кластере?
Обновление control-plane и kubelet требует планирования; следуйте официальной документации по поэтапному обновлению версий.
Итоги
- Вы успешно развернули кластер Kubernetes на Ubuntu 22.04: подготовили ядро и sysctl, установили containerd, добавили Kubernetes-пакеты, инициализировали мастер, подключили воркеры, установили Calico и развернули nginx.
- Следующие шаги: настроить мониторинг, логи и резервирование etcd для production-окружения.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента