6.20 Деплоймент Kubernetes на примере Ubuntu

Kubernetes Banner

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

Для тестирования и развертывания приложений нам нужен настроенный кластер Kubernetes. В статье мы рассмотрим развертывание кластера на одном сервере (single-node cluster) и на нескольких узлах (multi-node cluster), объясним нюансы установки и настройки, а также покажем, как запустить тестовое приложение.

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

Требования к серверу

Перед началом работы необходимо убедиться, что ваш сервер соответствует минимальным требованиям:

  • ОС: Ubuntu 22.04 или CentOS 8 (Ubuntu предпочтительнее, т.к. у него лучше поддержка Kubernetes);
  • Процессор: 4 ядра и выше;
  • ОЗУ: минимум 8 ГБ (для многонодовых кластеров рекомендуется 16 ГБ и выше);
  • Диск: минимум 50 ГБ свободного места;
  • Сетевое подключение: статический IP и открытые порты (6443, 10250, 10255, 30000-32767 и другие).
  • Kubernetes требует, чтобы swap был отключен, иначе kubelet работать не будет. На наших VPS это реализовано по умолчанию.

Для стабильной работы мастер-узла Kubernetes мы рекомендуем сервера на тарифе не менее Cloud-8.

Что такое мастер-узел, нода, под? Ознакомьтесь со связанной терминологией

Вот несколько ключевых понятий, которые стоит знать перед началом:

  • Контейнер — изолированная среда с приложением и всеми его зависимостями. Работает одинаково на любом сервере.

  • Под (Pod) — минимальная единица в Kubernetes, содержащая один или несколько контейнеров.

  • Манифест — YAML-файл с описанием объекта Kubernetes (например, развертывания или сервиса).

  • Нода (узел) — физическая или виртуальная машина в кластере.

  • Мастер-узел — главный узел, управляющий кластером.

  • Рабочий узел — узел, на котором запускаются контейнеры (поды).

  • Кластер – система связанных между собой узлов.

Пошаговая инструкция

Kubernetes использует контейнерный движок Docker для запуска контейнеров.

Совет: у нас существует отдельный, более детальный материал по установке и использованию Docker. Ознакомиться с ним можно по ссылке.

Настройка имен хостов (все узлы)

Начните с обновления файлов /etc/hosts и указания IP-адресов и имен хостов для каждого узла в кластере. Это обеспечит бесперебойную связь между главными и рабочими узлами.

  • Откройте файл /etc/hosts:
sudo nano /etc/hosts
  • Добавьте следующие записи. Это позволит разрешить разрешение имен хостов. Замените IP-адреса и имена хостов на свои актуальные для Ваших узлов:

Kubernetes prerequisites, etc/hosts

Сохраните изменения и выйдите.

  • Далее измените имена хостов в каждом узле:
Для главного узла Kubernetes
sudo hostnamectl set-hostname "kubernetes-master-node"
Для рабочего узла 1
sudo hostnamectl set-hostname "kubernetes-worker-node-1"
Для рабочего узла 2
sudo hostnamectl set-hostname "kubernetes-worker-node-1"
  • Чтобы изменения имени хоста вступили в силу, выполните:
exec /usr/bin/bash
  • Чтобы проверить имя хоста в каждом узле, выполните команду:
hostname

Настройка сети Kubernetes IPv4 (все узлы)

Важно настроить сеть Kubernetes, чтобы модули могли взаимодействовать друг с другом и внешними средами без сбоев.

  • Создайте файл конфигурации Kubernetes в каталоге /etc/sysctl.d/.
sudo nano /etc/sysctl.d/kubernetes-master-node.conf

Добавьте следующие строки:

net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
  • Сохраните и выйдите. Затем примените настройки, выполнив следующую команду:
sudo sysctl --system

Установка Docker

На все наши машины необходимо будет поставить Docker.

  • Обновляем пакеты и ставим Docker:
sudo apt update && sudo apt install -y docker.io
  • Проверяем версию Docker:
docker --version
  • Добавляем Docker в автозагрузку:
sudo systemctl enable --now docker
  • Добавляем текущего пользователя в группу Docker (чтобы не использовать sudo при запуске контейнеров):
sudo usermod -aG docker $USER
newgrp docker
  • Проверяем работу Docker:
docker run hello-world

Если выводит сообщение о корректной установке — значит работает:

Docker, hello-world

Настройка containerd

Установка Docker включает в себя containerd — облегченную среду выполнения контейнеров, которая упрощает запуск и управление контейнерами. Таким образом, настройте containerd, чтобы обеспечить его надежную работу в кластере Kubernetes. Сначала создайте отдельный каталог, как показано:

sudo mkdir /etc/containerd
  • Далее создайте файл конфигурации по умолчанию для containerd.
sudo sh -c "containerd config default > /etc/containerd/config.toml"
  • Обновите директиву SystemdCgroup, установив ее в значение true, как показано:
sudo sed -i 's/ SystemdCgroup = false/ SystemdCgroup = true/' /etc/containerd/config.toml
  • Далее перезапустите службу containerd, чтобы применить внесенные изменения:
sudo systemctl restart containerd.service
  • Обязательно проверьте, что служба containerd работает должным образом:
sudo systemctl status containerd.service

Что должно выдавать следующий результат:

Kubernetes, Docker Containerd

Установка Kubernetes

Следующий шаг — установка самого Kubernetes.

Учтите: в настоящее время Kubernetes v1.31 является текущей версией. Обязательно проверьте наличие более новых версий перед установкой и соответственно модифицируйте команды.

sudo apt-get install curl ca-certificates apt-transport-https -y
  • Добавьте ключ подписи Kubernetes GPG.
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.31/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
  • После этого добавьте официальный репозиторий Kubernetes в свою систему.
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.31/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list
  • После добавления обновите список источников, чтобы система распознала недавно добавленный репозиторий:
sudo apt update

Чтобы установить Kubernetes, необходимо установить три пакета: kubeadm, kubelet и kubectl. Чтобы установить эти компоненты Kubernetes, выполните следующую команду:

sudo apt install kubelet kubeadm kubectl -y
Какова задача каждого из этих компонентов?
  • kubeadm: это утилита командной строки для настройки кластеров Kubernetes. Она автоматизирует настройку кластера, оптимизирует развертывание контейнеров и абстрагирует любые сложности в кластере. С помощью kubeadm вы можете инициализировать плоскость управления, настроить сеть и присоединить удаленный узел к кластеру.

  • kubelet: это компонент, который активно работает на каждом узле в кластере для контроля управления контейнерами. Он принимает инструкции от главного узла и обеспечивает работу контейнеров, как и ожидалось.

  • kubectl: это инструмент CLI для управления различными компонентами кластера, включая модули, узлы и кластер. Вы можете использовать его для развертывания приложений, а также для проверки, мониторинга и просмотра журналов.

Настройка кластера

  • Инициализация кластера (только для мастер-узла):
sudo kubeadm init --pod-network-cidr=10.10.0.0/16

Учтите: параметр --pod-network-cidr указывает диапазон IP-адресов для будущих подов во внутренней сети. Разные сетевые плагины (Flannel, Calico и др.) могут требовать разные значения.

После успешной инициализации появится команда для подключения рабочих узлов (kubeadm join). Сохраняем ее:

Kubernetes, kubeadm join token

  • Чтобы работать с кластером, настраиваем kubectl:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
  • Проверяем работоспособность:
kubectl get nodes

Должен появиться мастер-узел (Ready появится после установки сетевого плагина):

Kubernetes, Master Node is almost ready

Установка сетевого плагина

Чтобы поды могли обмениваться данными, устанавливаем сетевой плагин. Например, Flannel:

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

Через минуту проверяем узлы:

kubectl get nodes

Теперь мастер-узел должен быть в состоянии Ready:

Kubernetes, Master Node is ready

Добавление рабочих узлов

На каждом рабочем узле устанавливаем Docker и Kubernetes, затем выполняем команду kubeadm join, полученную при инициализации мастер-узла:

sudo kubeadm join <master-ip>:6443 --token <token> --discovery-token-ca-cert-hash <hash>

Проверяем, что узлы подключились:

kubectl get nodes

Развертывание тестового приложения

Создаем файл deployment.yaml:

Пример файла-манифеста
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80

Применяем манифест:

kubectl apply -f deployment.yaml

Проверяем:

kubectl get pods

Если видим работающие поды, значит, все настроено правильно.

Заключение

Теперь у вас есть готовый сервер для тестирования и развертывания приложений на Kubernetes. Мы рассмотрели установку, настройку и запуск тестового приложения.

Дальнейшие шаги могут включать:

  • Настроить балансировщик нагрузки (ingress-nginx).
  • Добавить мониторинг (Prometheus, Grafana).
  • Изучить управление конфигурациями (ConfigMaps, Secrets).
  • Настроить CI/CD для автоматического развертывания.