Стейкинг KEEP на Raspberry Pi кластере с Ansible, Kubernets (k3s), GlusterFS и многим другим

Image for post
Image for post

Перед тем как мы начнем, сейчас существует множество других публичных гайдов которые описывают установку отдельно стоящей ноды Keep (даже один для Kubernetes). Этот гайд не будет изобретать велосипед, но бросает вызов поддержанию ноды дома на голом железе кластера Raspbery Pi используя настройку скрипта Ansible. К концу гайда, вы сможете поднять и поддерживать её используя одну команду и 2 относительно небольших файла конфигурации.

Менее чем за 300 долл. вы сможете создать свой собственный домашний кластер Kubernetes, который самостоятельно восстанавливается и имеет избыточное реплицированное хранилище. Преступим!

Примечание: На момент написание этой статьи, не существует официального keep-network Docker образа для arm64 архитектуры. Образ используемый в этом гайде скомпилирован и загружен на мой собственный аккаунт Docker Hub в автоматическом режиме с последними тегами (keep-core, keep-ecdsa).

Первый шаг это закончит подготовительную этап получения тестовых токенов KEEP, делегирование токенов, авторизации контракта, и настройка аккаунта Infura для доступа к endpoints сети Ethereum. Если вы ещё это не сделали, следуйте пунктам 2–5 этого гайда и возвращайтесь обратно после окончания шага 5.

Железо

  • Желательно, как минимум четыре Raspberry Pi 4B (2 GB). У вас, возможно, получится обойтись тремя, но четыре дадут большую стабильность. Я использую 4 GB Pi для запуска других приложений.
  • 16 GB microSD карта для операционной системы. Я использую 32GB, что бы иметь запас прочности.
  • 32 GB USB 3.0 внешнее хранилище для репликации данных. 1 TB SSD крайне рекомендуются для мейннета если вы решите использовать geth при развертывании. Я использую 64 GB диски для моих других приложений.
  • 5-портовый неуправляемый коммутатор. Вам будет нужно больше портов если у вас будет больше чем 4 Raspberry Pi (один порт используется для uplink)
  • В этом репозитории находится более дельные рекомендации по железу, в том числе по блокам питанию и кабелям.

Прочтите Быструю Установку ниже, чтобы начать сразу. Если вас интересует более детальная установка, перейдите к секции, которая начинается с «Детальная установка от начала до конца»

Быстрая установка

Установите Ansible.

Установите jmespath:

$ pip install jmespath

Клонируйте репозиторий:

$ git clone https://github.com/syuan100/keep-pi-cluster
$ cd keep-pi-cluster

Сделайте копию hosts.ini.example и удалите .example :

$ cp hosts.ini.example hosts.ini

Измените hosts.ini и добавьте IP адреса ваших Pi, заменяя все xxx.xxx.xxx.xxx:

[master]; Put the IP address for your main Kubernetes serverxxx.xxx.xxx.xxx[nodes]; Put the IP addresses for the rest of the nodesxxx.xxx.xxx.xxxxxx.xxx.xxx.xxxxxx.xxx.xxx.xxx...

Скопируйте ваш keystore файл из Шага 2 гайда в директорию keystore.

Сделайте копию group_vars/all.yml.example без .example:

$ cp group_vars/all.yml.example group_vars/all.yml

Большинство group_vars/all.yml можно оставить по умолчанию. Ниже список переменных, который необходимо изменить:

# Use the endpoints provided from your Infura account
eth1_endpoint: https://ropsten.infura.io/v3/XXXXXXXXXXXXXXXXXXXXXXXX
ethereum_url: wss://ropsten.infura.io/ws/v3/XXXXXXXXXXXXXXXXXXXXXXXX
# storage_path will depend on how you plugged in your storage device. Use the command lsblk while logged into your Raspberry Pi to see what to change this value to.
storage_path: /dev/sda1
# Change storage_size to be LESS than the amount of external storage you have plugged into one Pi
storage_size: 30
# Change to your account address authorized for the random beacon beacon_account_address:"0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"# The exact name for your keystore file
beacon_keystore_filename: UTC--2020-08-29T17-45-22.740497000Z--AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
# The password used to secure your keystore file beacon_account_password: yourpasswordhere# Your public IP address for P2P discovery in multiaddr format beacon_announced_addresses: '"/ip4/xxx.xxx.xxx/tcp/3919"'

Вы можете использовать информацию выше и для ECDSA ноды если хотите, или вы можете создать новый адрес и keystore файл.

ВАЖНО! Удостоверьтесь что у вас есть доступ через SSH ко всем вашим Pi, что не требует ввода пароля.

Теперь мы готовы к запуску скрипта Ansible! В корне репозитория выполните команду:

$ ansible-playbook -i hosts.ini initial_setup_playbook.yml

Детальная установка от начала до конца

Скачайте Ubuntu 18.04 64-bit для Raspberry Pi тут.

Image for post
Image for post

Скачайте Balena Etcher что бы прошить Ubuntu на ваши microSD карты.

Image for post
Image for post

Мы будем получать доступ к Raspberry Pis через SSH, то есть вам не нужен дополнительный монитор и клавиатура! Все что вам нужно это подключить свои Raspbery Pi к сети используя интернет кабель.

После установки всех SD карт, подключения всех внешних дисков и Raspberry Pi к коммутатору (который подключен к вашей домашней сети), вы готовы к включению вашей системы.

Когда все Raspberry Pi включились и лампочки заморгали, запишите IP адреса каждой Pi в вашей локальной сети. Они вам понадобятся на следующих этапах. Если вы не уверены, как это делать, прочтите эту статью.

Настройка SSH

(Это часть взята напрямую из readme репозитория)

На вашем хост компьютере, откройте терминал и напечатайте команду ниже. Замерите xxx.xxx.x.x IP адресами ваших Pi.

$ ssh ubuntu@xxx.xxx.x.x

Пароль по умолчанию ubuntu. После успешного входа в систему вам будет необходимо изменить пароль.

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

Вернитесь к вашему хост компьютеру и напишите команду, что бы проверить установлены ли у вас уже SSH ключи:

ls -al ~/.ssh

Если вы видите что-то типа id_rsa.pub , вы можете пропустить следующий этап. Если у вас нету SSH ключей, то вам нужно их сгенерировать:

$ ssh-keygen

Следуйте инструкциям. Примечание: этот процесс будет быстрее если вы не используете passphrase. (Если вы ИСПОЛЬЗУЕТЕ passphrase на ваш ключ, следуйте этой инструкции о том как использовать ssh-agent для хранения вашей passphrase)

Используйте ssh-copy-id что бы скопировать SSH ключи от ваших Raspberry Pi:

$ ssh-copy-id ubuntu@xxx.xxx.xxx.xxx

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

$ ssh ubuntu@xxx.xxx.xxx.xxx

После того как вы УДОСТОВЕРИТЕСЬ что вы можете войти на каждую Pi используя SSH без пароля, переходите к следующей секции. Для корректной работы Ansible требует доступ через SSH.

Запуск Ansible

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

Установите jmespath используя pip:

$ pip install jmespath

Далее, клонируйте репозиторий и перейдите в папку:

$ git clone https://github.com/syuan100/keep-pi-cluster && cd keep-pi-cluster

Сделайте копию hosts.ini.example и удалите .example :

$ cp hosts.ini.example hosts.ini

Измените hosts.ini и добавьте IP адреса ваших Pi из изначальной настройки, заменяя все xxx.xxx.xxx.xxx:

[master]; Put the IP address for your main Kubernetes serverxxx.xxx.xxx.xxx[nodes]; Put the IP addresses for the rest of the nodesxxx.xxx.xxx.xxxxxx.xxx.xxx.xxxxxx.xxx.xxx.xxx...

Скопируйте ваш keystore файл из Шага 2 гайда в директорию keystore. Структура папки должна выглядеть так:

keep-pi-cluster/
└ keystore/
└ UTC--2020-08-29T17-yourkeystorefile

Далее, сделайте копию group_vars/all.yml.example без .example :

$ cp group_vars/all.yml.example group_vars/all.yml

Большинство group_vars/all.yml можно оставить по умолчанию. Ниже список переменных, который вам необходимо изменить:

# Use the endpoints provided from your Infura account
eth1_endpoint: https://ropsten.infura.io/v3/XXXXXXXXXXXXXXXXXXXXXXXX
ethereum_url: wss://ropsten.infura.io/ws/v3/XXXXXXXXXXXXXXXXXXXXXXXX
# storage_path will depend on how you plugged in your storage device. Use the command lsblk while logged into your Raspberry Pi to see what to change this value to.
storage_path: /dev/sda1
# Change storage_size to be LESS than the amount of external storage you have plugged into one Pi
storage_size: 30
# Change to your account address authorized for the random beacon beacon_account_address:"0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"# The exact name for your keystore file
beacon_keystore_filename: UTC--2020-08-29T17-45-22.740497000Z--AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
# The password used to secure your keystore file beacon_account_password: yourpasswordhere# Your public IP address for P2P discovery in multiaddr format beacon_announced_addresses: '"/ip4/xxx.xxx.xxx/tcp/3919"'

Вы можете использовать информацию выше и для ECDSA ноды если хотите, или вы можете создать новый адрес и keystore файл.

Теперь вы готовы к запуску скрипта Ansible! В корне репозитория, выполните команду:

$ ansible-playbook -i hosts.ini initial_setup_playbook.yml

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

sudo kubectl get all -o wide

Вы должны увидеть такой ответ:

Image for post
Image for post

Мониторинг

Netdata — стандартное решение для мониторинга в данный момент. Вы можете использовать свой браузер для перехода к порту 19999 ваших Raspberry Pi, что бы проверить данные вашего сервера (использование CPU, использование памяти, и многое многое другое). Вы так же можете зарегистрировать бесплатный Netdata аккаунт для объединения ваших кластеров в один дашборд.

Image for post
Image for post

Перенаправление портов

Что бы быть качественным пиром и улучшить продуктивность, имеет смысл перенаправить ваши р2р порты на публичные. Однако, наш балансировщик нагрузки использует порты ноды, поэтому это не такой простой процесс как прописывание порт-порт один к одному:

keep-random-beacon: Порт роутера 3919 → Порт Raspberry Pi 30011

keep-ecdsa: Порт роутера 3920 → Порт Raspberry Pi 30012

Например, для keep-random-beacon сервисный порт нашего балансировщика нагрузки это 30011.Таким образом мы открывает и перенаправляем порты на нашем роутере, мы открываем порт 3919 и перенаправляем трафик на порт 30011 на любой нашей Raspberry Pi. Красота балансировщика нагрузки, то что трафик который приходит на порт 30011 любой ноды нашего кластера будет направлен на наш pod, на котором запущен random beacon. Изящно, да?

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

Ок, но “Will it Blend”™?

Image for post
Image for post

Или скорее, «Будет ли она самостоятельно восстанавливается?»

Вы можете провести простой тест! Сначала выясните на какой ноде выполняется ваша рабочая нагрузка. Команда ниже на вашей мастер ноде скажет на какой ноде работает random beacon:

$ sudo kubectl get pod -l app=keep-random-beacon -o wide
Image for post
Image for post

Далее, подключитесь через SSH к ноде где выполняется рабочая нагрузка, в моем случае это rpi-03. Выполните команду выключения и подождите минутку пока нода выключится:

$ sudo shutdown
Image for post
Image for post

Вернитесь к вашей мастер ноде, проверьте что нода не отвечает:

$ sudo kubectl get nodes
Image for post
Image for post

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

$ sudo kubectl get pod -l app=keep-random-beacon -o wide
Image for post
Image for post

Удалось! И не забудьте вернутся и снова включить ноду.

Практическое руководство по устранению неполадок

Если на любом из этапов во время изначальной установки произойдет ошибка, вы можете либо исправить её либо повторить initial_setup_playbook.ymlлибо можете использовать одно и руководств в папке playbooks для повторения конкретного сегмента:

1_ubuntu_playbook.yml: Изначальная установка Raspberry Pi — включая отключение пароля для SSH входа, обновления имени хоста и обновление apt.

2_k3s_playbook.yml: Настройка kubernetes — включая спецтфтческие настройки Pi, скачивание и установка мастер и рабочих нод, и настройка строгих и гибких лимитов pod.

3_glusterfs_playbook.yml : Настройка хранилища для реплицированной информации — включая форматирования специального диска, создания группы, установка и запуск томов GlusterFS.

4_services_playbook.yml : Запуск контейнеров и настройка сервисов — включая настройку постоянных томов GlusterFS, балансировщика нагрузки MetalLB, копирование специальных файлов конфигурации приложения, и развертывание KEEP ноды.

5_netdata_monitoring_playbook.yml : Развертывание Netdata для мониторинга серверов.

Дополнительно, есть руководства для утилит playbooks/utils:

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

update_deployment.yml : Так же как и руководство для сервисов, только удаляет все релевантные сервисы до развертывания новой конфигурации.

update_kubelet_config.yml : Если вы хотите подправить параметры kubelet, вы можете запустить этот скрипт после для применения изменений.

Стандартные проблемы

“Ansible isn’t able to SSH into my Pis since it needs a passphrase.”

Удостоверьтесь что ваш SSH ключ не требует passphrase для входа на ваши Raspberry Pi. Если требует, вы можете использовать ssh-agent и ssh-add что бы продвинутся дальше. Или, сгенерировать новый SSH ключ который не требует passphrase.

“For GlusterFS the playbook says that /dev/sda1 is too small or cannot be found”

Изредка, внешний диск может иметь два раздела, загрузочный раздел и раздел для хранения. Для лучшей производительности, вы должны отформатировать диск таким образом что бы он имел один раздел, в противном случае используйте lsblk когда вы вошли вашу Raspbery Pi, что бы определить на какой путь к вашему разделу для хранения, что бы вы могли изменить переменную storage_path внутри group_vars/all.yml.

Заключение и будущие улучшения

Несмотря на то, что эта статья помогает создать вполне рабочий кластер, есть несколько улучшений который я хотел бы сделать. Я так же буду рад любым PR репозитория!

  • Мониторинг кластера с помощью Prometheus и Grafana: Кластер должен мониторится и создавать оповещения, каким бы излишним это не было! Netdata хороша как мониторинг сервера, но логи и метрики на уровне кластера будут намного лучше.
  • k3sup интеграция: k3sup существенно улучшает развертывание k3s, а так же дает возможность легко добавлять новые ноды в кластер (включая multi-master развертывание).
  • Автоматизация для использования облака: Хоть мне и не нравится видеть как облачные сервисы монополизируют инфраструктуру блокчейна, аптайм который они предоставляют невозможно превзойти. Добавление облачной поддержки, как предохранителя, может сделать наше развертывание более надежным. Однако, при развертывании на облаке, нужно намного серьезнее подойти к вопросу сетевой безопасности, из-за невозможности роутера выполнять роль файервола.

Спасибо что прочитали! Если вам понравилась стать, напишите свой комментарий под оригиналом. Или свяжитесь с автором на Keep сервере в дискорде @alphamethod.

Ссылка на оригинал: https://medium.com/@stevenyuan/staking-keep-on-a-raspberry-pi-cluster-with-ansible-kubernetes-k3s-glusterfs-and-more-10efe30539d4

Перевел mrHat#5983. Если у вас есть замечания к переводу, пожалуйста, свяжитесь со мной в дискорде.

Written by

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store