Kubernetes в Hetzner при помощи Rancher (с картинками)

Доброго времени суток. Последние несколько месяцев я пытался запустить кластер kubernetes для взаимных пыток и изучения. За это время я прочитал большое количество разных статей, многие из которых были хорошими, но совершенно не подходящими для человека, не сталкивавшегося с кубером.

Дисклеймер

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

Изначально я хотел запустить кластер на dedicated сервере с виртуалками на hyper-v, однако узнал, что «просто запустить мастер и подключить ноды» недостаточно для полноценного кластера, еще нужно установить сетевой плагин, озаботиться Persistent volumes и желательно каким-никаким loadbalancer-ом.

Дальнейшие попытки привели меня в hetzner и к rancher.

Почему hetzner? У них есть одно очень весомое преимущество. Вот цена на виртуальный сервер в hetzner:

a7b29315bd224aa1a446cbb518bfe803.png

И на его аналог в Mail Cloud:

9e3638463e0800265849e4785d8f1ee6.png

Да, в hetzner нет managed баз данных, очередей, s3 хранилища и прочего, но того, что у них уже есть — вполне достаточно для того, чтобы получить рабочий кластер, а все остальное можно запустить в нем же, либо на соседних серверах/dedicated (физический сервер можно подключить к приватной сети виртуальных серверов)

Rancher же берет на себя весь (или почти весь) геморрой по сборке кластера, его администрированию и расширению, а так же позволяет управлять им через ui, а не через консоль.

Прежде чем начать, нам понадобится домен для rancher и аккаунт в hetzner cloud, которые, я надеюсь, вы сможете сделать без инструкций.

Итак, приступим.

Первым делом создаем приватную сеть. Заходим в Hetzner Cloud, создаем проект, переходим на вкладку Networks, жмем Create Network, меняем подсеть с 16 на 8, запоминаем название нашей сети, оно нам еще пригодится.

f61785df32d2c305382ae18b117fa673.png

Далее переходим на вкладку Security → API Tokens, жмем Generate API Token, ставим переключатель в Read & Write:

cfee1f2585432210dccb36899c23eb3e.png

Подтверждаем, сохраняем токен, нам его больше не покажут:

aa823dd27d1da66a5f0daa31e99da400.png

Далее нужно создать сервер, на который поставим 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) только для тестирования и разработки, но мы этим и занимаемся

Переходим по нашему домену и наблюдаем приветственное окно. Устанавливаем пароль администратора, указываем, что хотим администрировать множество кластеров, принимаем лицензионное соглашение

8882055e161be36f47e1710f8037e016.png

Далее подтверждаем, что rancher правильно определил домен и попадаем на главную страницу.

Теперь нужно установить расширения для работы с hetzner. Для этого переходим в Tools > Drivers

64af31ee8722fb6ba6b9918337b96ab1.png

Далее вкладка Node Drivers и жмем Add Node Driver

e5a0ebcf411e3edaec427d3c07236d54.png

В открывшемся окне нужно указать ссылки на скачивание плагина:

В репозитории драйвера берем ссылку на последний релиз 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

c86ad6611b95a7db7e357e23680d8bf5.png

Жмем Create, через пару секунд драйвер будет скачан и установлен. Теперь мы готовы к разворачиванию кластера.

Переходим на главную страницу (выпадающее меню справа от лого > Global), нажимаем на «Add Cluster». В списке появился Hetzner, нажимаем

f21be7c986f77f3d9f339659aeb925d2.png

В следующем окне обзываем кластер по желанию (поле Cluster Name), вписываем Prefix для имени ноды, ставим галки в колонки etc и Control Pane, после жмем на кнопку Add Node Template:

b1a50caa7f67bef5124d5ab2c0132174.png

В открывшемся окне вводим API Token Hetzner (я говорил, что он еще понадобится).
Далее выбираем локацию сервера (там, где вы разместили самый первый сервер), ОС, тип сервера (CP21 или выше). Обязательно выбираем в списке приватную сеть и ставим галку «Use private network» и даем имя шаблону.

90fdeb00e460e7f0d6d0fae328396212.png

После создания шаблона нужно добавить пул рабочих нод, для этого жмем кнопку Add Node Pool, в новой строчке опять вводим префикс, ставим галку в Worker, указываем желаемое количество и шаблон сервера (выбрать такой же, как у мастера, либо добавить новый, помощнее).

4f3a325ba7300113875fb8e5bef52743.png

После чего спускаемся ниже, до Cluster Options, разворачиваем Kubernetes Options, указываем желаемую версию кубера (лучше последнюю, т.к. hetzner поддерживает только три последних версии), Network provider — Flannel, Cloud Provider — external, после чего нажимаем кнопку «Edit as YAML».

Перед нажатием на Edit as YAML можно спуститься чуть ниже и поменять настройки, если вы знаете, что они делают

529b47a8e5af064c7e84e36e7ab9d82a.png

В открывшемся окошке нужно добавить следующий текст в 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
...

заменяем на токен hetzner (в двух местах), на имя приватной сети, которую указывали у серверов. Последние две строки с ссылками содержат в себе Cloud Controller Manager и Container Storage Interface driver. На странице репозиториев есть таблицы с этими ссылками, выбираем подходящие под версию kubernetes (CCM берем With Networks support)
Должно получиться что-то вроде этого:

523e9a5b3699fa646130fecaab9f0666.png

Жмем на «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

693aa8de5e79ef7c973033b6f87b3d7f.png

P.P. S.: Здесь указано, что этого можно избежать, если добавить параметры в переменные кластера по умолчанию, но я не знаю как это сделать.

© Habrahabr.ru