Kubernetes или K8s — это программная платформа с открытым исходным кодом для оркестрации контейнеров, созданная Google. Основная концепция работы Kubernetes заключается в следующем: пользователь устанавливает его на сервер или, что более вероятно, кластер и развертывает на нем различные рабочие нагрузки. Kubernetes решает проблемы, связанные с созданием контейнеров, их масштабированием, пространствами имен, правами доступа и т.п. В основном взаимодействие с кластером осуществляется с помощью YAML-файлов — файлов с конфигурацией. В этой статье вы узнаете, как создать кластер Kubernetes и как развернуть кластер Kubernetes локально.
k8s
Установку кластера Kubernetes будем осуществлять на две виртуальные машины. Одна из них будет выполнять роль мастер-ноды, а другая — рабочей. При реальном использовании Kubernetes развертывание кластера из двух узлов не имеет смысла, но в качестве учебной установки подойдет. Если вы хотите создать кластер из большего числа узлов, то выполните аналогичные действия для них.
Для создания виртуальных машин будем использовать VirtualBox от Oracle. Скачать его можно по этой ссылке. После установки переходим к созданию виртуальных машин.
В качестве операционной системы для ВМ выберем Ubuntu Server. Дистрибутив находится здесь. Загружаем его и открываем VirtualBox.
Для создания ВМ нажимаем на кнопку «Создать»:
Теперь Virtual Box предложит вам выбрать параметры ВМ. В нашем случае оставляем всё стандартным, но для мастер-ноды, которая отвечает за управление Kubernetes-кластером, выделяем 3 ГБ оперативной памяти и 2 CPU, а для рабочей 2 ГБ. Технические требования к кластеру Kubernetes подразумевают, что мастер-ноде нужно как минимум 2 CPU. Создаём таким образом 2 виртуальные машины.
После создания ВМ нужно создать образ с дистрибутивом Ubuntu Server. Переходим в «Носители» и нажимаем «Выбрать/создать образ диска»:
В открывшемся окне нажмите «Добавить» и выберите дистрибутив Ubuntu Server. После этого запускаем обе машины и устанавливаем операционную систему, выбрав для этого пункт «Try or Install Ubuntu». Во время установки создаем пользователей для каждой системы и выбираем стандартные настройки.
После установки необходимо выключить обе виртуальные машины и перейти в их настройки. Переходим в раздел «Сеть» и меняем тип подключения на «Сетевой мост» для каждой системы, чтобы виртуальные машины были доступны между собой по сети:
Зададим имена узлам кластера. В мастер ноде выполним эту команду:
sudo hostnamectl set-hostname master.local
А в рабочей эту:
sudo hostnamectl set-hostname worker.local
Если рабочих нод несколько, то выполните для каждой из них команду с новым именем: worker1.local
, worker2.local
и т.д.
Чтобы узлы были доступны по именам, изменим файл hosts
на каждом из узлов. В нашем случае необходимо добавить в него такие строки:
192.168.43.80 master.local master
192.168.43.77 worker.local worker
192.168.43.80 и 192.168.43.77 — это IP-адреса каждого из узлов. Чтобы узнать IP-адрес, используем команду ip addr
:
ip addr
Вывод:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 08:00:27:c3:51:48 brd ff:ff:ff:ff:ff:ff
inet 192.168.43.80/24 brd 192.168.43.255 scope global enp0s3
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fec3:5148/64 scope link dadfailed tentative
valid_lft forever preferred_lft forever
IP-адрес находится рядом с inet
. Откроем файл hosts
и внесем правки:
sudo nano /etc/hosts
Чтобы убедиться, что ВМ могут обращаться друг к другу, пропингуем их:
ping 192.168.43.80
Если все хорошо, то вы получите вывод, подобный этому:
PING 192.168.43.80 (192.168.43.80) 56(84) bytes of data.
64 bytes from 192.168.43.80: icmp_seq=1 ttl=64 time=0.054 ms
64 bytes from 192.168.43.80: icmp_seq=2 ttl=64 time=0.026 ms
64 bytes from 192.168.43.80: icmp_seq=4 ttl=64 time=0.025 ms
--- 192.168.43.80 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3082ms
rtt min/avg/max/mdev = 0.025/0.032/0.054/0.012 ms
После этого перейдем к установке необходимых утилит и пакетов на каждом из узлов. Указанные действия применяем для каждого узла, если не указано обратное. Для начала обновим список пакетов и сами системы:
sudo apt-get update && apt-get upgrade -y
Теперь установим пакеты:
sudo apt-get install curl apt-transport-https git iptables-persistent -y
Kubernetes не запустится с файлом подкачки, его нужно отключить:
sudo swapoff -a
Чтобы он не включился после перезагрузки, необходимо изменить файл fstab
:
sudo nano /etc/fstab
Закомментируем эту строку с помощью # :
# /swap.img none swap sw 0 0
Загрузим дополнительные модули ядра:
sudo nano /etc/modules-load.d/k8s.conf
В k8s.conf
добавим 2 строки:
br_netfilter
overlay
Теперь добавим модули в ядро:
sudo modprobe br_netfilter
sudo modprobe overlay
Проверим успешность действий:
sudo lsmod | egrep "br_netfilter|overlay"
Должен быть примерно такой вывод:
overlay 147456 0
br_netfilter 28672 0
bridge 299008 1 br_netfilter
Создадим конфигурационный файл для обработки трафика через bridge
в netfilter
:
sudo nano /etc/sysctl.d/k8s.conf
В файл вносим 2 строки:
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
Применим настройки:
sudo sysctl --system
Прописываем в консоли:
sudo apt-get install docker docker.io -y
Подронее о том, как установить Docker на Ubuntu, читайте здесь.
После установки включаем автозапуск и перезапускаем Docker:
sudo systemctl enable docker
sudo systemctl restart docker
Добавим GPG-ключ:
sudo curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
Теперь создадим файл с настройкой репозитория:
sudo nano /etc/apt/sources.list.d/kubernetes.list
И добавим в него такую запись:
deb https://apt.kubernetes.io/ kubernetes-xenial main
Используем последнюю версию репозитория для Ubuntu: Kubernetes-xenial. Это версия для Ubuntu 16.04, возможно в скором времени появится версия для Ubuntu 22.04 — jammy.
Обновим список пакетов apt-get:
sudo apt-get update
Установим пакеты:
sudo apt-get install kubelet kubeadm kubectl
Установка завершена. Можем проверить версию клиента Kubernetes:
sudo kubectl version --client
Вывод:
Client Version: version.Info{Major:"1", Minor:"24", GitVersion:"v1.24.2", GitCommit:"f66044f4361b9f1f96f0053dd46cb7dce5e990a8", GitTreeState:"clean", BuildDate:"2022-06-15T14:22:29Z", GoVersion:"go1.18.3", Compiler:"gc", Platform:"linux/amd64"}
Выполняем команду для начальной настройки и подготовки узла:
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
Ключ --pod-network-cidr
задает адрес внутренней подсети. 10.244.0.0/16 — значение по умолчанию.
Процесс займет несколько минут. По его завершению в консоли появится такая запись:
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.43.80:6443 --token f7sihu.wmgzwxkvbr8500al \
--discovery-token-ca-cert-hash sha256:6746f66b2197ef496192c9e240b31275747734cf74057e04409c33b1ad280321
Данную команду сохраняем для подключения рабочих нод к мастер-ноде.
Создадим переменную окружения KUBECONFIG
:
export KUBECONFIG=/etc/kubernetes/admin.conf
Также выполним установку CNI (сетевой интерфейс контейнеров):
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
На рабочей ноде выполняем команду kubeadm join
, полученную при настройке мастер-ноды. После этого введем на мастер-ноде:
sudo kubectl get nodes
Вывод:
NAME STATUS ROLES AGE VERSION
master.local Ready control-plane,master 10m v1.24.2
worker.local Ready <none> 79s v1.24.2
Теперь кластер развернут и готов к работе.
Подготовили для вас выгодные тарифы на облако
Мы рассмотрели, как создать кластер Kubernetes и развернуть кластер Kubernetes локально. А если вы хотите быстро получить уже настроенный и полностью готовый к работе кластер, воспользуйтесь управляемым сервисом Kubernetes от Timeweb Cloud.
Кстати, в официальном канале Timeweb Cloud собрали комьюнити из специалистов, которые говорят про IT-тренды, делятся полезными инструкциями и даже приглашают к себе работать.
Чтобы продавать ноды клиентам, достаточно развернуть на железном сервер и можно продавать? Или есть нюансы?
В статье мы разворачиваем Кубернетес для тестовых/учебных целей, всего с двумя узлами. Если вы хотите предоставлять K8s как сервис клиентам, потребуется не только установленный кластер — для таких целей пишутся большие комплексные системы управления доступа, автоматизация развёртывания кластеров и так далее. Так что нюансы будут точно :)
Погружение можно начать с документации Kubernetes, а дальше искать дополнительную информацию в сети.