Top.Mail.Ru
Гайд по развертыванию Kubernetes | Блог Serverflow Скачать
прайс-лист
Бесплатная
доставка по РФ
Скидка
за отзыв!
Из-за нестабильности цен RAM фактическая стоимость может отличаться. Цена подтверждается после оформления заказа, работаем над обновлением цен!
Distribution of
Server Components
8 (800) 222-70-01 Консультация IT-специалиста Сравнение

Гайд по развертыванию Kubernetes

~ 15 мин
248
Средний
Гайды
Гайд по развертыванию Kubernetes

Введение

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

Подготовка к развертыванию Kubernetes

Если вы думаете, что установить и запустить Kubernetes можно “на ход ноги”, то вы ошибаетесь. Для его установки нужно учесть ряд системных требований, а для работы платформы вам понадобится сразу несколько запущенных сервисов. Вот какие минимальные характеристики должны быть у вашего устройства для установки и запуска Kubernetes:
  • 2 ГБ ОЗУ;
  • 2-ядерный CPU;
  • Сетевая связанность между нодами;
  • Накопитель данных, объем которого зависит от ваших требований.
Стоит отметить, что количество ядер и объем оперативной памяти имеют не самое важное значение — главным требованием является скорость сети, объединяющей узлы в единый кластер, а увеличение иных ресурсов необходимо только в случае масштабирования запускаемых подов (контейнеров) в вашем кластере. Прежде чем запускать ваш, рекомендуем заранее рассчитать требуемые характеристики под выбранное количество контейнеров. В рамках нашего гайда мы будем использовать конфигурацию с минимальными системными требованиями из 3 машин: 1 мастер-сервер и 2 рабочие ноды. Наша виртуальная машина имеет 2 ГБ оперативной памяти, 2 ядра CPU, 50 ГБ SSD диска, а также 1 Гбит связанность между всеми нодами. Для ее создания использовалось окружение Proxmox с утилитами Packer и Terraform, но вы также можете развернуть кластер в облачной среде.

Характеристики тестового стенда kubernetes
Характеристики тестового стенда для развертывания Kubernetes.

Установка кластера

Как известно, Kubernetes является оркестратором контейнеров, поэтому очевидно, что для его работы требуется контейнер runtime, который будет отвечать за запускать других контейнеров контейнеры. Ранее платформа Kubernetes могла запускаться напрямую через Docker Engine за счет компонента dockershim, но начиная с версии 1.24. эта функция стала не рекомендованной и больше не поддерживается из коробки, поскольку Docker был несовместим Container Runtime Interface (CRI), а компонент dockershim и вовсе был удален из-за проблем с безопасностью и массы ограничений. Ввиду этих изменений, теперь для использования Docker требуется установить утилиту cri-dockerd адаптер, что усложняет процесс установки и поддержки. На данный момент актуальным рекомендованным контейнером runtime является container-d, который мы задействуем для развертывания Kubernetes в нашей системе. После завершения установки runtime, можно переходить к загрузке пакетов и иных файлов, необходимых для работы Kubernetes. Стоит отметить, что все команды для установки файлов Kubernetes необходимо повторить на всех серверах.

Для начала выполните базовое обновление пакетов вашей операционной системы. Несмотря на то, что в нашем тесте мы используем последнюю актуальную версию Ubuntu, Update и Upgrade репозиториев являются очень важной частью установки каких-либо пакетов. Затем необходимо подготовить ядро ОС к запуску — для этого нам требуется внести несколько изменений в модуле, а также параметры ядра. Чтобы выполнить эти операции, необходимо ввести следующую команду:

sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
overlay
EOF

sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

sudo sysctl --system

Эта команда дает системе K8S задачу использовать два других модуля: br-netfilter (фильтр трафика) и overlay (модуль оптимизации контейнеров). Также эта команда меняет параметры ядра из категории NetBridge и net.bridge и net.ipv4, благодаря чему система сможет использовать ноды как роутеры или маршрутизаторы, что впоследствии будет использоваться CNI для корректного встраивания VLAN-сети. Для сохранения и применения всех изменений, введите команду sudo sysctl --system.

Следующий шаг — установка containerd. Это можно сделать через apt в системах на базе Ubuntu Linux. Затем введите следующие команды, которые создадут директорию container-d и конфигурацию по умолчанию:

sudo apt install -y containerd
sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml
sudo systemctl restart containerd
sudo systemctl enable containerd

Затем нужно перезапустить containerd и включить запуск containerd при загрузке (boot) системы.
Теперь container-d установлен, но наш кластер все еще не подготовлен к работе, поскольку требуется загрузить еще несколько критически важных компонентов:
  • kubeadm -– компонент для установки кластера и подключения к нему.
  • kubectl — консольная утилита, которая позволяет взаимодействовать с подами, сервисами и другими ресурсами Kubernetes.
  • kublet — daemon, который позволяет кластеру взаимодействовать с системой и делает ее частью кластера.
Теперь необходимо установить curl, GPG и другие зависимости, требуемые для добавления репозитория с Kubernetes. Эти операции выполняются с помощью этих команд:

sudo apt-get install -y apt-transport-https ca-certificates curl gpg

curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.32/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.32/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
sudo systemctl enable --now kubelet

После этого введите команду apt-mark hold, которая пометит новые компоненты, чтобы systemctl их не обновляла, а также пометила kublet как сервис, который нужно запускать с помощью systemctl при загрузке системы. Следующая задача: внести изменения в конфиг container-d и конфиг kublet. Для этого введите эту команду, благодаря которой container-d будет использовать systemd cgroups, а не другие компоненты.

sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sudo tee /var/lib/kubelet/config.yaml
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: systemd
sudo chown root:root /var/lib/kubelet/config.yaml
sudo chmod 644 /var/lib/kubelet/config.yaml

Далее, kubelet во время работы подтянет переменные от container-d и запустится с использованием драйвера system-d. Базовая подготовка системы выполнена, поэтому после повтора всех операций на всех машинах, необходимо перезагрузить систему, чтобы убедиться, что изменения будут сохранены на всех машинах.

Запуск кластера

Виртуальные машины загружены и готовы к установке Kubernetes в кластер. Для начала, выберите одну виртуальную машину, которая будет использоваться в качестве мастер-узла, после чего введите команду для инициализации кластера через kubeadm:

sudo kubeadm init \
  --kubernetes-version=v1.32.0 \
  --control-plane-endpoint "192.168.0.201:6443" \
  --pod-network-cidr=10.244.0.0/16

У этой команды есть три параметра:
  • kubernetes-version — окно ввода используемой кластером версии Kubernetes. Позволяет устранить проблемы совместимости компонентов оркестратора.
  • control-plane-endpoint — окно ввода IP-адреса мастер-узла. По умолчанию порт 6443 является адресом Kubernetes API.
  • pod-network-cidr — окно ввода сети 10.244.0.0/16, которая используется подами системы. Важно понимать, что сеть должна совпадать в точности с тем, что написано в вашем CNI.
После заполнения параметров нужно подождать, когда установится кластер. Когда кластер загрузится, система выпишет ряд команд, которые будут использоваться в дальнейшей настройке кластера. Важно скопировать команду kubedm join, которая будет использоваться для подключения рабочих нод в кластер. Вы также увидите несколько способов получить конфиг для работы с кластером. Так как мы работаем от пользователя не root, мы используем первый конфиг — помимо этого, он позволит взаимодействовать с kubectl от лица обычного пользователя.

Три рабочие ноды кластера Kubernetes
Контроль работоспособности запущенных рабочих нод.

CNI и flannel

Следующий шаг — настройка сети и установка flannel. Сетевая связанность внутри кластера является крайне важной, если не самой важной частью Kubernetes. Для управления сетью используется CNI (Container Network Interface) — он отвечает за настройку сети, подсети, политик безопасности и других аспектов, связанных с работой сетью в кластере. Есть три популярных открытых CNI для работы сети в кластере: Сilium, Сalico и Flannel. Сilium является наиболее продвинутым, но в то же время и самым сложным в освоении, тогда как Flannel наиболее прост и удобен, ввиду чего мы будем пользоваться именно Flannel. Для использования Flannel необходимо установить yaml манифест.

Затем необходимо применить команду kubectl apply -f kube-flannel.yml, которая разворачивает сущности Kubernetes, после чего введите sudo crictl ps -a (аналог docker ps -a) чтобы отследить, что этап установки пройден.

Установка рабочих нод

Когда Flannel установлен, control plane node переходит в статус ready, благодаря чему он может взаимодействовать с сетью и отправлять поды на рабочие узлы. Теперь можно подключить каждую рабочую ноду с помощью ранее сохраненной команды kubedm join. После загрузки компонентов и перехода воркеров в статус ready они становятся полноценной частью кластера. Вы также можете выдать рабочим нодам определенные роли в соответствующем поле, но это изменение будет лишь косметическим, поскольку роли не будут влиять на поды и выполнение рабочих процессов кластера. Выдача роли выполняется с помощью команды

Запуск тестового приложения

Наш кластер готов: все компоненты скачаны, серверы распределены на мастер-узел и рабочие узлы, установлен компонент для контроля сети. Теперь мы наглядно покажем вам процесс создания подов на живом примере, где мы запустим тестовое приложение в новоиспеченном контейнером кластере. Для этого введите команду kubectl run nginx --image=nginx , которая запустит под, после чего введите команду kubectl get pods для получения списка работающих подов. После проверки работоспособности нового пода необходимо получить его IP-адрес. Для этого добавим в нашу предыдущую команду приписку kubectl get pods -o wide — эта команда покажет ноду, на которой запущен под, и выдаст его IP-адрес. Введя команду curl вы сможете узнать, запущен ли nginx.

Рабочие ноды обращаются к сети контейнера
Все рабочие ноды могут обращаться к сети контейнера.

Доступ к приложению

Поскольку запуск контейнера и обращения к нему из кластера не имеет практического смысла, необходимо воспользоваться deployment и сервисом. Для этого перейдите консоль мастер-узла для создания первого deployment nginx. Чтобы создать deployment nginx, сначала вам понадобиться создать его манифест, который содержит в себе порт, доступный в контейнере. Созданный deployment будет иметь сразу две реплики после создания, благодаря чему его можно подключить сразу к двум рабочим узлам. Запустите deployment командой kubectl apply -f nginx-deploy и проверьте его работу через команду kubectl get deployment.

Пока что кластер имеет внутренние IP-адреса и к нему нельзя обращаться извне. Чтобы исправить это, необходимо использовать service Kubernetes. Чтобы он подключился к nginx, для него также нужно создать отдельный манифест — внутри него нужно использовать сервис с типом NodePort, который позволяет пробросить порт из диапазона 30000-32767 с IP-адреса физической ноды внутрь какого-либо контейнера. В нашем тесте мы пробросим его на порт deployment nginx. Затем примените новый манифест сервиса с помощью команды kubectl apply. Теперь ваше приложение доступно к подключению извне, а ваш кластер полностью готов к полноценной работе с контейнерами.

Выводы

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

Комментарии 0

Написать комментарий
Сейчас тут ничего нет. Ваш комментарий может стать первым.
Написать отзыв
До 6 фото, размером до 12Мб каждое
Мы получили ваш отзыв!

Он появится на сайте после модерации.

Написать комментарий

Комментарий появится на сайте после предварительной модерации

До 6 фото, размером до 12Мб каждое
Мы получили ваш отзыв!

Он появится на сайте после модерации.

Мы свяжемся с вами утром

График работы: Пн-Пт 10:00-18:30 (по МСК)

Обработаем вашу заявку
в ближайший рабочий день

График работы: Пн-Пт 10:00-18:30 (по МСК)