Развертывание Kubernetes-кластера и системы мониторинга часто воспринимается как сложная задача, которая требует глубоких знаний и значительных временных затрат. Однако современные инструменты автоматизации позволяют существенно упростить этот процесс, поэтому разобраться смогут и начинающие специалисты.

Привет, Хабр! Меня зовут Катя Низовцева, я системный администратор в Selectel. В этой статье мы подробно рассмотрим, как с помощью Kubespray быстро и эффективно развернуть работоспособный Kubernetes-кластер, а также интегрировать с ним систему мониторинга VictoriaMetrics. Этот подход особенно полезен, когда необходимо оперативно создать тестовое окружение или подготовить базовую инфраструктуру для дальнейшего развития.

Что вы узнаете

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

Вы узнаете, как подготовить инфраструктуру для развертывания, какие настройки Kubespray требуют особого внимания, а также — как правильно установить и настроить VictoriaMetrics. Все это будет полезно системным администраторам, осваивающим контейнерные технологии, DevOps-инженерам, которые ищут способы ускорения развертывания инфраструктуры, и разработчикам.

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

Схема развертывания K8s-кластера через Kubespray

Kubespray — это набор готовых сценариев (playbooks) для Ansible, которые автоматизируют установку и настройку Kubernetes-кластера. Вместо того чтобы вручную настраивать каждую ноду, вы описываете конфигурацию в файлах, а Kubespray делает всю работу за вас.

Итоговая схема.
Итоговая схема.

Что мы здесь видим? Первое — вспомогательную ВМ, на которой у нас будет установлен Ansible. Это может быть также ваш локальный хост. Тестовый кластер же будет состоять из одной мастер-ноды и воркер-ноды. 

Мастер-нода (control plane) — это «мозг» кластера, управляющий всеми процессами. Она отвечает за принятие решений о размещении подов, отслеживание состояния кластера, обработку API-запросов и хранение конфигурации в etcd.

Воркер-нода — это нода, на которой непосредственно запускаются ваши приложения (поды).

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

Предварительно подготовим инфраструктуру в панели управления.

Облачный сервер с криперами и порталом в Незер. Добывайте ресурсы, стройте объекты, исследуйте мир Selectel в Minecraft и получайте призы.

Исследовать →

Шаг 1. Создаем сеть для будущего кластера

Создаем новую приватную сеть в интересующем пуле, с интересующим CIDR. Эта подсеть будет использоваться для нод, входящих в состав кластера. Для этого переходим во вкладку Продукты → Облачная платформа → Облачные серверы → Сеть → Приватные сети.

Внимание! DHCP лучше выключить, так как по истечению DHCP-lease IP-адрес с ноды может пропасть, что повлечет за собой проблемы в сети.

Отлично. Далее создаем облачный роутер в том же пуле и подключаем его к внешней сети. Это можно сделать во вкладке Продукты → Облачная платформа → Облачные серверы → Сеть → Облачные роутеры.

Затем подключаем ранее созданную приватную сеть к этому роутеру.

Шаг 2. Создаем виртуальные машины

Далее перейдем во вкладку Продукты → Облачная платформа → Облачные серверы и нажмем кнопку Создать сервер.

На всех ВМ в качестве ОС выбрана Ubuntu 24.04. Используемые конфигурации для ВМ под разные функциональности описаны ниже. При этом они именно рекомендуемые для тестовой среды, но могут быть изменены в зависимости от нагрузки.

  • Виртуальная машина с Ansible: 1 vCPU, 2 ГБ RAM, 20 ГБ диска.

  • Мастер-нода кластера: 2 vCPU, 4 ГБ RAM, 20 ГБ диска.

  • Воркер-нода кластера: 1 vCPU, 2 ГБ RAM, 10 ГБ диска.

В качестве приватной сети выбираем созданную ранее нами подсеть. 

Ниже — пример создания мастер-ноды:

В разделе Доступ добавляем свой SSH-ключ, так как вместе с Ubuntu 24.04 LTS 64-bit необходимо использовать SSH-ключ.

По аналогии повторяем процесс для воркер-ноды (kubernetes-worker) и ВМ с Ansible (ansible).

О безопасности. По умолчанию ВМ получает публичный IP, но его можно заменить на доступ через облачный роутер с опциональным файрволом. Файрвол — это важный шаг для защиты кластера. Подробнее о межсетевом экране на облачном роутере можно почитать в документации.

Шаг 3. Подготовка ВМ с Ansible

1. Для начала нам нужно обновить и установить необходимые пакеты, а также сгенерировать SSH-ключ для безопасного подключения к нодам.

sudo apt update
sudo apt install python3.12-venv python3.12-dev -y
sudo apt install ansible
sudo apt install python3-pip
ssh-keygen 

2. На хостах будущего Kubernetes-кластера добавляем ключ этой ВМ в авторизованные:

# Просмотр локального ключа
cat /root/.ssh/название ключа.pub 

# Добавление ключа на ВМ от других ВМ
mkdir -p ~/.ssh
echo "ssh-..." >> ~/.ssh/authorized_keys

3. Далее снова переходим к ВМ с Ansible, клонируем официальный репозиторий Kubepsray. 

Внимание! Версия Kubespray может меняться — стоит проверить актуальный стабильный релиз на GitHub.

sudo apt install git
git clone https://github.com/kubernetes-sigs/kubespray.git --branch release-2.27

4. Зададим переменные окружения, создадим и запустим виртуальное окружение Python, а также установим необходимые зависимости для проекта, которые указаны в файле requirements.txt.

С помощью виртуального окружения зависимости проекта не конфликтуют с глобальными пакетами системы.

cd kubespray/

VENVDIR=kubespray-venv
KUBESPRAYDIR=kubespray

python3 -m venv $VENVDIR
source $VENVDIR/bin/activate

pip install -U -r requirements.txt
cp -rfp inventory/sample inventory/mycluster

Примечание. Если же вы используете хост в другой подсети, то вам необходимо обеспечить сетевую связность между ВМ c Ansible и будущими нодами вашего Kubernetes-кластера. Если ВМ находятся в одном пуле, то достаточно будет эти две сети подключить к одному облачному роутеру. А если ВМ будут находиться  в разных пулах, то связность обеспечивается через глобальный роутер.

Далее заполняем файл hosts.yaml в папке /inventory/mycluster для описания IP-адресов всех серверов и их ролей в кластере Kubernetes.

apt install vim # Вы можете воспользоваться любым другим удобным редактором файлов для Linux, в рамках данной статьи мы работаем с vim

cd inventory/mycluster/
vim hosts.yaml

Файл будет такого вида:

all:
  hosts:
    master:
      ansible_host: 10.233.22.2
      ip: 10.233.22.2
      access_ip: 10.233.22.2
    node1:
      ansible_host: 10.233.22.3
      ip: 10.233.22.3
      access_ip: 10.233.22.3
  children:
    kube_control_plane:
      hosts:
        master:
    kube_node:
      hosts:
        node1:
    etcd:
      hosts:
        master:
    k8s_cluster:
      children:
        kube_control_plane:
        kube_node:
    calico_rr:
      hosts: {}

В файле выше мы обозначили, что на мастер-ноде устанавливаются компоненты для control-panel и ETCD запускается также на нем. ETCD — это хранилище, где Kubernetes держит все настройки и данные о работе кластера.

Далее отредактируем файл all.yml в папке group_vars/all, где укажем NTP и DNS upstream-серверы для корректной работы кластера.

cd group_vars/all
vim all.yml 

В этом файле можно поменять настройки перед установкой (зависит от требований к кластеру), например, включить NTP и настроить использование DNS-серверов Selectel:

ntp_enabled: true
ntp_servers:
  - "0.pool.ntp.org iburst"
  - "1.pool.ntp.org iburst"
  - "2.pool.ntp.org iburst"
  - "3.pool.ntp.org iburst"
...
upstream_dns_servers:
  - 188.93.16.19
  - 188.93.17.19

Обратите внимание: в качестве upstream DNS серверов указываются серверы Selectel. Их IP-адреса можно найти в документации.

Опционально. Вы можете внести некоторые изменения еще в файлы:

cd ..
cd k8s_cluster/
vim k8s-cluster.yml 
vim addons.yml

В файле k8s-cluster.yaml можно указать, например, желаемый CNI (Container Network Interface), сеть для подов, а также включить настройку компонентов для PV (Persistent Volumes) и многое другое.

В файле addons.yaml прописано включение ArgoCD, Helm, Ingress Nginx и другое. Изменять настройки по умолчанию мы, конечно, не будем.

Шаг 4. Запуск создания Kubernetes кластера

Далее на ВМ с Ansible выходим в папку /kubespray, из которой запустим уже непосредственно создание кластера через ansible-playbook:

cd
cd kubespray
ansible-playbook -i inventory/mycluster/hosts.yaml --become cluster.yml --become-user=root

Ждем около 15-20 минут. И проверяем состояние нод, например с мастер-ноды, специальной kubectl-командой. Ноды должны быть в статусе Ready:

root@kubernetes-master:~# kubectl get node
NAME     STATUS   ROLES           AGE     VERSION
master   Ready    control-plane   6m40s   v1.31.9
node1    Ready    <none>          6m3s    v1.31.9

Шаг 5. Развертывание кластера VictoriaMetrics

В рамках данной статьи развернем кластер VictoriaMetrics, состоящей из одной виртуальной машины.

Почему VictoriaMetrics? Это легковесная, но мощная альтернатива Prometheus для хранения метрик, с низким потреблением ресурсов и полной совместимостью с PromQL. Вместе они позволяют быстро развернуть кластер с эффективной системой мониторинга, подходящей как для тестов, так и для продакшена.

1. Создаем новую ВМ. Конфигурация в тестовой среде следующая: 1 vCPU, 2 ГБ RAM, 10 ГБ универсального SSD-диска. Конфигурация сервера с VictoriaMetrics зависит от того, сколько метрик вы будете собирать.

2. Для упрощения инфраструктуры и настройки сейчас помещаем виртуальную машину в ту же приватную подсеть, где у нас располагается кластер, в нашем случае — в сеть kubernetes-cluster.

3. Выполняем на новой виртуальной машине команды:

# Обновление и установка нужных пакетов
apt update
apt install tar wget curl

4. Далее ищем желаемый релиз на ресурсе и, например, если выбираем версию 1.120.0, то устанавливаем такой командой:

wget https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v1.120.0/victoria-metrics-linux-amd64-v1.120.0.tar.gz

Версия VictoriaMetrics может меняться — стоит проверить актуальный стабильный релиз на GitHub.

# Распаковка архива:
tar zxf victoria-metrics-linux-amd64-*.tar.gz -C /usr/local/bin/

5. Следующим шагом создаем и настраиваем systemd-юнит:

# Создание нового пользователя по соображениям безопасности
useradd -r -c 'VictoriaMetrics' victoriametrics

# Создание каталога для хранения данных
mkdir -p /var/lib/victoriametrics /run/victoriametrics

# Создание systemd-юнита
vim /etc/systemd/system/victoriametrics.service
[Unit]
Description=VictoriaMetrics
After=network.target

[Service]
Type=simple
User=victoriametrics
PIDFile=/run/victoriametrics/victoriametrics.pid
ExecStart=/usr/local/bin/victoria-metrics-prod -storageDataPath /var/lib/victoriametrics -retentionPeriod 12
ExecStop=/bin/kill -s SIGTERM $MAINPID
StartLimitBurst=5
StartLimitInterval=0
Restart=on-failure
RestartSec=1

[Install]
WantedBy=multi-user.target

# -retentionPeriod 12 - означает срок хранения метрик в месяцах.
# Обновление конфигурации systemd после изменения юнита:
systemctl daemon-reload

# Включение нашего юнита
systemctl enable victoriametrics

# Проверка его статуса
systemctl status victoriametrics

5. Проверяем доступность ноды с VictoriaMetrics, например, с воркер-ноды кластера — и готово.

root@node1:~# curl http://10.234.56.144:8428
<h2>Single-node VictoriaMetrics</h2>

VictoriaMetrics по умолчанию слушает запросы на порту 8428. Если вы захотите настроить файрвол, оставьте доступ для подключения по TCP по этому порту к ВМ.

Заключение

Теперь у вас есть работающий Kubernetes-кластер и VictoriaMetrics для сбора метрик. В следующих статьях мы расскажем, как настроить сбор метрик с помощью VMAgent и обеспечить безопасность инфраструктуры.

Обратите внимание: текущая конфигурация пока не включает важные элементы безопасности. Мы не настраивали файрвол, не ограничивали доступ к узлам и не конфигурировали безопасное взаимодействие между компонентами. Эти аспекты критически важны для продакшен-среды, поэтому мы обязательно рассмотрим их в следующих публикациях, где покажем комплексный подход к защите кластера и системы мониторинга.

Комментарии (9)


  1. S1M
    06.08.2025 14:35

    А зачем мы делали declare -a IPS=(*IP мастер-ноды* IP-воркер-ноды)) , если оно нигде не используется?

    Наверное потому. что раньше был скрипт. который генерировал конфиг, а его убрали ?))


    1. monreve Автор
      06.08.2025 14:35

      да, действительно, это лишнее в рамках данной статьи, так как вариант заполнения конфиг файла остается за рамками этой статьи. спасибо, что заметили, удалила этот момент)


  1. trabl
    06.08.2025 14:35

    Как развернуть куб с помощью кубспрей знают не только лишь все. Больше похоже на гайд (рекламу) по созданию инфраструктуры в Selectel для начинающих.


    1. RomanKu
      06.08.2025 14:35

      Тоже не покидало данное ощущение. Больше половины экранной статьи посвящено селектелу, а дальше бац и у нас уже развернут k8s, а потом целый кластер VictoriaMetrics из одной ноды (а почему решили поднимать кластер, а не единую ноду?), который сообщает <h2>Single-node VictoriaMetrics</h2>


      1. monreve Автор
        06.08.2025 14:35

        Тут ниже в комментариях отписала, что подготовка кластера k8s и ВМ с VictoriaMetrics по данной статье жестко по сути никак не завязана именно на инфраструктуре Selectel, однако это блог компании Selectel)

        По поводу того, почему разворачиваем single-node - суть в том, чтобы идти от простого к сложному. Сужу по себе - мне итак было сложно понять, а как снимаются метрики, а зачем, а куда, а тут еще и разбраться как работает кластерная VictoriaMetrics начинающему человеку (ведь в названии статьи есть фраза "для начинающих"), как ее развернуть и много-много других вопросов, поэтому решила взять самое простое решение у VictoriaMetrics.


    1. monreve Автор
      06.08.2025 14:35

      Добрый день. Целью данной статьи было показать, без сильных углублений и усложнений, как развернуть кластер k8s и ВМ с VictoriaMetrics для дальнейшнего показа, как скрейпить метрики с кластера и складывать их в VM (в следующей статье). По данной статье возможно подготовить кластер на любой другой инфраструктуре, однако так как это блог компании Selectel, то, что логично, инфраструктура была развернута на инфраструктуре Selectel.


  1. gecube
    06.08.2025 14:35

    Кубеспрей - точно нет. Отказать. Лучше бы показали как терраформом менеджед кластер в селектеле развернуть - быстро, без смс и регистраций

    Выбор ВМ под Викторию еще более странен, коли есть кластер. У Вики прекрасный оператор, хельм чарт - бери и ставь в Kubernetes напрямую.


    1. monreve Автор
      06.08.2025 14:35

      Вот здесь есть пошаговая инструкция разворота MKS в selectel через terraform, с манифестами - https://habr.com/ru/companies/selectel/articles/830810/


      1. gecube
        06.08.2025 14:35

        Приватный Kubernetes за 50 минут

        это долго. Должно быть 10 минут от силы - как в Таймвеб.