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

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

• 5 min read • DevOps • Обновлено 16 Nov 2025
Kubernetes на Ubuntu 22.04: установка и запуск
Kubernetes на Ubuntu 22.04: установка и запуск

Схема установки кластера 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.
  • Доступ к интернету для загрузки пакетов и манифестов.

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

  1. Обновить систему и отключить swap.
  2. Загрузить kernel-модули и применить sysctl-параметры.
  3. Установить containerd и настроить Systemd cgroup.
  4. Установить kubeadm, kubelet, kubectl из репозитория Kubernetes.
  5. Инициализировать кластер на master и подключить worker-узлы.
  6. Установить сетевой плагин (Calico) и проверить состояние.
  7. Развернуть тестовое приложение (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 --system

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

Установите зависимости и добавьте репозиторий Docker (не меняет выбор рантайма — устанавливаем containerd.io):

apt install curl gnupg2 software-properties-common apt-transport-https ca-certificates -y
curl -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 containerd

4. Установка компонентов 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/config

6. Присоединение 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 nodes

7. Установка сетевого плагина 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.0

8. Развёртывание тестового приложения (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-окружения.
Поделиться: 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 быстро