Kubernetes в Hetzner при помощи Rancher (с картинками)
Доброго времени суток. Последние несколько месяцев я пытался запустить кластер kubernetes для взаимных пыток и изучения. За это время я прочитал большое количество разных статей, многие из которых были хорошими, но совершенно не подходящими для человека, не сталкивавшегося с кубером.
ДисклеймерВ этой статье я не преследую цель рассказать «как правильно», я хочу рассказать как сделать чтобы работало и дать возможность людям учиться дальше, а не лысеть и седеть раньше положенного возраста
Изначально я хотел запустить кластер на dedicated сервере с виртуалками на hyper-v, однако узнал, что «просто запустить мастер и подключить ноды» недостаточно для полноценного кластера, еще нужно установить сетевой плагин, озаботиться Persistent volumes и желательно каким-никаким loadbalancer-ом.
Дальнейшие попытки привели меня в hetzner и к rancher.
Почему hetzner? У них есть одно очень весомое преимущество. Вот цена на виртуальный сервер в hetzner:
И на его аналог в Mail Cloud:
Да, в hetzner нет managed баз данных, очередей, s3 хранилища и прочего, но того, что у них уже есть — вполне достаточно для того, чтобы получить рабочий кластер, а все остальное можно запустить в нем же, либо на соседних серверах/dedicated (физический сервер можно подключить к приватной сети виртуальных серверов)
Rancher же берет на себя весь (или почти весь) геморрой по сборке кластера, его администрированию и расширению, а так же позволяет управлять им через ui, а не через консоль.
Прежде чем начать, нам понадобится домен для rancher и аккаунт в hetzner cloud, которые, я надеюсь, вы сможете сделать без инструкций.
Итак, приступим.
Первым делом создаем приватную сеть. Заходим в Hetzner Cloud, создаем проект, переходим на вкладку Networks, жмем Create Network, меняем подсеть с 16 на 8, запоминаем название нашей сети, оно нам еще пригодится.
Далее переходим на вкладку Security → API Tokens, жмем Generate API Token, ставим переключатель в Read & Write:
Подтверждаем, сохраняем токен, нам его больше не покажут:
Далее нужно создать сервер, на который поставим rancher. Переходим во вкладку Servers и жмем Add Server. Локацию выбираем по желанию, я выбрал Helsinki (запоминаем, локация еще пригодится). Тип сервера — Standart CX21 (или больше, если вы богатый).
В графе Network выбираем сеть, которую создали ранее. Ниже добавляем свой публичный ключ, еще ниже даем имя сервера (например rancher), после чего жмем Create & Buy now. Ждем пару секунд, пока создается сервер.
Далее нужно направить на него ваш домен (создать A запись) и подождать, пока сервер будет по нему доступен.
После этого подключаемся к серверу по ssh (через putty или другой ssh клиент) и приступаем к установке rancher.
Сначала ставим docker:
apt-get update
apt install -y docker.io
systemctl start docker
systemctl enable docker
После запускаем контейнер с rancher:
docker run -d --restart=unless-stopped \
-p 80:80 -p 443:443 \
-v /root/rancher:/var/lib/rancher \
--privileged \
--name rancher-server \
rancher/rancher:latest \
--acme-domain your.domain.com
Измените your.domain.com на домен, который вы привязали к серверу. Ждем несколько минут, пока rancher сделает свои дела и получит ssl сертификат.
Про rancher и dockerВ документации rancher рекомендуется использовать такой метод установки (Single Node Using Docker) только для тестирования и разработки, но мы этим и занимаемся
Переходим по нашему домену и наблюдаем приветственное окно. Устанавливаем пароль администратора, указываем, что хотим администрировать множество кластеров, принимаем лицензионное соглашение
Далее подтверждаем, что rancher правильно определил домен и попадаем на главную страницу.
Теперь нужно установить расширения для работы с hetzner. Для этого переходим в Tools > Drivers
Далее вкладка Node Drivers и жмем Add Node Driver
В открывшемся окне нужно указать ссылки на скачивание плагина:
В репозитории драйвера берем ссылку на последний релиз linux_amd64 (на данный момент это https://github.com/JonasProgrammer/docker-machine-driver-hetzner/releases/download/3.3.0/docker-machine-driver-hetzner_3.3.0_linux_amd64.tar.gz) и копируем в поле «Download Url».
В репозитории UI плагина берем ссылку на Custom UI URL (на данный момент это https://storage.googleapis.com/hcloud-rancher-v2-ui-driver/component.js) и вставляем ее в поле «Custom UI URL»
Добавляем в White List домен storage.googleapis.com
Жмем Create, через пару секунд драйвер будет скачан и установлен. Теперь мы готовы к разворачиванию кластера.
Переходим на главную страницу (выпадающее меню справа от лого > Global), нажимаем на «Add Cluster». В списке появился Hetzner, нажимаем
В следующем окне обзываем кластер по желанию (поле Cluster Name), вписываем Prefix для имени ноды, ставим галки в колонки etc и Control Pane, после жмем на кнопку Add Node Template:
В открывшемся окне вводим API Token Hetzner (я говорил, что он еще понадобится).
Далее выбираем локацию сервера (там, где вы разместили самый первый сервер), ОС, тип сервера (CP21 или выше). Обязательно выбираем в списке приватную сеть и ставим галку «Use private network» и даем имя шаблону.
После создания шаблона нужно добавить пул рабочих нод, для этого жмем кнопку Add Node Pool, в новой строчке опять вводим префикс, ставим галку в Worker, указываем желаемое количество и шаблон сервера (выбрать такой же, как у мастера, либо добавить новый, помощнее).
После чего спускаемся ниже, до Cluster Options, разворачиваем Kubernetes Options, указываем желаемую версию кубера (лучше последнюю, т.к. hetzner поддерживает только три последних версии), Network provider — Flannel, Cloud Provider — external, после чего нажимаем кнопку «Edit as YAML».
Перед нажатием на Edit as YAML можно спуститься чуть ниже и поменять настройки, если вы знаете, что они делают
В открывшемся окошке нужно добавить следующий текст в rancher_kubernetes_engine_config:
...
rancher_kubernetes_engine_config:
...
addons: |-
---
apiVersion: v1
stringData:
token:
network:
kind: Secret
metadata:
name: hcloud
namespace: kube-system
---
apiVersion: v1
stringData:
token:
kind: Secret
metadata:
name: hcloud-csi
namespace: kube-system
addons_include:
- https://github.com/hetznercloud/hcloud-cloud-controller-manager/releases/latest/download/ccm-networks.yaml
- https://raw.githubusercontent.com/hetznercloud/csi-driver/master/deploy/kubernetes/hcloud-csi.yml
...
Должно получиться что-то вроде этого:
Жмем на «Create» и наблюдаем за магией: rancher создаст сервера, установит на них все необходимое и объеденит в кластер. После создания кластера жмем на кнопку Cluster explorer (в шапке) и попадаем в админку. На этом установка кластера завершена, можно тыкать по менюшкам и изучать содержимое kubernetes.
В следующей статье расскажу про деплой и установку приложений через helm (на примере gitlab runner).
PS При создании сервиса LoadBalancer, он не сможет запуститься самостоятельно, т.к. нужно указать место его физического расположения. Для этого переходим в Services, жмем три точки у нужного сервиса > Edit Config > Labels & Annotations и добавить аннотации
load-balancer.hetzner.cloud/location — датацентр
load-balancer.hetzner.cloud/use-private-ip true
P.P. S.: Здесь указано, что этого можно избежать, если добавить параметры в переменные кластера по умолчанию, но я не знаю как это сделать.