База знаний

Как развернуть Kubernetes (K8S)

Kubernetes (K8S) — это система управления контейнеризированными приложениями. Kubernetes позволяет взаимодействовать с кластером, осуществляя автоматизацию развёртывания, масштабирования и управления приложениями в контейнерах.

Кластер — это единица объединённых вычислительных ресурсов, которой оперирует Kubernetes. Кластер состоит из мастер-узла (control plane) и одного или нескольких рабочих узлов (worker node). На этих узлах запускаются контейнеризированные приложения. Kubernetes отслеживает состояние и работоспособность узлов, обеспечивая автоматическое управление и масштабирование.

На данный момент Kubernetes ещё не предоставляется сервисом CLO в качестве штатной услуги. Вы можете установить Kubernetes на серверах CLO самостоятельно по инструкции, приведённой ниже.

Технические требования для создания кластера

  • один мастер-узел (control plane) и произвольное количество рабочих узлов (worker nodes)
  • наличие внешнего IP-адреса у каждого сервера (узла), для удобства настройки
  • минимальная конфигурация каждого узла: 2 vCPU и 2 Гб памяти

Примечание. Указанная конфигурация является минимальной для простой взаимосвязи между узлами кластера и при небольшом количестве запущенных контейнеров. С ростом нагрузки кластеру могут потребоваться дополнительные ресурсы. Добавить ресурсы можно на странице Серверы → кнопка Изменить ресурсы (при этом потребуется перезагрузка сервера).

Подготовка узла кластера

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

Шаг 1. Создайте виртуальный сервер под ОС Ubuntu 22 со следующими ресурсами:

  • минимальное количество процессоров (vCPU) — 2
  • минимальный объём оперативной памяти — 2 Гб
  • минимальный объём сетевого системного диска — 30 Гб

Присвойте серверу внешний IP-адрес. Сгенерируйте SSH-ключи для сервера.

Шаг 2. Подключитесь к серверу через консоль (например, putty) и авторизуйтесь. Обновите источники приложений Ubuntu и установите необходимые приложения, выполнив команды:

apt-get update
apt-get install ca-certificates curl lsb-release apt-transport-https curl gnupg2 software-properties-common

Шаг 3. Добавьте репозиторий CRI-O и установите CRI-O на сервер:

CRIO_VERSION=v1.30
gpg --dearmor -o /etc/apt/keyrings/cri-o-apt-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/cri-o-apt-keyring.gpg] https://pkgs.k8s.io/addons:/cri-o:/stable:/$CRIO_VERSION/deb/ /" | tee /etc/apt/sources.list.d/cri-o.list
apt update && apt install -y cri-o
rm /etc/cni/net.d/11-crio-ipv4-bridge.conflist
systemctl enable --now crio

Шаг 4. Установите компоненты Kubernetes:

  • Kubelet — агент, который требуется установить на каждом узле кластера, отвечает за исправность контейнеров.
  • Kubeadm — инструмент для автоматизации установки и настройки компонентов Kubernetes, также устанавливается на каждом узле.
  • Kubectl — позволяет запускать команды для кластеров.

Для установки введите следующие команды:

mkdir /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/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.29/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
apt-get update && apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl

Шаг 5. Подключите модули и настройте ядро:

echo "br_netfilter" >> /etc/modules
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.d/99-k8s.conf
modprobe br_netfilter
sysctl net.ipv4.ip_forward=1

Шаг 6. Настройте параметр node-ip для работы кластера через локальную сеть:

cat <<\EOF >/etc/kubelet-set-ip.sh
#!/bin/bash
local_ip=$(cloud-init query ds.meta_data.meta.local_ip)
advertise=$(cloud-init query ds.meta_data.meta.main_ip)

echo "KUBELET_EXTRA_ARGS='--node-ip ${local_ip}'" > /etc/default/kubelet

cat <<K8S >/root/k8s-init-config.yaml
apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: "${advertise}"
  bindPort: 6443
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
controlPlaneEndpoint: "${local_ip}"
networking:
  serviceSubnet: "10.43.0.0/16"
  podSubnet: "10.42.0.0/16"
---
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: systemd
K8S

EOF
chmod +x /etc/kubelet-set-ip.sh

cat <<\EOF >/etc/systemd/system/kubelet-set-ip.service
[Unit]
Description=CLO kubelet set local ip
After=network-online.target

[Service]
Type=oneshot
ExecStart=/etc/kubelet-set-ip.sh

[Install]
WantedBy=multi-user.target
EOF

chmod +x /etc/kubelet-set-ip.sh
systemctl daemon-reload
systemctl enable --now kubelet-set-ip.service

Приведённый набор команд создаёт скрипт, который будет запускаться всякий раз при запуске сервиса. Этот скрипт выполняет следующие действия:

  • создаёт файл конфигурации /root/k8s-init-config.yaml для инициализации кластера
  • заполняет параметр node-ip в /etc/default/kubelet

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

Шаг 7. На предыдущих шагах выполняется настройка рабочего узла. Сделайте снапшот его состояния, чтобы развернуть на его основе необходимое количество рабочих узлов.

  1. На странице Серверы выберите созданный ранее сервер узла и остановите его работу.
  2. В правом меню выберите СнапшотыСоздать снапшот.
  3. После того, как снапшот будет создан, в левом меню выберите страницу Снапшоты.
  4. Выберите созданный снапшот и нажмите кнопку Восстановить сервер. Задайте уникальное имя для нового узла и дождитесь развёртывания нового сервера.

Примечание. Снапшоты недоступны для серверов с локальным системным диском.

Инициализация кластера

Шаг 1. Выберите один сервер, который будет выполнять в Kubernetes роль control-plane. Инициализируйте кластер с помощью следующего файла конфигурации:

kubeadm init --config=./k8s-init-config.yaml

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

Вывод команды kubeadm

Примечание. Файл конфигурации предполагает использование только одного control-plane узла. Если вам нужно использовать несколько таких узлов, то параметр controlPlaneEndpoint должен указывать на балансировщик (подключенный ко всем control-plane) который будет доступен с любого сервера.

Шаг 2. Чтобы начать использовать кластер, выполните следующие команды:

mkdir .kube
cp /etc/kubernetes/admin.conf .kube/config

Примечание. Вы также можете скопировать файл /etc/kubernetes/admin.conf на ваш рабочий компьютер и отредактировать поле server, указав в нем внешний IP-адрес вашего узла control-plane. Это действие позволит впоследствии управлять кластером при помощи kubectl с вашего компьютера.   

Шаг 3. По умолчанию на мастер-ноде не запускаются поды, только осуществляется мониторинг состояния кластера. Если вы хотите задействовать ресурсы мастера и разрешить запуск подов, выполните команду:

kubectl taint nodes --all node-role.kubernetes.io/master-

Шаг 4. Чтобы настроить сетевое взаимодействие между подами, установите CNI Calico и укажите способ определения IP-адреса:

kubectl apply -f http://rep.clo.ru/k8s/calico-bgp.yaml
kubectl set env -n kube-system daemonset/calico-node IP_AUTODETECTION_METHOD=kubernetes-internal-ip

Шаг 5. Проверьте, что кластер запускается и работает, с помощью команды:

kubectl -n kube-system get pods -o wide

Все поды из выведенного командой списка должны находиться в состоянии Ready, а поды coredns должны использовать адреса из сети 10.42.0.0/16.

Добавление нод

Шаг 1. Получите команду для подключения ноды к кластеру. Эта команда будет действительна в течении 24 часов и может быть использована для подключения множества нод:

kubeadm token create --print-join-command

Подключитесь к серверу, который требуется добавить в кластер Kubernetes, и выполните ранее полученную команду.

Шаг 2. Проверить корректность работы всех подключенных узлов частей кластера можно из терминала мастер-узла при помощи команды:

kubectl get pods --all-namespaces -o wide

Значения всех позиций в выводе команды должно быть “Running”. Обратите внимание что настройка узла занимает несколько минут.

Шаг 3. Следующая команда выдаст список из мастер-узла и всех подключенных к нему рабочих узлов кластера:

kubectl get nodes -o wide

Значения всех позиций в выводе команды должно быть “Ready”.

Советы по конфигурации

Мы рекомендуем не использовать внешние IP-адреса на рабочих узлах (worker nodes) кластера. Вместо этого, мы предлагаем создать Ingress как DeamonSet и пробрасывать трафик в Ingress, используя балансировщик CLO. Для доступа подов в интернет включите виртуальный роутер NAT в Личном кабинете.