Nasadenie distribuovaných služieb v Yandex.Cloud pomocou Grafany ako príkladu

Ahojte všetci! V rámci mojej kurzovej práce som skúmal možnosti takejto domácej cloudovej platformy ako je Yandex.Cloud. Platforma ponúka rôzne služby na riešenie praktických problémov. Niekedy si však potrebujete zriadiť vlastnú cloudovú aplikáciu s pomerne rozsiahlou infraštruktúrou založenou na týchto službách. V tomto článku sa chcem podeliť o svoje skúsenosti s nasadením takejto aplikácie.

Nasadenie distribuovaných služieb v Yandex.Cloud pomocou Grafany ako príkladu

Čo chcete dostávať?

grafana — výkonný nástroj na riešenie analytických problémov alebo problémov monitorovania akýchkoľvek systémov. V základnej konfigurácii ide o virtuálny stroj s webovým serverom Grafana, ako aj databázou (ClickHouse, InfluxDB atď.) s datasetom, na ktorom bude založená analytika.

Po spustení virtuálneho stroja s webovým serverom môžete prejsť na jeho hostiteľa a získať krásne používateľské rozhranie, špecifikovať databázy ako zdroje pre ďalšiu prácu, vytvárať dashboardy a grafy.

Nasadenie distribuovaných služieb v Yandex.Cloud pomocou Grafany ako príkladu

Základná verzia má jeden podstatný nedostatok – nie je vôbec odolná voči poruchám. To znamená, že celá funkčnosť aplikácie závisí od životaschopnosti jedného virtuálneho počítača. Ak odmietne alebo otvorí používateľské rozhranie 10 ľudí súčasne, nastanú problémy.

Dajú sa vyriešiť jednoducho: stačí... nasadiť veľa rovnakých virtuálnych strojov s webovým serverom a umiestniť ich pod L3 balancer. Ale tu nie je všetko také jasné. Grafana ukladá užívateľské nastavenia (cesty k databázam, dashboardy, grafy a pod.) priamo na disk svojho virtuálneho stroja. Ak teda zmeníme niektoré nastavenia v UI, tieto zmeny sa prejavia len na virtuálnom stroji, kam nás balancer poslal. To povedie k nekonzistentným nastaveniam našej aplikácie, čo spôsobí problémy so spustením a používaním.

Tu príde na záchranu iná databáza, napríklad MySQL alebo jej ekvivalent. Hovoríme Grafane, že by mala ukladať používateľské nastavenia do tejto „náhradnej“ databázy. Potom bude stačiť na každom počítači raz zadať cestu k tejto databáze a upraviť všetky ostatné používateľské nastavenia na ktoromkoľvek z virtuálnych počítačov, ktoré sa rozšíria aj na ostatné.

Tu je schéma konečnej aplikačnej infraštruktúry:

Nasadenie distribuovaných služieb v Yandex.Cloud pomocou Grafany ako príkladu

Naučme sa dvíhať rukami

MySQL a ClickHouse

Pred nasadením takejto aplikácie kliknutím na tlačidlo bolo potrebné naučiť sa zaobchádzať s každým jej komponentom a vzájomne ich integrovať.

Tu nám pomôže Yandex.Cloud, ktorý poskytuje L3 balancery, ClickHouse a MySQL ako spravované služby. Používateľovi stačí zadať parametre a počkať, kým platforma všetko uvedie do prevádzkyschopného stavu.

Zaregistroval som sa, vytvoril cloud a platobný účet. Potom som prešiel do cloudu a nastavil klastre MySQL a ClickHouse s minimálnymi nastaveniami. Čakal som, kým budú aktívne.

Nasadenie distribuovaných služieb v Yandex.Cloud pomocou Grafany ako príkladuNasadenie distribuovaných služieb v Yandex.Cloud pomocou Grafany ako príkladu

Musíte tiež pamätať na vytvorenie databázy v každom klastri a nakonfigurovať prístup k nej pomocou prihlasovacieho mena a hesla. Nebudem tu zachádzať do podrobností - v rozhraní je všetko celkom zrejmé.

Nezrejmým detailom bolo, že tieto databázy majú veľa hostiteľov, ktorí zabezpečujú ich odolnosť voči chybám. Grafana však vyžaduje presne jedného hostiteľa pre každú databázu, s ktorou pracuje. Dlhé čítanie dokumentáciu K rozhodnutiu ma priviedli mraky. Ukazuje sa, že hostiteľ druhu c-<cluster_id>.rw.mdb.yandexcloud.net mapované na aktuálneho aktívneho hlavného hostiteľa klastra s príslušným ID. Toto dáme Grafane.

webový server

Teraz je to na webovom serveri. Vychováme bežný virtuálny stroj s Linuxom a manuálne na ňom nakonfigurujeme Grafana.

Nasadenie distribuovaných služieb v Yandex.Cloud pomocou Grafany ako príkladu

Nasadenie distribuovaných služieb v Yandex.Cloud pomocou Grafany ako príkladu

Pripojme sa cez ssh a nainštalujte potrebné balíčky.

sudo apt-get install -y apt-transport-https software-properties-common wget
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
sudo add-apt-repository "deb https://packages.grafana.com/enterprise/deb stable main"
sudo apt-get update
sudo apt-get install -y grafana-enterprise 

Potom spustíme Grafana pod systemctl a nainštalujeme plugin pre prácu s ClickHouse (áno, nie je dodávaný v základnom balení).

sudo systemctl start grafana-server
sudo systemctl enable grafana-server
sudo grafana-cli plugins install vertamedia-clickhouse-datasource

To je všetko, potom pomocou jednoduchého príkazu

sudo service grafana-server start

spustíme webový server. Teraz môžete zadať externú IP adresu virtuálneho stroja do prehliadača, zadať port 3000 a vidieť krásne používateľské rozhranie Grafana.
Nasadenie distribuovaných služieb v Yandex.Cloud pomocou Grafany ako príkladu

Ale neponáhľajte sa, pred nastavením Grafany si nezabudnite povedať cestu k MySQL, aby ste tam mohli uložiť nastavenia.

Celá konfigurácia webového servera Grafana je v súbore /etc/grafana/grafana.ini. Požadovaný riadok vyzerá takto:

;url =

Hostiteľa sme nastavili na klaster MySQL. Rovnaký súbor obsahuje prihlasovacie meno a heslo pre prístup do Grafany na obrázku vyššie, ktoré sú štandardne rovnaké admin.

Môžete použiť príkazy sed:

sudo sed -i "s#.*;url =.*#url = mysql://${MYSQL_USERNAME}:${MYSQL_PASSWORD}@${MYSQL_CLUSTER_URI}#" /etc/grafana/grafana.ini
sudo sed -i "s#.*;admin_user =.*#admin_user = ${GRAFANA_USERNAME}#" /etc/grafana/grafana.ini
sudo sed -i "s#.*;admin_password =.*#admin_password = ${GRAFANA_PASSWORD}#" /etc/grafana/grafana.ini

Je čas reštartovať webový server!

sudo service grafana-server restart

Teraz v používateľskom rozhraní Grafana určíme ClickHouse ako DataSource.

Podarilo sa mi dosiahnuť funkčnú konfiguráciu s nasledujúcimi nastaveniami:

Nasadenie distribuovaných služieb v Yandex.Cloud pomocou Grafany ako príkladu

Zadal som ako URL https://c-<cluster_id>.rw.mdb.yandexcloud.net:8443

Všetky! Máme jeden funkčný virtuálny stroj s webovým serverom pripojeným k CH a MySQL. Už môžete nahrať súbor údajov do ClickHouse a vytvoriť dashboardy. Náš cieľ sme však ešte nedosiahli a nenasadili plnohodnotnú infraštruktúru.

Balič

Yandex.Cloud vám umožňuje vytvoriť obraz disku existujúceho virtuálneho počítača a na jeho základe ľubovoľný počet navzájom identických strojov. To je presne to, čo budeme používať. Ak chcete pohodlne zostaviť obrázok, vezmite si nástroj Balič od spoločnosti HashiCorp. Ako vstup sa používa súbor json s pokynmi na zostavenie obrázka.

Náš súbor json bude pozostávať z dvoch blokov: staviteľov a poskytovateľov. Prvý blok popisuje parametre samotného obrázku ako entity a druhý blok popisuje inštrukcie na jeho naplnenie potrebným obsahom.

stavitelia

{
"builders": [
    {
      "type": "yandex",
      "endpoint": "{{user `endpoint`}}",
      "folder_id": "<folder_id>",
      "subnet_id": "{{user `subnet_id`}}",
      "zone": "{{user `zone`}}",
      "labels": {},
      "use_ipv4_nat": true,
      "use_internal_ip": false,
      "service_account_key_file": "<service_account_key_file>",
      "image_name": "grafana-{{timestamp}}",
      "image_family": "grafana",
      "image_labels": {},
      "image_description": "GRAFANA",
      "source_image_family": "ubuntu-1804-lts",
      "disk_size_gb": 3,
      "disk_type": "network-hdd",
      "ssh_username": "ubuntu"
    }
  ],
...
}

V tejto šablóne je potrebné nastaviť identifikátor sekcie v cloude, kde chcete vytvoriť obrázok, ako aj cestu k súboru s kľúčmi z účtu služby, ktorý bol predtým vytvorený v tejto sekcii. Viac o vytváraní servisných účtov a kľúčov vo forme súboru si môžete prečítať v príslušnej sekcii dokumentáciu.

Táto konfigurácia hovorí, že obraz disku bude vytvorený na základe platformy ubuntu-1804-lts, umiestnený v príslušnej používateľskej sekcii v rodine obrázkov GRAFANA pod menom grafana-{{timestamp}}.

Poskytovatelia

Teraz prichádza tá zaujímavejšia časť konfigurácie. Bude popisovať postupnosť akcií, ktoré bude potrebné vykonať na virtuálnom stroji pred zmrazením jeho stavu do obrazu disku.

{
...,
"provisioners": [
    {
            "type": "shell",
            "pause_before": "5s",
            "scripts": [
                "prepare-ctg.sh"
            ]
        },
    {
            "type": "file",
            "source": "setup.sh",
            "destination": "/opt/grafana/setup.sh"
        },
        {
            "type": "shell",
        "execute_command": "sudo {{ .Vars }} bash '{{ .Path }}'",
            "pause_before": "5s",
            "scripts": [
                "install-packages.sh",
                "grafana-setup.sh",
                "run-setup-at-reboot.sh"
        ]
        }
  ]
}

Tu sú všetky akcie rozdelené do 3 etáp. V prvej fáze sa spustí jednoduchý skript, ktorý vytvorí pomocný adresár.

pripraviť-ctg.sh:

#!/bin/bash
sudo mkdir -p /opt/grafana
sudo chown -R ubuntu:ubuntu /opt/grafana

V ďalšej fáze do tohto adresára umiestnime skript, ktorý bude potrebné spustiť ihneď po spustení virtuálneho počítača. Tento skript vloží používateľské premenné, ktoré je potrebné zaregistrovať, do konfigurácie Grafana a reštartuje webový server.

setup.sh:

#!/bin/bash
CLUSTER_ID="<cluster_id>"
USERNAME="<username>"
PASSWORD="<password>"
sudo sed -i "s#.*;url =.*#url = mysql://${USERNAME}:${PASSWORD}@c-${CLUSTER_ID}.rw.mdb.yandexcloud.net#" /etc/grafana/grafana.ini
sudo sed -i "s#.*;admin_user =.*#admin_user = ${USERNAME}#" /etc/grafana/grafana.ini
sudo sed -i "s#.*;admin_password =.*#admin_password = ${PASSWORD}#" /etc/grafana/grafana.ini
sudo service grafana-server restart

Potom ostávajú ešte 3 veci:
1) nainštalovať balíčky
2) spustite Grafana pod systemctl a nainštalujte doplnok ClickHouse
3) hneď po zapnutí virtuálneho počítača vložte skript setup.sh do frontu spustenia.

install-packages.sh:

#!/bin/bash
sudo systemd-run --property='After=apt-daily.service apt-daily-upgrade.service' --wait /bin/true
sudo apt-get install -y apt-transport-https
sudo apt-get install -y software-properties-common wget
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
sudo add-apt-repository "deb https://packages.grafana.com/enterprise/deb stable main"
sudo apt-get update
sudo apt-get install -y grafana-enterprise 

grafana-setup.sh:

#!/bin/bash
sudo systemctl start grafana-server
sudo systemctl enable grafana-server
sudo grafana-cli plugins install vertamedia-clickhouse-datasource

run-setup-at-reboot.sh:

#!/bin/bash
chmod +x /opt/grafana/setup.sh
cat > /etc/cron.d/first-boot <<EOF
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
@reboot root /bin/bash /opt/grafana/setup.sh > /var/log/yc-setup.log 2>&1
EOF
chmod +x /etc/cron.d/first-boot;

Teraz už zostáva len spustiť Packer a získať výstupný obraz umiestnený v zadanej sekcii. Pri vytváraní virtuálneho stroja si ho môžete vybrať ako boot disk a po spustení dostanete hotový webový server Grafana.

Nasadenie distribuovaných služieb v Yandex.Cloud pomocou Grafany ako príkladu
Nasadenie distribuovaných služieb v Yandex.Cloud pomocou Grafany ako príkladu

Skupina inštancií a balancer

Keď máme obraz disku, ktorý nám umožňuje vytvárať veľa identických webových serverov Grafana, môžeme vytvoriť skupinu inštancií. Na platforme Yandex.Cloud tento výraz označuje spojenie virtuálnych strojov, ktoré majú rovnaké vlastnosti. Pri vytváraní skupiny inštancií sa nakonfiguruje prototyp všetkých počítačov v tejto skupine a potom sa nakonfigurujú charakteristiky samotnej skupiny (napríklad minimálny a maximálny počet aktívnych počítačov). Ak aktuálny počet nespĺňa tieto kritériá, skupina inštancií sama odstráni nepotrebné počítače alebo vytvorí nové vo svojom vlastnom obraze.

V rámci našej úlohy vytvoríme skupinu inštancií webových serverov, ktorá sa vygeneruje z predtým vytvoreného obrazu disku.

Nasadenie distribuovaných služieb v Yandex.Cloud pomocou Grafany ako príkladu

Nasadenie distribuovaných služieb v Yandex.Cloud pomocou Grafany ako príkladu

Čo je skutočne pozoruhodné, je nastavenie skupiny poslednej inštancie. Cieľová skupina v integrácii s Load Balancer vám pomôže nakonfigurovať L3 balancer nad virtuálnymi strojmi tejto skupiny kliknutím na pár tlačidiel.

Nasadenie distribuovaných služieb v Yandex.Cloud pomocou Grafany ako príkladu

Pri nastavovaní balancéra som implementoval dva dôležité body:

  1. Urobil som balancer, aby akceptoval užívateľský prenos na porte 80 a presmeroval ho na port 3000 virtuálnych strojov, presne tam, kde žije Grafana.
  2. Nastavil som kontrolu životaschopnosti strojov pomocou príkazu ping na port 3000.

Nasadenie distribuovaných služieb v Yandex.Cloud pomocou Grafany ako príkladu

Mini zhrnutie

Nakoniec sa nám podarilo manuálne nasadiť požadovanú aplikačnú infraštruktúru a teraz máme vysoko odolnú službu Grafana. Potrebujete poznať iba IP adresu balancéra ako vstupného bodu do aplikácie a hostiteľa klastra ClickHouse, aby ste do neho mohli načítať súbor údajov.

Vyzerá to ako víťazstvo? Áno, víťazstvo. Ale stále ma niečo mätie. Celý proces uvedený vyššie vyžaduje veľa manuálnych krokov a nie je vôbec škálovateľný; ak je to možné, chcel by som ho zautomatizovať. Práve tomu bude venovaná nasledujúca časť.

Integrácia Terraform

Opäť použijeme nástroj od HashiCorp tzv terraform. Pomôže vám nasadiť celú infraštruktúru aplikácie kliknutím na tlačidlo na základe niekoľkých premenných odovzdaných používateľom. Napíšme recept, ktorý je možné spustiť viackrát v rôznych sekciách rôznych používateľov.

Všetka práca s Terraformom spočíva v napísaní konfiguračného súboru (*.tf) a vytvorenie infraštruktúry na nej založenej.

Premenné

Na úplný začiatok súboru zaradíme premenné, ktoré určujú, kde a ako bude budúca infraštruktúra nasadená.

variable "oauth_token" {
    type = string
    default = "<oauth-token>"
}
variable "cloud_id" {
    type = string
    default = "<cloud-id>"
}
variable "folder_id" {
    type = string
    default = "<folder_id>"
}
variable "service_account_id" {
    type = string
    default = "<service_account_id>"
}
variable "image_id" {
    type = string
    default = "<image_id>"
}
variable "username" {
    type = string
    default = "<username>"
}
variable "password" {
    type = string
    default = "<password>"
}
variable "dbname" {
    type = string
    default = "<dbname>"
}
variable "public_key_path" {
    type = string
    default = "<path to ssh public key>"
}

Celý proces nasadenia aplikácie bude spočívať v vytvorení obrazu disku a nastavení týchto premenných. Dovoľte mi vysvetliť, za čo sú zodpovední:

oauth_token — token pre prístup do cloudu. Dá sa získať prostredníctvom odkaz.
cloud_id — cloudový identifikátor, kam aplikáciu nasadíme
folder_id — identifikátor sekcie, kde aplikáciu nasadíme
service_account_id — identifikátor účtu služby v zodpovedajúcej časti cloudu.
image_id — identifikátor obrazu disku získaný pomocou Packer
meno и heslo — užívateľské meno a heslo pre prístup k databázam a web serveru Grafana
dbname — názov databázy v klastroch CH a MySQL
cesta k verejnému_kľúču — cesta k súboru s vaším verejným ssh kľúčom, ktorý môžete použiť na pripojenie pod menom ubuntu na virtuálne stroje s webovými servermi

Nastavenie poskytovateľa

Teraz musíte nakonfigurovať poskytovateľa Terraform - v našom prípade Yandex:

provider "yandex" {
  token     = var.oauth_token
  cloud_id  = var.cloud_id
  folder_id = var.folder_id
  zone      = "ru-central1-a"
}

Všimnete si, že tu používame premenné definované vyššie.

Sieť a klastre

Teraz vytvoríme sieť, v ktorej budú komunikovať prvky našej infraštruktúry, tri podsiete (jedna v každom regióne) a vytvoríme klastre CH a MySQL.


resource "yandex_vpc_network" "grafana_network" {}

resource "yandex_vpc_subnet" "subnet_a" {
  zone           = "ru-central1-a"
  network_id     = yandex_vpc_network.grafana_network.id
  v4_cidr_blocks = ["10.1.0.0/24"]
}

resource "yandex_vpc_subnet" "subnet_b" {
  zone           = "ru-central1-b"
  network_id     = yandex_vpc_network.grafana_network.id
  v4_cidr_blocks = ["10.2.0.0/24"]
}

resource "yandex_vpc_subnet" "subnet_c" {
  zone           = "ru-central1-c"
  network_id     = yandex_vpc_network.grafana_network.id
  v4_cidr_blocks = ["10.3.0.0/24"]
}

resource "yandex_mdb_clickhouse_cluster" "ch_cluster" {
  name        = "grafana-clickhouse"
  environment = "PRODUCTION"
  network_id  = yandex_vpc_network.grafana_network.id

  clickhouse {
    resources {
      resource_preset_id = "s2.micro"
      disk_type_id       = "network-ssd"
      disk_size          = 16
    }
  }

  zookeeper {
    resources {
      resource_preset_id = "s2.micro"
      disk_type_id       = "network-ssd"
      disk_size          = 10
    }
  }

  database {
    name = var.dbname
  }

  user {
    name     = var.username
    password = var.password
    permission {
      database_name = var.dbname
    }
  }

  host {
    type      = "CLICKHOUSE"
    zone      = "ru-central1-a"
    subnet_id = yandex_vpc_subnet.subnet_a.id
  }

  host {
    type      = "CLICKHOUSE"
    zone      = "ru-central1-b"
    subnet_id = yandex_vpc_subnet.subnet_b.id
  }

  host {
    type      = "CLICKHOUSE"
    zone      = "ru-central1-c"
    subnet_id = yandex_vpc_subnet.subnet_c.id
  }

  host {
    type      = "ZOOKEEPER"
    zone      = "ru-central1-a"
    subnet_id = yandex_vpc_subnet.subnet_a.id
  }

  host {
    type      = "ZOOKEEPER"
    zone      = "ru-central1-b"
    subnet_id = yandex_vpc_subnet.subnet_b.id
  }

  host {
    type      = "ZOOKEEPER"
    zone      = "ru-central1-c"
    subnet_id = yandex_vpc_subnet.subnet_c.id
  }
}

resource "yandex_mdb_mysql_cluster" "mysql_cluster" {
  name        = "grafana_mysql"
  environment = "PRODUCTION"
  network_id  = yandex_vpc_network.grafana_network.id
  version     = "8.0"

  resources {
    resource_preset_id = "s2.micro"
    disk_type_id       = "network-ssd"
    disk_size          = 16
  }

  database {
    name = var.dbname
  }

  user {
    name     = var.username
    password = var.password
    permission {
      database_name = var.dbname
      roles         = ["ALL"]
    }
  }

  host {
    zone      = "ru-central1-a"
    subnet_id = yandex_vpc_subnet.subnet_a.id
  }
  host {
    zone      = "ru-central1-b"
    subnet_id = yandex_vpc_subnet.subnet_b.id
  }
  host {
    zone      = "ru-central1-c"
    subnet_id = yandex_vpc_subnet.subnet_c.id
  }
}

Ako vidíte, každý z dvoch klastrov je vytvorený celkom odolný voči chybám umiestnením do troch zón dostupnosti.

webové servery

Zdalo by sa, že by sme mohli pokračovať v rovnakom duchu, no narazil som na ťažkosti. Predtým som najprv vytvoril klaster MySQL a až potom som so znalosťou jeho ID zhromaždil obraz disku s požadovanou konfiguráciou, kde som špecifikoval hostiteľa klastra. Teraz však nepoznáme ID klastra pred spustením Terraform, a to ani v čase vytvárania obrazu. Preto som sa musel uchýliť k nasledovnému trik.

Pomocou metadátovej služby Amazonu odovzdáme virtuálnemu stroju niektoré parametre, ktoré prijme a spracuje. Potrebujeme, aby stroj po spustení prešiel na metadáta za hostiteľom klastra MySQL a používateľské meno-heslo, ktoré používateľ zadal v súbore Terraform. Zmeňme mierne obsah súboru setup.sh, ktorý sa spustí, keď je virtuálny stroj zapnutý.

setup.sh:

#!/bin/bash
CLUSTER_URI="$(curl -H 'Metadata-Flavor:Google' http://169.254.169.254/computeMetadata/v1/instance/attributes/mysql_cluster_uri)"
USERNAME="$(curl -H 'Metadata-Flavor:Google' http://169.254.169.254/computeMetadata/v1/instance/attributes/username)"
PASSWORD="$(curl -H 'Metadata-Flavor:Google' http://169.254.169.254/computeMetadata/v1/instance/attributes/password)"
sudo sed -i "s#.*;url =.*#url = mysql://${USERNAME}:${PASSWORD}@${CLUSTER_URI}#" /etc/grafana/grafana.ini
sudo sed -i "s#.*;admin_user =.*#admin_user = ${USERNAME}#" /etc/grafana/grafana.ini
sudo sed -i "s#.*;admin_password =.*#admin_password = ${PASSWORD}#" /etc/grafana/grafana.ini
sudo service grafana-server restart

Intance group a balancer

Po prebudovaní nového obrazu disku môžeme konečne pridať náš súbor pre Terraform.

Označme, že chceme použiť existujúci obraz disku:

data "yandex_compute_image" "grafana_image" {
  image_id = var.image_id
}

Teraz vytvorte skupinu inštancií:

resource "yandex_compute_instance_group" "grafana_group" {
  name               = "grafana-group"
  folder_id          = var.folder_id
  service_account_id = var.service_account_id
  instance_template {
    platform_id = "standard-v1"
    resources {
      memory = 1
      cores  = 1
    }
    boot_disk {
      mode = "READ_WRITE"
      initialize_params {
        image_id = data.yandex_compute_image.grafana_image.id
        size     = 4
      }
    }
    network_interface {
      network_id = yandex_vpc_network.grafana_network.id
      subnet_ids = [yandex_vpc_subnet.subnet_a.id, yandex_vpc_subnet.subnet_b.id, yandex_vpc_subnet.subnet_c.id]
      nat = "true"
    }
    metadata = {
      mysql_cluster_uri = "c-${yandex_mdb_mysql_cluster.mysql_cluster.id}.rw.mdb.yandexcloud.net:3306/${var.dbname}"
      username = var.username
      password = var.password
      ssh-keys = "ubuntu:${file("${var.public_key_path}")}"
    }
    network_settings {
      type = "STANDARD"
    }
  }

  scale_policy {
    fixed_scale {
      size = 6
    }
  }

  allocation_policy {
    zones = ["ru-central1-a", "ru-central1-b", "ru-central1-c"]
  }

  deploy_policy {
    max_unavailable = 2
    max_creating    = 2
    max_expansion   = 2
    max_deleting    = 2
  }

  load_balancer {
    target_group_name = "grafana-target-group"
  }
}

Stojí za to venovať pozornosť tomu, ako sme to odovzdali do metadát cluster_uri, username и password. Sú to tie, ktoré virtuálny stroj vyberie pri spustení a vloží ich do konfigurácie Grafana.

Je to na vyvažovači.

resource "yandex_lb_network_load_balancer" "grafana_balancer" {
  name = "grafana-balancer"

  listener {
    name = "grafana-listener"
    port = 80
    target_port = 3000
    external_address_spec {
      ip_version = "ipv4"
    }
  }

  attached_target_group {
    target_group_id = yandex_compute_instance_group.grafana_group.load_balancer.0.target_group_id

    healthcheck {
      name = "healthcheck"
      tcp_options {
        port = 3000
      }
    }
  }
}

Trochu cukru

Zostáva len málo. Po nasadení infraštruktúry budete musieť prejsť do používateľského rozhrania Grafana a manuálne pridať klaster CH (ktorého ID je ešte potrebné získať) ako zdroj údajov. Terraform však pozná ID klastra. Zverme mu, aby vec dotiahol do konca.

Pridajme nového poskytovateľa – Grafana, a dajme jej IP adresu balancéra ako hostiteľa. Všetky zmeny, ktoré Terraform vykoná na stroji, kde jeho balancer určí, porastú v MySQL, a teda na všetkých ostatných strojoch.

provider "grafana" {
  url  = "http://${[for s in yandex_lb_network_load_balancer.grafana_balancer.listener: s.external_address_spec.0.address].0}"
  auth = "${var.username}:${var.password}"
}

resource "grafana_data_source" "ch_data_source" {
  type          = "vertamedia-clickhouse-datasource"
  name          = "grafana"
  url           = "https://c-${yandex_mdb_clickhouse_cluster.ch_cluster.id}.rw.mdb.yandexcloud.net:8443"
  basic_auth_enabled = "true"
  basic_auth_username = var.username
  basic_auth_password = var.password
  is_default = "true"
  access_mode = "proxy"
}

Rozčešeme si vlasy

Zobrazme IP adresu balancéra a hostiteľa klastra ClickHouse

output "grafana_balancer_ip_address" {
  value = [for s in yandex_lb_network_load_balancer.grafana_balancer.listener: s.external_address_spec.0.address].0
}

output "clickhouse_cluster_host" {
  value = "https://c-${yandex_mdb_clickhouse_cluster.ch_cluster.id}.rw.mdb.yandexcloud.net:8443"
}

Dá sa bežať

Všetky! Náš konfiguračný súbor je pripravený a nastavením premenných môžeme povedať Terraformu, aby zvýšil všetko, čo sme popísali vyššie. Celý proces mi trval asi 15 minút.
Na konci môžete vidieť krásnu správu:

Apply complete! Resources: 9 added, 0 changed, 0 destroyed.
Outputs:

clickhouse_cluster_host = https://c-c9q14ipa2ngadqsbp2iq.rw.mdb.yandexcloud.net:8443
grafana_balancer_ip_address = 130.193.50.25

A v cloude budú viditeľné prvky vyvýšenej infraštruktúry:

Nasadenie distribuovaných služieb v Yandex.Cloud pomocou Grafany ako príkladu

Zhrnúť

Teraz pomocou Grafany ako príkladu môže každý z vás nasadiť aplikácie s rozľahlou cloudovou architektúrou na platforme Yandex.Cloud. Užitočné nástroje od HashiCorp ako Packer a Terraform vám s tým môžu pomôcť. Dúfam, že tento článok bude pre niekoho užitočný :)

PS Nižšie pripojím odkaz na úložisko, kde nájdete hotové recepty pre Packer a Terraform, fragmenty ktorých som uviedol v tomto článku.

Úložisko

Zdroj: hab.com

Pridať komentár