<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>beething</title><author><name>beething</name></author><id>https://teletype.in/atom/beething</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/beething?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@beething?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=beething"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/beething?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-04-16T05:49:52.471Z</updated><entry><id>beething:obiWlwK-PcM</id><link rel="alternate" type="text/html" href="https://teletype.in/@beething/obiWlwK-PcM?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=beething"></link><title>HAQQ. Kubernetes guide</title><published>2022-08-23T20:24:36.576Z</published><updated>2022-08-31T21:38:35.357Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img4.teletype.in/files/37/31/3731af29-ed48-4f30-8447-25083925ee52.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img2.teletype.in/files/d1/42/d1428429-bbda-49af-a11a-675cfc425246.png&quot;&gt;Hi !</summary><content type="html">
  &lt;p id=&quot;nryp&quot;&gt;Hi !&lt;/p&gt;
  &lt;p id=&quot;kCjx&quot;&gt;Сегодня мы рассмотрим установку и настройку валидатора для проекта haqq.&lt;/p&gt;
  &lt;p id=&quot;jW7t&quot;&gt;Это будет не типичный гайд с набором однострочников, копипастом которых вы сможете развернуть валидатора.&lt;br /&gt;Однако из данного гайда вы сможете немного попрактиковаться в разворачивании проекта в kubernetes.&lt;br /&gt;Cтоит понимать что наш гайд не будет затрагивать множества тонкостей и предполагает наличия базовых знаний по контейнерам (docker)&lt;br /&gt;За время инсталляции, нам придётся пройтись по следующим основным шагам&lt;/p&gt;
  &lt;ol id=&quot;4swm&quot;&gt;
    &lt;li id=&quot;bmzV&quot;&gt;&lt;a href=&quot;#xcmH&quot;&gt;Развертывание kubernetes кластера в облачном провайдер при помощи terraform.&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;A6V0&quot;&gt;&lt;a href=&quot;#vuiZ&quot;&gt;Развертывание приложения.&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;d6kQ&quot;&gt;&lt;a href=&quot;#UMvW&quot;&gt;Запуск валидатора&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;UH0O&quot;&gt;&lt;a href=&quot;#yxVa&quot;&gt;Удаление кластера&lt;/a&gt;&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;qCzm&quot;&gt;И хотя существенная часть шагов будет специфична для проекта, адаптировать полученный опыт вы сможете и для множества других ваших проектов.&lt;/p&gt;
  &lt;p id=&quot;oUf0&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;tLkt&quot;&gt;Подготовка&lt;/h3&gt;
  &lt;p id=&quot;3m4B&quot;&gt;Мы будем разворачивать наш кластер в европейском провайдере scaleway&lt;br /&gt;Для начала нам потребуется скачать и установить terraform&lt;br /&gt;Сделать это вы можете практически на любой операционной системе.&lt;br /&gt;Здесь можно найти официальный урок, как это делается&lt;br /&gt;&lt;a href=&quot;https://learn.hashicorp.com/tutorials/terraform/install-cli?in=terraform/aws-get-started&quot; target=&quot;_blank&quot;&gt;https://learn.hashicorp.com/tutorials/terraform/install-cli?in=terraform/aws-get-started&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;jFFk&quot;&gt;Мы в качестве примера будем использовать ручную установку для macos/linux.&lt;/p&gt;
  &lt;ol id=&quot;PULk&quot;&gt;
    &lt;li id=&quot;ajgM&quot;&gt;Переходим на страницу загрузки https://www.terraform.io/downloads&lt;/li&gt;
    &lt;li id=&quot;EYE2&quot;&gt;Выбираем операционную систему и архитектуру, и скачиваем версию.&lt;/li&gt;
    &lt;li id=&quot;tUhN&quot;&gt;Копируем скачаный файл в директорию /usr/local/bin&lt;br /&gt;&lt;br /&gt;&lt;code&gt;mv ~/Downloads/terraform /usr/local/bin&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;OtG3&quot;&gt;Добавляем права на запуск&lt;br /&gt;&lt;br /&gt;&lt;code&gt;chmod 755 /usr/local/bin/terraform&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;eKOl&quot;&gt;Проверяем что наш скачанный бинарник запускается, и показывает версию&lt;br /&gt;&lt;br /&gt;&lt;code&gt;terraform version&lt;/code&gt;&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;MDpV&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;xcmH&quot;&gt;Развертывание kubernetes кластера&lt;/h3&gt;
  &lt;p id=&quot;0yTf&quot;&gt;В качестве оператора k8s мы возьмём облачного провайдера scaleway&lt;br /&gt;Он отличается довольно демократичными ценами, среди тех операторов которые предоставляют услугу k8s как сервис.&lt;/p&gt;
  &lt;p id=&quot;DMUx&quot;&gt;Для начала создадим директорию в которой будет храниться вся наша конфигурация.&lt;/p&gt;
  &lt;pre id=&quot;DvJ2&quot; data-lang=&quot;bash&quot;&gt;mkdir haqq-tf
cd haqq-tf&lt;/pre&gt;
  &lt;p id=&quot;k4wA&quot;&gt;Далее, мы всегда будем работать внутри этой директории&lt;/p&gt;
  &lt;p id=&quot;2Y1l&quot;&gt;Для начала нам нужно подключить модуль terraform который позволяет нам управлять облаком scaleway.&lt;br /&gt;Модуль этот является официальным и поддерживается самим scaleway и найти документацию по нему можно здесь&lt;br /&gt;&lt;a href=&quot;https://registry.terraform.io/providers/scaleway/scaleway&quot; target=&quot;_blank&quot;&gt;https://registry.terraform.io/providers/scaleway/scaleway&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;f3yw&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;ctnk&quot;&gt;&lt;strong&gt;1. Получаем конфигурационный файл нашего оператора&lt;/strong&gt;&lt;br /&gt;Для начала нам нужно зарегистрироваться, и подтвердить свою почту, надеюсь у вас не возникнет с этим проблем.&lt;br /&gt;Следующем шагом, нам необходимо будет сгенерировать ключи доступа для terraform.&lt;br /&gt;Делается это в профиле, в разделе credentials&lt;br /&gt;&lt;/p&gt;
  &lt;figure id=&quot;SGrH&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/d1/42/d1428429-bbda-49af-a11a-675cfc425246.png&quot; width=&quot;2726&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;74pl&quot;&gt;Здесь нажимаем &amp;quot;&lt;em&gt;generate api key&lt;/em&gt;&amp;quot;, вводим название, и из появившегося окна с ключами, cохраняем &lt;em&gt;&lt;strong&gt;access_key&lt;/strong&gt;&lt;/em&gt; и &lt;em&gt;&lt;strong&gt;secret_key&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;
  &lt;figure id=&quot;31kz&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/60/ff/60ff2eb9-0cc6-4770-8396-d7eef37327fd.png&quot; width=&quot;1752&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;N9vz&quot;&gt;&lt;br /&gt;Очень важно их сохранить, потому что посмотреть их повторно будет нельзя.&lt;br /&gt;Так же нельзя допустить утечку этих ключей, иначе злоумышленники, смогут за ваш счёт создать кучу серверов от вашего имени и оператор может выставить вам некислый счёт.&lt;br /&gt;Также отсюда следует сохранить &lt;em&gt;&lt;strong&gt;project_id&lt;/strong&gt;&lt;/em&gt; он нам потребуется в дальнейшем.&lt;/p&gt;
  &lt;p id=&quot;ouyS&quot;&gt;&lt;strong&gt;2. Создаем файл variables.tf, где пропишем наши только что полученные ключи.&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;YfyC&quot; data-lang=&quot;toml&quot;&gt;variable &amp;quot;project_id&amp;quot; {
  default = &amp;quot;87432-d326-0474-91b8-d52a6789ccc5&amp;quot;
}
variable &amp;quot;access_key&amp;quot; {
  default = &amp;quot;SCW7141234562F0W60&amp;quot;
}
variable &amp;quot;secret_key&amp;quot; {
  default = &amp;quot;0dde9e8d-8e5a-4b5e-9499-da4c17bd5fc6&amp;quot;
}&lt;/pre&gt;
  &lt;p id=&quot;sABm&quot;&gt;&lt;strong&gt;3. Создаём файл с описанием модулей, назовём его providers.tf&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;CFuc&quot; data-lang=&quot;toml&quot;&gt;terraform {
  required_providers {
    scaleway = {
      source = &amp;quot;scaleway/scaleway&amp;quot;
      version = &amp;quot;2.2.8&amp;quot;
    }
  }
}

provider &amp;quot;scaleway&amp;quot; {
  project_id = var.project_id
  access_key = var.access_key
  secret_key = var.secret_key
  zone   = &amp;quot;fr-par-1&amp;quot;
  region = &amp;quot;fr-par&amp;quot;
}&lt;/pre&gt;
  &lt;p id=&quot;6oDr&quot;&gt;Мы делаем регионом по умолчанию Францию, вы можете выбрать любой другой регион, со списком можно ознакомиться здесь &lt;a href=&quot;https://registry.terraform.io/providers/scaleway/scaleway/latest/docs/guides/regions_and_zones&quot; target=&quot;_blank&quot;&gt;https://registry.terraform.io/providers/scaleway/scaleway/latest/docs/guides/regions_and_zones&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;JcQo&quot;&gt;&lt;strong&gt;4. Переходим к описанию нашего кластера.&lt;/strong&gt;&lt;br /&gt;Для начала нам потребуется описать сам кластер кубернетеса.&lt;br /&gt;Создадим файл с его описанием kubernetes.tf&lt;/p&gt;
  &lt;pre id=&quot;UGDc&quot; data-lang=&quot;toml&quot;&gt;resource &amp;quot;scaleway_k8s_cluster&amp;quot; &amp;quot;haqq&amp;quot; {
  name    = &amp;quot;haqq&amp;quot;
  version = &amp;quot;1.24.3&amp;quot;
  cni     = &amp;quot;calico&amp;quot;
}&lt;/pre&gt;
  &lt;p id=&quot;zHQT&quot;&gt;Далее опишем ноды, которые будут в нашем кластере в файле kubernetes-nodes.tf&lt;/p&gt;
  &lt;pre id=&quot;K3It&quot; data-lang=&quot;toml&quot;&gt;resource &amp;quot;scaleway_k8s_pool&amp;quot; &amp;quot;haqq-nodes1&amp;quot; {
  cluster_id  = scaleway_k8s_cluster.haqq.id
  name        = &amp;quot;nodes1&amp;quot;
  node_type   = &amp;quot;DEV1-L&amp;quot;
  size        = 1
  autoscaling = false
  autohealing = true
  min_size    = 1
  max_size    = 1
}&lt;/pre&gt;
  &lt;p id=&quot;TsgB&quot;&gt;Здесь я обращу внимание на параметры.&lt;br /&gt;&lt;em&gt;&lt;strong&gt;node_type&lt;/strong&gt;&lt;/em&gt; - это тип серверов которые мы добавляем в кластер.&lt;br /&gt;Scaleway предоставляет множество различных узлов, и вы их можете комбинировать в своём кластере.&lt;br /&gt;Актуальные названия инстансов можно посмотреть здесь &lt;a href=&quot;https://www.scaleway.com/en/docs/faq/instances/&quot; target=&quot;_blank&quot;&gt;https://www.scaleway.com/en/docs/faq/instances/&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;size &lt;/em&gt;&lt;/strong&gt;- количество серверов которые мы создаем в кластере&lt;br /&gt;&lt;strong&gt;&lt;em&gt;min_size / max_size &lt;/em&gt;&lt;/strong&gt;- в нашем случае равны size поскольку мы не используем автоматическое масштабирование кластера.&lt;/p&gt;
  &lt;p id=&quot;lF7i&quot;&gt;&lt;strong&gt;5. Мы готовы начинать !&lt;/strong&gt;&lt;br /&gt;Попробуем развернуть наш кластер.&lt;br /&gt;Для этого, нам нужно произвести инициализацию конфигурации&lt;/p&gt;
  &lt;pre id=&quot;Vpdg&quot;&gt;terrafrom init&lt;/pre&gt;
  &lt;p id=&quot;xTHX&quot;&gt;Далее попробуем сделать plan, то есть посмотрим, какие изменения попытается сделать наша созданная конфигурация.&lt;/p&gt;
  &lt;pre id=&quot;m95b&quot;&gt;terrafrom plan&lt;/pre&gt;
  &lt;p id=&quot;e7DU&quot;&gt;Если план проходит без проблем, попробуем развернуть наш кластер&lt;/p&gt;
  &lt;pre id=&quot;sOlu&quot;&gt;terraform apply&lt;/pre&gt;
  &lt;p id=&quot;nDUw&quot;&gt;После этого вас попросят ввести &lt;code&gt;yes&lt;/code&gt; подтвердив создание кластера.&lt;/p&gt;
  &lt;p id=&quot;4PYM&quot;&gt;После этого вы должны увидеть примерно следующий вывод в консоли&lt;/p&gt;
  &lt;pre id=&quot;zdIx&quot;&gt;scaleway_k8s_cluster.haqq: Creating...
scaleway_k8s_cluster.haqq: Creation complete after 6s [id=fr-par/505b2785-9d2f-4249-90d1-216190f1ef41]
scaleway_k8s_pool.haqq-pool-1: Creating...
scaleway_k8s_pool.haqq-pool-1: Still creating... [10s elapsed]
scaleway_k8s_pool.haqq-pool-1: Still creating... [20s elapsed]
.....
.....
scaleway_k8s_pool.haqq-pool-1: Still creating... [5m41s elapsed]
scaleway_k8s_pool.haqq-pool-1: Still creating... [5m51s elapsed]
scaleway_k8s_pool.haqq-pool-1: Creation complete after 5m59s [id=fr-par/730c89aa-99bb-494b-85e1-b2f6f22fc671]&lt;/pre&gt;
  &lt;p id=&quot;VpoV&quot;&gt;В веб интерфейсе scaleway в разделе Project Dasboard должна появится информация о только что созданных кластере и инстансе.&lt;/p&gt;
  &lt;figure id=&quot;FcbI&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/f2/ff/f2ff92dd-26a0-42b1-82ef-d91ced4ee030.png&quot; width=&quot;1502&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;KmRm&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/81/19/81194e20-efd9-4270-b7e7-a846ac5c9b9c.png&quot; width=&quot;2374&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;4qyS&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/b9/27/b927c806-c0ec-4976-977d-bce487be538f.png&quot; width=&quot;2376&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;0m7W&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;vuiZ&quot;&gt;Развертывание приложения&lt;/h3&gt;
  &lt;p id=&quot;Z6sT&quot;&gt;Теперь мы можем приступить к развертыванию самого приложения.&lt;/p&gt;
  &lt;p id=&quot;M7m0&quot;&gt;Но перед тем как мы начнём писать конфигурацию, нам необходимо сконфигурировать terraform для того чтобы он умел работать с kubernetes&lt;/p&gt;
  &lt;p id=&quot;505E&quot;&gt;Для этого мы возьмём официальный модуль для работы с kubernetes, документацию по нему вы можете найти здесь &lt;a href=&quot;https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/deployment&quot; target=&quot;_blank&quot;&gt;https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/deployment&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;cJPC&quot;&gt;Чтобы подключить данный модуль, нам необходимо в файле providers.tf в секции requred_providers добавить нового провайдера&lt;/p&gt;
  &lt;pre id=&quot;OtaT&quot; data-lang=&quot;toml&quot;&gt;kubernetes = {
      source  = &amp;quot;hashicorp/kubernetes&amp;quot;
      version = &amp;quot;2.13.0&amp;quot;
}&lt;/pre&gt;
  &lt;p id=&quot;4YN9&quot;&gt;По аналогии, как мы это делали с провайдером &lt;code&gt;scaleway&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;MHmJ&quot;&gt;Далее, нам необходимо сконфигурировать этого провайдера. Сделать мы это можем также по аналогии с тем как конфигурировали scaleway, добавив в том же самом файле providers.tf конфигурацию вида&lt;/p&gt;
  &lt;pre id=&quot;3LdZ&quot; data-lang=&quot;toml&quot;&gt;provider &amp;quot;kubernetes&amp;quot; {
  host                   = scaleway_k8s_cluster.haqq.kubeconfig.host
  token                  = scaleway_k8s_cluster.haqq.kubeconfig.token
  cluster_ca_certificate = scaleway_k8s_cluster.haqq.kubeconfig.cluster_ca_certificate
}&lt;/pre&gt;
  &lt;p id=&quot;rDHp&quot;&gt;Мы не будем вдаваться в подробности описания конфигурации, вы всегда можете почитать документацию модуля, по тому что все эти параметры означают.&lt;/p&gt;
  &lt;p id=&quot;Vp2b&quot;&gt;Теперь вернемся к нашим файлам конфигурации приложения&lt;/p&gt;
  &lt;p id=&quot;rw6V&quot;&gt;Нам понадобится описать ряд компонентов kubernetes которые и будут отвечать за наше приложение.&lt;/p&gt;
  &lt;p id=&quot;h2aP&quot;&gt;У нас это будут&lt;/p&gt;
  &lt;ol id=&quot;qbNI&quot;&gt;
    &lt;li id=&quot;31hN&quot;&gt;StatefulSet- собственно сам docker контейнер с конфигурацией нашего сервиса и томом, в котором будут хранится наши данные.&lt;/li&gt;
    &lt;li id=&quot;b1su&quot;&gt;ConfigMap - объект хранящий скрипт инициализации для первичного запуска.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;ocLJ&quot;&gt;Для начала напишем скрипт инициализации сети, и положим его в файл k8s_init.sh&lt;/p&gt;
  &lt;pre id=&quot;H6j5&quot; data-lang=&quot;bash&quot;&gt;#!/bin/bash

NETWORK=haqq_53211-1
MONIKER=beething

if [ -f &amp;quot;/root/.haqqd/haqq-k8s-init&amp;quot; ]; then
    echo already init
else
    haqqd config chain-id $NETWORK
    haqqd init $MONIKER -o --chain-id $NETWORK
    touch /root/.haqqd/haqq-k8s-init
fi

if [ -f &amp;quot;/root/.haqqd/haqq-k8s-genesis&amp;quot; ]; then
    echo already downloaded
else
    wget https://storage.googleapis.com/haqq-testedge-snapshots/genesis.json -O /root/.haqqd/config/genesis.json
    touch /root/.haqqd/haqq-k8s-genesis
fi

if [ -f &amp;quot;/root/.haqqd/haqq-k8s-state-sync&amp;quot; ]; then
    echo state-sync already configured
else
    wget https://raw.githubusercontent.com/haqq-network/testnets/main/TestEdge/state_sync.sh -O state_sync.sh
    bash state_sync.sh
    touch /root/.haqqd/haqq-k8s-state-sync
fi&lt;/pre&gt;
  &lt;p id=&quot;TuIv&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;p9JA&quot;&gt;Далее, создадим объект configMap который будет содержать наш скрипт.&lt;/p&gt;
  &lt;p id=&quot;7w3I&quot;&gt;Для простоты создадим файл haqq.tf и всю конфигурацию компонентов kubernetes будем описывать в нём&lt;/p&gt;
  &lt;pre id=&quot;FXmS&quot; data-lang=&quot;toml&quot;&gt;resource &amp;quot;kubernetes_config_map&amp;quot; &amp;quot;haqq-init&amp;quot; {
  metadata {
    name = &amp;quot;haqq-init&amp;quot;
  }

  data = {
    &amp;quot;haqq_init.sh&amp;quot; = &amp;quot;${file(&amp;quot;${path.module}/k8s_init.sh&amp;quot;)}&amp;quot;
  }

}&lt;/pre&gt;
  &lt;p id=&quot;Jdak&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;Loby&quot;&gt;Далее опишем наш StatefulSet&lt;/p&gt;
  &lt;pre id=&quot;8efv&quot; data-lang=&quot;toml&quot;&gt;resource &amp;quot;kubernetes_stateful_set&amp;quot; &amp;quot;haqq&amp;quot; {
  metadata {
    name   = &amp;quot;haqq-node&amp;quot;
    labels = { test = &amp;quot;haqq-node&amp;quot; }
  }

  spec {
    replicas     = 1
    service_name = &amp;quot;haqq&amp;quot;
    selector { match_labels = { test = &amp;quot;haqq-node&amp;quot; } }

    template {
      metadata { labels = { test = &amp;quot;haqq-node&amp;quot; } }

      spec {

        volume {
          name = &amp;quot;haqq-init&amp;quot;
          config_map {
            name = &amp;quot;haqq-init&amp;quot;
          }
        }

        init_container {
          name    = &amp;quot;init&amp;quot;
          image   = &amp;quot;alhaqq/haqq:v1.0.3&amp;quot;
          command = [&amp;quot;/bin/bash&amp;quot;, &amp;quot;-c&amp;quot;, &amp;quot;bash /root/haqq_init.sh&amp;quot;]

          volume_mount {
            name       = &amp;quot;haqq-init&amp;quot;
            mount_path = &amp;quot;/root/haqq_init.sh&amp;quot;
            sub_path   = &amp;quot;haqq_init.sh&amp;quot;
            read_only  = true
          }

          volume_mount {
            name       = &amp;quot;haqq-data&amp;quot;
            mount_path = &amp;quot;/root/.haqqd&amp;quot;
          }
        }

        container {
          image   = &amp;quot;alhaqq/haqq:v1.0.3&amp;quot;
          name    = &amp;quot;haqq-node&amp;quot;
          command = [&amp;quot;haqqd&amp;quot;, &amp;quot;start&amp;quot;, &amp;quot;--x-crisis-skip-assert-invariants&amp;quot;]

          resources {
            limits   = { cpu = &amp;quot;1&amp;quot;, memory = &amp;quot;4G&amp;quot; }
            requests = { cpu = &amp;quot;1&amp;quot;, memory = &amp;quot;4G&amp;quot; }
          }

          volume_mount {
            name       = &amp;quot;haqq-data&amp;quot;
            mount_path = &amp;quot;/root/.haqqd&amp;quot;
          }

        }
      }
    }

    volume_claim_template {
      metadata {
        name = &amp;quot;haqq-data&amp;quot;
      }

      spec {
        access_modes = [&amp;quot;ReadWriteOnce&amp;quot;]

        resources {
          requests = {
            storage = &amp;quot;10G&amp;quot;
          }
        }
      }
    }

  }
}&lt;/pre&gt;
  &lt;p id=&quot;fl4i&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;Gfqt&quot;&gt;На этом моменте, мы уже можем запускать нашу ноду !&lt;/p&gt;
  &lt;p id=&quot;wvuP&quot;&gt;Поскольку мы добавили новые модули, делаем повторно &lt;code&gt;terraform init&lt;/code&gt;и  &lt;code&gt;terraform apply&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;5apg&quot;&gt;После того как все применилось нам необходимо убедиться, что все запустилось нормально. Для этого нам понадобиться утилита для доступа к нашему кластеру - kubectl&lt;/p&gt;
  &lt;p id=&quot;GduN&quot;&gt;Как установить kubectl для вашей операционной системы вы можете найти в официальной документации &lt;a href=&quot;https://kubernetes.io/docs/tasks/tools/&quot; target=&quot;_blank&quot;&gt;Install Tools | Kubernetes&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;tOBb&quot;&gt;Мы же снова рассмотрим пример инсталяции для macOS. &lt;/p&gt;
  &lt;p id=&quot;iNm6&quot;&gt;Всё по аналогии с terraform потому не буду описывать что делает каждая команда&lt;/p&gt;
  &lt;p id=&quot;c3mD&quot;&gt;&lt;/p&gt;
  &lt;pre id=&quot;zUiw&quot; data-lang=&quot;bash&quot;&gt;curl -LO &amp;quot;https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/darwin/amd64/kubectl&amp;quot;
chmod +x ./kubectl 
sudo mv ./kubectl /usr/local/bin/kubectl
sudo chown root: /usr/local/bin/kubectl
kubectl version --client&lt;/pre&gt;
  &lt;p id=&quot;sf6b&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;PalF&quot;&gt;Далее, нам нужно получить конфигурацию для доступа в кластер, сделать это мы можем опять же при помощи terraform.&lt;/p&gt;
  &lt;p id=&quot;c3HQ&quot;&gt;Модуль scaleway который помогал нам создать кластер, предоставляет нам функционал, позволяющий получить его.&lt;/p&gt;
  &lt;p id=&quot;G7VS&quot;&gt;Воспользуемся им и опишем следующий ресурс&lt;/p&gt;
  &lt;pre id=&quot;szIz&quot; data-lang=&quot;toml&quot;&gt;resource &amp;quot;local_file&amp;quot; &amp;quot;haqq-kubeconfig&amp;quot; {
  content  = scaleway_k8s_cluster.haqq.kubeconfig.0.config_file
  filename = &amp;quot;haqq.kubeconfig&amp;quot;
}&lt;/pre&gt;
  &lt;p id=&quot;iSqg&quot;&gt;Далее чтобы им воспользоваться, необходим прописать в переменную окружения KUBECONFIG путь до нашего конфига.&lt;/p&gt;
  &lt;p id=&quot;ISSi&quot;&gt;&lt;code&gt;export KUBECONFIG=haqq.kubeconfig&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;VkQP&quot;&gt;После чего мы можем выполнить &lt;/p&gt;
  &lt;p id=&quot;X8yt&quot;&gt;&lt;code&gt;kubect get pods&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;g1X8&quot;&gt;И увидим примерно следующую картинку &lt;/p&gt;
  &lt;pre id=&quot;rD8A&quot; data-lang=&quot;shell&quot;&gt;NAME          READY   STATUS    RESTARTS   AGE
haqq-node-0   1/1     Running   0          23m&lt;/pre&gt;
  &lt;p id=&quot;BI89&quot;&gt;Значение 1/1 означает что наш узел запущен и работает&lt;/p&gt;
  &lt;p id=&quot;nLjU&quot;&gt;Его логи можно посмотреть командой &lt;/p&gt;
  &lt;p id=&quot;p2ux&quot;&gt;&lt;code&gt;kubectl logs -f haqq-node-0&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;6BzX&quot;&gt;Вот и всё ! Мы запустили ноду, теперь можно приступать к созданию валидатора !&lt;/p&gt;
  &lt;p id=&quot;Dw12&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;UMvW&quot;&gt;Запуск валидатора&lt;/h3&gt;
  &lt;p id=&quot;rsMT&quot;&gt;Поскольку запуск валидатора сопряжен с размещением приватных ключей и к тому же является одноразовой процедурой, мы никаким особенным образом не будем автоматизировать это.&lt;/p&gt;
  &lt;p id=&quot;M8fI&quot;&gt;Мы просто зайдём в контейнер нашей ноды и зарегистрируем валидатора.&lt;/p&gt;
  &lt;p id=&quot;pRMF&quot;&gt;Для начала проверим, что нода синхронизировалась.&lt;/p&gt;
  &lt;p id=&quot;20ZI&quot;&gt;Сделаем это зайдя внутрь ноды при помощи kubectl&lt;/p&gt;
  &lt;p id=&quot;Ci8s&quot;&gt;Имя контейнера можно взять из вывода, который мы делали в конце предыдущего этапа. В нашем случае это &lt;code&gt;haqq-node-0&lt;/code&gt;&lt;/p&gt;
  &lt;pre id=&quot;2mMv&quot;&gt;kubectl exec -it haqq-node-0 bash&lt;/pre&gt;
  &lt;p id=&quot;9GfK&quot;&gt;Оказавшись внутри контейнера делаем&lt;/p&gt;
  &lt;pre id=&quot;WbuQ&quot;&gt;haqqd status | jq .&amp;quot;SyncInfo&amp;quot;.catching_up&lt;/pre&gt;
  &lt;p id=&quot;Ux0U&quot;&gt;Если значение &lt;code&gt;false&lt;/code&gt; значит нода успешно синхронизирована.&lt;/p&gt;
  &lt;p id=&quot;PMum&quot;&gt;Перед активацией, забираем необходимые токены с крана на свой кошелек, и добавляем это кошелек на ноде из нашей seed фразы&lt;/p&gt;
  &lt;pre id=&quot;0FoG&quot;&gt;haqqd keys add &amp;lt;key_name&amp;gt; --recover&lt;/pre&gt;
  &lt;p id=&quot;02mO&quot;&gt;Далее можем регистрировать валидатора !&lt;/p&gt;
  &lt;pre id=&quot;oGvQ&quot;&gt;haqqd tx staking create-validator \
  --amount=1000000000000aISLM \
  --pubkey=$(haqqd tendermint show-validator) \
  --moniker=&amp;lt;your_moniker_name&amp;gt; \
  --chain-id=&amp;lt;chain_id&amp;gt; \
  --commission-rate=&amp;quot;0.10&amp;quot; \
  --commission-max-rate=&amp;quot;0.20&amp;quot; \
  --commission-max-change-rate=&amp;quot;0.01&amp;quot; \
  --min-self-delegation=&amp;quot;1000000&amp;quot; \
  --gas=&amp;quot;auto&amp;quot; \
  --gas-prices=&amp;quot;0.025aISLM&amp;quot; \
  --from=&amp;lt;key_name&amp;gt; \
  --node https://rpc.tm.testedge.haqq.network:443&lt;/pre&gt;
  &lt;p id=&quot;6f0Z&quot;&gt;Далее подтверждаем транзакцию и готово !&lt;/p&gt;
  &lt;p id=&quot;VOXH&quot;&gt;Далее как и в шаге выше, можете проверить что в логах всё хорошо&lt;/p&gt;
  &lt;pre id=&quot;c7Jq&quot;&gt;kubectl logs -f haqq-node-0&lt;/pre&gt;
  &lt;p id=&quot;6QV5&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;yxVa&quot;&gt;Удаление кластера&lt;/h3&gt;
  &lt;p id=&quot;4gJx&quot;&gt;Для того чтобы удалить весь кластер, со всеми виртуалками, данными и т д, достаточно ввести всего лишь одну команду&lt;/p&gt;
  &lt;pre id=&quot;Nz9O&quot;&gt;terraform destroy&lt;/pre&gt;

</content></entry></feed>