Implementacija distribuiranih usluga u Yandex.Cloudu na primjeru Grafane

Bok svima! U sklopu kolegija istraživao sam mogućnosti takve domaće cloud platforme kao što je Yandex.Cloud. Platforma nudi različite usluge za rješavanje praktičnih problema. Međutim, ponekad morate postaviti vlastitu aplikaciju u oblaku s prilično opsežnom infrastrukturom temeljenom na tim uslugama. U ovom članku želim podijeliti svoje iskustvo u postavljanju takve aplikacije.

Implementacija distribuiranih usluga u Yandex.Cloudu na primjeru Grafane

Što želite primiti?

grafana — snažan alat za rješavanje analitičkih problema ili problema praćenja bilo kojeg sustava. U osnovnoj konfiguraciji radi se o virtualnom stroju s Grafana web serverom, kao i bazi podataka (ClickHouse, InfluxDB itd.) sa skupom podataka na kojem će se temeljiti analitika.

Nakon pokretanja virtualnog stroja s web poslužiteljem, možete otići na njegov host i dobiti prekrasno korisničko sučelje, odrediti baze podataka kao izvore za daljnji rad, izraditi nadzorne ploče i grafikone.

Implementacija distribuiranih usluga u Yandex.Cloudu na primjeru Grafane

Osnovna verzija ima jedan značajan nedostatak - uopće nije tolerantna na pogreške. Odnosno, cjelokupna funkcionalnost aplikacije ovisi o održivosti jednog virtualnog stroja. Ako odbije ili 10 ljudi otvori UI u isto vrijeme, tada će nastati problemi.

Mogu se jednostavno riješiti: samo trebate... postaviti mnogo identičnih virtualnih strojeva s web poslužiteljem i smjestiti ih pod L3 balanser. Ali ovdje nije sve tako jasno. Grafana pohranjuje korisničke postavke (putove do baza podataka, nadzorne ploče, grafikone itd.) izravno na disk svog virtualnog računala. Dakle, ako promijenimo neke postavke u korisničkom sučelju, te promjene će se odraziti samo na virtualnom računalu na koje nas je balanser poslao. To će dovesti do nedosljednih postavki za našu aplikaciju, uzrokujući probleme s pokretanjem i korištenjem.

Ovdje će druga baza podataka doći u pomoć, na primjer, MySQL ili njegov ekvivalent. Kažemo Grafanu da u tu “rezervnu” bazu pohrani korisničke postavke. Nakon toga bit će dovoljno navesti put do ove baze jednom na svakom računalu, a sve ostale korisničke postavke urediti na bilo kojem od virtualnih strojeva, one će se proširiti na ostale.

Ovdje je dijagram konačne aplikacijske infrastrukture:

Implementacija distribuiranih usluga u Yandex.Cloudu na primjeru Grafane

Naučimo dizati rukama

MySQL i ClickHouse

Prije postavljanja takve aplikacije jednim pritiskom na gumb, bilo je potrebno naučiti rukovati svakom od njenih komponenti i integrirati ih jedne s drugima.

Ovdje će nam pomoći Yandex.Cloud, koji pruža L3 balansere, ClickHouse i MySQL kao upravljane usluge. Korisnik samo treba odrediti parametre i pričekati dok platforma ne dovede sve u ispravno stanje.

Registrirao sam se, napravio cloud i račun za plaćanje. Nakon toga sam otišao u oblak i postavio MySQL i ClickHouse klastere s minimalnim postavkama. Čekao sam dok nisu postali aktivni.

Implementacija distribuiranih usluga u Yandex.Cloudu na primjeru GrafaneImplementacija distribuiranih usluga u Yandex.Cloudu na primjeru Grafane

Također se morate sjetiti kreiranja baze podataka u svakom klasteru i konfiguriranja pristupa njoj pomoću prijave i lozinke. Ovdje neću ulaziti u detalje - sve je sasvim očito u sučelju.

Neočit detalj bio je da te baze podataka imaju mnogo hostova, što osigurava njihovu toleranciju na pogreške. Međutim, Grafana zahtijeva točno jedan host za svaku bazu podataka s kojom radi. Dugo čitanje dokumentacija Oblaci su me doveli do odluke. Ispada da je domaćin vrste c-<cluster_id>.rw.mdb.yandexcloud.net preslikan na trenutni aktivni glavni host klastera s odgovarajućim ID-om. Ovo ćemo dati Grafanu.

Web poslužitelj

Sada je na web poslužitelju. Podignimo obični virtualni stroj s Linuxom i ručno konfigurirajmo Grafanu na njemu.

Implementacija distribuiranih usluga u Yandex.Cloudu na primjeru Grafane

Implementacija distribuiranih usluga u Yandex.Cloudu na primjeru Grafane

Spojimo se preko ssh-a i instalirajmo potrebne pakete.

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 

Nakon toga pokrenimo Grafanu pod systemctl i instalirajmo plugin za rad sa ClickHouseom (da, ne dolazi u osnovnom paketu).

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

To je to, nakon toga jednostavnom naredbom

sudo service grafana-server start

pokrenut ćemo web poslužitelj. Sada možete unijeti vanjsku IP adresu virtualnog stroja u preglednik, odrediti port 3000 i vidjeti prekrasno Grafana korisničko sučelje.
Implementacija distribuiranih usluga u Yandex.Cloudu na primjeru Grafane

Ali nemojte žuriti, prije postavljanja Grafane, ne zaboravite joj reći put do MySQL-a kako biste tamo pohranili postavke.

Cjelokupna konfiguracija Grafana web poslužitelja nalazi se u datoteci /etc/grafana/grafana.ini. Potrebna linija izgleda ovako:

;url =

Host postavljamo na MySQL klaster. U istoj datoteci nalaze se login i password za pristup Grafani na gornjoj slici, koji su po defaultu jednaki admin.

Možete koristiti sed naredbe:

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

Vrijeme je za ponovno pokretanje web poslužitelja!

sudo service grafana-server restart

Sada ćemo u Grafana korisničkom sučelju navesti ClickHouse kao DataSource.

Uspio sam postići radnu konfiguraciju sa sljedećim postavkama:

Implementacija distribuiranih usluga u Yandex.Cloudu na primjeru Grafane

Naveo sam kao URL https://c-<cluster_id>.rw.mdb.yandexcloud.net:8443

Svi! Imamo jednu virtualnu mašinu koja radi s web serverom spojenim na CH i MySQL. Već možete prenijeti skup podataka u ClickHouse i izraditi nadzorne ploče. Međutim, još nismo postigli svoj cilj i nismo postavili potpunu infrastrukturu.

Paker

Yandex.Cloud vam omogućuje stvaranje slike diska postojećeg virtualnog stroja, a na njegovoj osnovi - bilo kojeg broja strojeva koji su međusobno identični. To je upravo ono što ćemo mi koristiti. Da biste jednostavno sastavili sliku, uzmite alat Paker iz HashiCorpa. Kao ulaz uzima json datoteku s uputama za sastavljanje slike.

Naša json datoteka sastojat će se od dva bloka: graditelji i pružatelji usluga. Prvi blok opisuje parametre same slike kao entiteta, a drugi blok opisuje upute za njeno popunjavanje potrebnim sadržajem.

Graditelji

{
"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"
    }
  ],
...
}

U ovom predlošku morate postaviti identifikator odjeljka u oblaku u kojem želite kreirati sliku, kao i putanju do datoteke s ključevima iz servisnog računa prethodno kreiranog u ovom odjeljku. Više o kreiranju servisnih računa i ključeva u obliku datoteke možete pročitati u odgovarajućem odjeljku dokumentacija.

Ova konfiguracija kaže da će slika diska biti izgrađena na temelju platforme ubuntu-1804-lts, postavljen u odgovarajući korisnički odjeljak u obitelji slika GRAFANA pod imenom grafana-{{timestamp}}.

Provizori

Sada dolazi zanimljiviji dio konfiguracije. Opisat će slijed radnji koje će se morati izvršiti na virtualnom stroju prije zamrzavanja njegovog stanja u sliku diska.

{
...,
"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"
        ]
        }
  ]
}

Ovdje su sve radnje podijeljene u 3 faze. U prvoj fazi izvršava se jednostavna skripta koja stvara pomoćni direktorij.

pripremi-ctg.sh:

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

U sljedećoj fazi postavljamo skriptu u ovaj direktorij, koja će se morati pokrenuti odmah nakon pokretanja virtualnog stroja. Ova skripta će staviti korisničke varijable koje je potrebno registrirati u Grafana konfiguraciju i ponovno pokrenuti web poslužitelj.

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

Nakon ovoga preostaju još 3 stvari:
1) instalirajte pakete
2) pokrenite Grafanu pod systemctl i instalirajte ClickHouse dodatak
3) stavite skriptu setup.sh u red čekanja za pokretanje odmah nakon uključivanja virtualnog stroja.

instalacijski paketi.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;

Sada sve što preostaje je pokrenuti Packer i postaviti izlaznu sliku u navedeni odjeljak. Prilikom izrade virtualnog stroja možete ga odabrati kao boot disk i nakon pokretanja dobit ćete gotov Grafana web poslužitelj.

Implementacija distribuiranih usluga u Yandex.Cloudu na primjeru Grafane
Implementacija distribuiranih usluga u Yandex.Cloudu na primjeru Grafane

Grupa instanci i balanser

Nakon što imamo sliku diska koja nam omogućuje stvaranje mnogo identičnih Grafana web poslužitelja, možemo stvoriti grupu instanci. Na platformi Yandex.Cloud ovaj se pojam odnosi na uniju virtualnih strojeva koji imaju iste karakteristike. Prilikom kreiranja grupe instanci konfigurira se prototip svih strojeva u ovoj grupi, a potom i karakteristike same grupe (primjerice minimalni i maksimalni broj aktivnih strojeva). Ako trenutni broj ne zadovoljava ove kriterije, tada će grupa instanci sama ukloniti nepotrebne strojeve ili stvoriti nove prema vlastitoj slici.

Kao dio našeg zadatka, kreirat ćemo grupu instanci web poslužitelja koji će biti generirani iz prethodno kreirane slike diska.

Implementacija distribuiranih usluga u Yandex.Cloudu na primjeru Grafane

Implementacija distribuiranih usluga u Yandex.Cloudu na primjeru Grafane

Ono što je uistinu izvanredno je postavljanje grupe u zadnjoj instanci. Ciljna skupina u integraciji s Load Balancerom pomoći će vam da konfigurirate L3 balanser povrh virtualnih strojeva ove grupe klikom na nekoliko gumba.

Implementacija distribuiranih usluga u Yandex.Cloudu na primjeru Grafane

Prilikom postavljanja balansera implementirao sam dvije važne točke:

  1. Natjerao sam balanser da prihvati korisnički promet na portu 80 i preusmjeri ga na port 3000 virtualnih strojeva, točno tamo gdje živi Grafana.
  2. Postavio sam provjeru održivosti strojeva slanjem pinga na port 3000.

Implementacija distribuiranih usluga u Yandex.Cloudu na primjeru Grafane

Mini sažetak

Napokon smo uspjeli ručno implementirati željenu aplikacijsku infrastrukturu i sada imamo vrlo otpornu uslugu Grafana. Trebate znati samo IP adresu balansera kao ulazne točke u aplikaciju i host ClickHouse klastera kako biste učitali skup podataka u njega.

Čini se kao pobjeda? Da, pobjeda. Ali nešto me ipak zbunjuje. Cijeli gore navedeni postupak zahtijeva mnogo ručnih koraka i uopće nije skalabilan; želio bih ga automatizirati ako je moguće. Tome će biti posvećen sljedeći odjeljak.

Terraform integracija

Ponovno ćemo koristiti alat tvrtke HashiCorp tzv Terraform. Pomoći će vam da implementirate cjelokupnu aplikacijsku infrastrukturu jednim pritiskom na gumb, na temelju nekoliko varijabli koje prosljeđuje korisnik. Napišimo recept koji se može pokrenuti više puta u različitim odjeljcima različitih korisnika.

Sav rad s Terraformom svodi se na pisanje konfiguracijske datoteke (*.tf) i stvaranje infrastrukture na temelju toga.

varijable

Na samom početku datoteke uključit ćemo varijable koje određuju gdje i kako će se buduća infrastruktura postaviti.

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>"
}

Cijeli proces postavljanja aplikacije svodit će se na izradu slike diska i postavljanje ovih varijabli. Dopustite mi da objasnim za što su odgovorni:

oauth_token — token za pristup oblaku. Može se dobiti od link.
cloud_id — identifikator oblaka gdje ćemo implementirati aplikaciju
folder_id — identifikator odjeljka gdje ćemo implementirati aplikaciju
service_account_id — identifikator računa usluge u odgovarajućem odjeljku oblaka.
image_id — identifikator slike diska dobivene korištenjem Packera
korisničko ime и lozinka — korisničko ime i lozinka za pristup bazama i Grafana web poslužitelju
dbname — naziv baze podataka unutar CH i MySQL klastera
put_javnog_ključa — put do datoteke s vašim javnim ssh ključem, koji možete koristiti za povezivanje pod imenom ubuntu na virtualne strojeve s web poslužiteljima

Postavljanje davatelja usluga

Sada morate konfigurirati pružatelja usluge Terraform - u našem slučaju Yandex:

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

Primijetit ćete da ovdje koristimo gore definirane varijable.

Mreža i klasteri

Sada ćemo napraviti mrežu u kojoj će komunicirati elementi naše infrastrukture, tri podmreže (po jedna u svakoj regiji) i podignuti CH i MySQL klastere.


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
  }
}

Kao što možete vidjeti, svaki od dva klastera stvoren je prilično tolerantan na pogreške jer se nalazi u tri zone dostupnosti.

Web poslužitelji

Čini se da bismo mogli nastaviti u istom duhu, ali naišao sam na poteškoće. Prije toga sam prvo podigao MySQL klaster i tek nakon toga, znajući njegov ID, skupio sam sliku diska sa potrebnom konfiguracijom, gdje sam specificirao host klasteru. Ali sada ne znamo ID klastera prije pokretanja Terraforma, uključujući i vrijeme izgradnje slike. Stoga sam morao pribjeći sljedećem trik.

Pomoću Amazonove usluge metapodataka proslijediti ćemo neke parametre virtualnom računalu koje će ono prihvatiti i obraditi. Potrebno nam je da stroj ide do metapodataka iza MySQL hosta klastera i korisničkog imena-lozinke, koje je korisnik naveo u datoteci Terraform, nakon pokretanja. Malo promijenimo sadržaj datoteke setup.sh, koji se pokreće kada je virtualni stroj uključen.

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

Grupa ulaza i balanser

Nakon što smo ponovno izgradili novu sliku diska, konačno možemo dodati našu datoteku za Terraform.

Naznačimo da želimo koristiti postojeću sliku diska:

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

Kreirajmo sada grupu instanci:

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"
  }
}

Vrijedno je obratiti pozornost na to kako smo to prenijeli u metapodatke cluster_uri, username и password. Upravo će ih virtualni stroj izvaditi pri pokretanju i staviti u Grafana konfiguraciju.

To je na balanseru.

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
      }
    }
  }
}

Malo šećera

Još samo malo. Nakon što je infrastruktura postavljena, morat ćete otići na Grafana UI i ručno dodati CH klaster (čiji ID još treba dobiti) kao izvor podataka. Ali Terraform zna ID klastera. Povjerimo mu da stvar dovede do kraja.

Dodajmo novog provajdera - Grafana i dajmo joj IP adresu balansera kao host. Sve promjene koje Terraform napravi na stroju za koji njegov balanser odredi da će rasti u MySQL-u, a time i na svim ostalim strojevima.

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"
}

Počešljajmo se

Prikažimo IP adresu balansera i host ClickHouse klastera

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"
}

Može trčati

Svi! Naša konfiguracijska datoteka je spremna i možemo, postavljanjem varijabli, reći Terraformu da podigne sve što smo gore opisali. Cijeli proces mi je oduzeo oko 15 minuta.
Na kraju možete vidjeti prekrasnu poruku:

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 u oblaku će biti vidljivi elementi podignute infrastrukture:

Implementacija distribuiranih usluga u Yandex.Cloudu na primjeru Grafane

Sumirati

Sada, koristeći Grafanu kao primjer, svatko od vas može implementirati aplikacije s prostranom arhitekturom oblaka na platformi Yandex.Cloud. U tome vam mogu pomoći korisni alati tvrtke HashiCorp kao što su Packer i Terraform. Nadam se da će nekome ovaj članak biti koristan :)

PS U nastavku ću priložiti vezu na spremište gdje možete pronaći gotove recepte za Packer i Terraform, čije sam fragmente naveo u ovom članku.

spremište

Izvor: www.habr.com

Dodajte komentar