Инструкция обновлена 29 октября 2025 г.
Kubernetes вот уже на протяжении почти 10 лет занимает лидирующие позиции в категории оркестраторов для контейнерных приложений. Проект, запущенный корпорацией Google в середине 2014 года, быстро завоевал всеобщую популярность и поддержку.
Kubernetes поддерживает весь цикл управления контейнерными приложениями от загрузки образа из реестра до полноценного запуска контейнера.
В данной статье мы установим Kubernetes-кластер, состоящий из трех нод (узлов), включающий в себя одну мастер-ноду (master) и две рабочие ноды (worker).
кубер
Предварительные требования
Для установки кластера Kubernetes необходимо следующее:
-
Два сервера с установленной операционной системой Ubuntu 22.04 или Ubuntu 24.04. На каждом сервере должно быть минимум 2 ГБ оперативной памяти и минимум 2 ядра процессора. Если не учесть данное требование, то инициализировать кластер не получится.
Настройка операционной системы
Перед установкой и инициализацией кластера необходимо подготовить и настроить некоторые параметры на уровне операционной системы.
Команды, которые будут использоваться в данном разделе, необходимо выполнять на обоих серверах и от имени пользователя
rootили пользователя с правамиsudo.
1) Обновляем списки репозиториев, производим обновление всех пакетов в ОС, а также устанавливаем необходимые пакеты:
apt update && apt -y upgrade && apt -y install apt-transport-https ca-certificates curl gnupg2 software-properties-common
2) Далее необходимо выключить механизм SWAP. Для начала проверим, используется ли SWAP у нас в системе. Для этого можно воспользоваться командой free:
free -h

Как видно на скриншоте выше, SWAP не используется — в строке с именем Swap указаны нулевые значения.
Также можно воспользоваться командой swapon, которая выводит подробную информацию об используемых разделах SWAP в системе:
swapon -s

Если в ответ команда ничего не вернула, это говорит о том, что SWAP выключен и не используется.
Если же SWAP включен, то его необходимо выключить. В дистрибутивах Linux SWAP можно отключить 2 способами:
-
Первый способ — отключить SWAP временно.
Это означает, что SWAP будет выключен только до первой перезагрузки/выключения сервера. Чтобы выключить SWAP на время работы сервера, в терминале достаточно выполнить команду:
swapoff -a
Данный способ не рекомендуется использовать в связи с тем, что после перезагрузки/включения сервера узлы Kubernetes не смогут запуститься.
-
Второй способ — полное (перманентное) отключение SWAP.
В таком случае SWAP будет полностью выключен и не будет использоваться и после перезагрузки сервера. Для полного выключения SWAP необходимо открыть на редактирование файл fstab при помощи любого текстового редактора, например, nano:
nano /etc/fstab
Далее найти строку, содержащую значение swap.img, и закомментировать ее, прописав символ решетки (#):

Сохраняем и выходим из файла. Чтобы изменения были применены, необходимо перезапустить сервер при помощи команды reboot:
reboot
3) Следующим шагом необходимо загрузить дополнительные сетевые модули из ядра операционной системы. Делается это в два этапа.
На первом этапе создаем конфигурационный файл с именем k8s.conf и прописываем в нем те сетевые модули, которые нам необходимы: overlay и br_netfilter. Команда будет следующей:
cat <<EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

4) На втором этапе загружаем ранее указанные модули из ядра операционной системы при помощи команд:
modprobe overlay
modprobe br_netfilter

5) Проверяем, что сетевые модули были успешно загружены и активированы. Для этого выполним команду:
lsmod | egrep "br_netfilter|overlay"
Если напротив значений overlay и br_netfilter во втором столбце присутствует цифра 0, то модули успешно активированы.

6) Так как большинство сетевых плагинов (CNI) в Kubernetes используют встроенный в ядро Linux файрвол под названием netfilter, а также маршрутизируют трафик через сетевой мост (bridge), нам необходимо активировать соответствующие сетевые параметры, которые отвечают за маршрутизацию трафика через сетевой мост. Для этого выполняем команду:
cat <<EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF

7) Перезапускаем параметры ядра:
sysctl --system

8) При использовании брандмауэра UFW (Uncomplicated Firewall) или любого другого firewall (например, Iptables) необходимо открыть следующие порты: 6443, 2379, 2380, 10250, 10259, 10257.
Также UFW можно полностью выключить и убрать из автозагрузки:
systemctl stop ufw && systemctl disable ufw
На этом настройка операционной системы завершена. В следующих разделах мы перейдем к установке контейнерного движка CRI-O и установке Kubernetes.
Установка CRI-O
Так как Kubernetes самостоятельно не запускает контейнеры, ему необходим сторонний инструмент для таких задач — контейнерный движок. Движок для контейнеров (он же Container Runtime) предназначен для работы с контейнерами, включая инициализацию контейнеров, их запуск, остановку и т.д.
Мы будем устанавливать CRI-O — легковесный движок, который специально разработан для Kubernetes и прост в использовании.
Как и в предыдущем разделе, все команды, используемые ниже, необходимо выполнять на обоих серверах.
1) Добавляем официальный репозиторий CRI-O. Сначала скачиваем GPG-ключ от репозитория и устанавливаем его:
curl -fsSL https://download.opensuse.org/repositories/isv:/cri-o:/stable:/v1.32/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/cri-o-apt-keyring.gpg
2) Далее прописываем адрес репозитория CRI-O:
echo "deb [signed-by=/etc/apt/keyrings/cri-o-apt-keyring.gpg] https://download.opensuse.org/repositories/isv:/cri-o:/stable:/v1.32/deb/ /" | tee /etc/apt/sources.list.d/cri-o.list
3) Обновляем индекс репозиториев и устанавливаем пакет cri-o:
apt update && apt -y install cri-o
4) Запускаем crio и добавляем его в автозагрузку:
systemctl start crio && systemctl enable crio
5) Проверяем статус crio:
systemctl status crio

Если в статусе отображается Active (running), то crio успешно запущен и работает.
На этом установка CRI-O успешно завершена.
Установка Kubernetes
Переходим к установке Kubernetes. Подключение репозитория и установку пакетов Kubernetes необходимо выполнять на обоих серверах.
1) Добавляем GPG-ключ от репозитория Kubernetes:
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.33/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
2) Далее подключаем официальный репозиторий Kubernetes:
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.33/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
3) Обновляем списки репозиториев, устанавливаем пакеты kubelet, kubeadm, kubectl, а также делаем для них операцию hold — таким образом при появлении новых версий данных компонентов они не будут обновляться:
apt update && apt -y install kubelet kubeadm kubectl && apt-mark hold kubelet kubeadm kubectl
Дополнительно добавляем сервис kubelet в автозагрузку:
systemctl enable --now kubelet
4) Инициализируем мастер-ноду а также выделяем подсеть, адреса которой будут назначаться подам в кластере.
Эту команду выполняем только на одном сервере, который предназначен именно для мастер-ноды.
kubeadm init --pod-network-cidr=10.244.0.0/16

Подсеть 10.244.0.0/16 используется для работы flannel — специального плагина, который создает виртуальную сеть, разработанную для работы с контейнерами. flannel мы установим после того, как создадим кластер.
Процесс инициализации мастер-ноды может занимать от 5 минут и больше, в зависимости от скорости интернет-соединения. Сначала скачиваются образы необходимых компонентов Kubernetes: kube-apiserver, kube-controller-manager, kube-scheduler, kube-proxy, etcd, coredns; далее происходит первичная настройка, включающая в себя создание сертификатов безопасности, создание конфигурационных файлов и запуск подов.
5) После того как процесс инициализации мастер-ноды будет завершен (в терминале отобразится надпись «Your Kubernetes control-plane has initialized successfully!»), необходимо выполнить шаги, перечисленные в конце вывода, а именно:
-
Создать в домашней директории скрытую папку с именем
kube; -
Скопировать конфигурационный файл, содержащий данные для подключения к кластеру в ранее созданный каталог в домашней директории;
-
Назначить пользователя и группу на созданную директорию.
Сами команды приведены ниже. Также они всегда отображаются в конце вывода при успешной инициализации мастер-ноды:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

Обратите внимание на самую последнюю строку в выводе (kubeadm join) — там будет сгенерирована команда, предназначенная для присоединения рабочих нод. Сохраните эту команду отдельно, мы будем использовать ее далее.
6) Далее проверим статус кластера при помощи команды:
kubectl get nodes

Как можно увидеть на скриншоте выше, мастер-нода находится в статусе NotReady. Это возникает из-за того, что мы не установили CNI-плагин, который используется для организации сетевого взаимодействия. Ранее на этапе инициализации кластера мы выделили подсеть 10.244.0.0/16 для плагина flannel. Установим его при помощи команды:
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
Проверим статус кластера еще раз:
kubectl get nodes

Статус поменялся на Ready.
7) На втором сервере, который будет выступать в роли рабочей ноды, выполняем команду kubeadm join.

8) После того как рабочая нода была успешно присоединена, возвращаемся на мастер-ноду и выводим список всех нод кластера при помощи команды:
kubectl get nodes

Как можно увидеть на скриншоте выше, наш кластер состоит из двух нод: одной мастер-ноды и одной рабочей ноды.
9) Также выведем список всех подов в кластере, используя команду:
kubectl get po -A

Проверка работоспособности кластера
Проверим работоспособность кластера путем запуска веб-сервера Nginx.
1) Рассмотрим, как сделать это локально — при помощи командной строки и графического клиента Lens. Для начала нам нужно получить файл config, который содержит всю необходимую информацию для подключения и аутентификации. По умолчанию файл находится в /etc/kubernetes/admin.conf. Копируем данный файл себе на компьютер. Для этого можно использовать стороннее программное обеспечение, например MobaXterm, Termius, PSFTP и т.д.
2) Далее нам необходимо установить утилиту kubectl. Поддерживаются все основные операционные системы, включая Windows, macOS и Linux.
3) На примере Windows произведем подключение к кластеру Kubernetes. Можно сразу скачать исполняемый файл kubectl. Для этого в командной строке (cmd) выполняем команду:
curl -LO https://dl.k8s.io/release/v1.34.0/bin/windows/amd64/kubectl.exe
4) Нажимаем на сочетание клавиш Win + R и вводим:
systempropertiesadvanced

5) В появившемся меню нажимаем на кнопку «Переменные среды»:

6) В разделе «Переменные среды пользователя» выбираем «Path» и нажимаем на кнопку «Изменить»:

7) Нажимаем на кнопку «Создать»:

8) Прописываем полный путь до исполняемого файла kubectl.exe:

Для сохранения изменений нажимаем на кнопку OK.
9) Возвращаемся в командную строку. Задаем временную переменную с именем KUBECONFIG, которая будет действительна на время текущей сессии. В переменной пропишем полный путь до файла admin.conf:
set KUBECONFIG=D:\admin.conf
В данном примере файл находится на диске D.
Если переменная нужна на постоянной основе, то команда будет следующей:
setx KUBECONFIG “D:\admin.conf”
10) Проверим подключение к кластеру:
kubectl get nodes

Если подключение прошло успешно, то команда выведет список нод кластера.
11) Далее создаем файл nginx_deployment.yaml со следующим содержимым:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.16.1
ports:
- containerPort: 80
Обратите внимание что в языке разметки YAML необходимо соблюдать отступы строк, иначе файл станет невалидным.
Сохраняем изменения и выходим из файла.
11) Создаем наш deployment (в котором описаны настройки нашего приложения) при помощи команды:
kubectl apply -f nginx_deployment.yaml
12) Проверяем статус созданного deployment:
kubectl get po -n default

Так как мы ранее задали две реплики приложения (параметр replicas: 2), то у нас запущено два пода с приложением.
13) Далее необходимо проверить, может ли Nginx отвечать на запросы. Для начала необходимо получить IP-адрес пода. Для этого воспользуемся командой kubectl describe, передав в качестве параметра имя одного из запущенных подов:
kubectl describe pod nginx-deployment-8d94c585f-n8nzs

IP-адрес всегда отображается в параметре IP. В нашем примере — 10.244.1.3.
14) Проверим доступность Nginx при помощи механизма port-forward:
kubectl port-forward deployment/nginx-deployment 8080:80
Далее открываем браузер по адресу localhost:8080.

Мы успешно получили ответ от Nginx.
Чтобы получить доступ к кластеру Kubernetes через Lens, после установки необходимо:
-
Запустить программу и в главном окне раскрыть параметр «KUBERNETES CLUSTER».
-
Нажать правой кнопкой мыши по «Local Kubeconfigs».
-
В выпадающем меню выбрать «Add Kubeconfigs» → «From Filesystem»:

-
Перейти в директорию, где находится конфиг кластера, и нажать на кнопку «Sync»:

При успешном подключении кластер отобразит свои объекты:

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