Postavljanje distribuiranih usluga u Yandex.Cloud koristeći Grafanu kao primjer

Zdravo svima! U okviru svog kursa istraživao sam mogućnosti jedne domaće cloud platforme kao što je Yandex.Cloud. Platforma nudi različite usluge za rješavanje praktičnih problema. Međutim, ponekad je potrebno konfigurirati svoju aplikaciju u oblaku s prilično opsežnom infrastrukturom zasnovanom na ovim uslugama. U ovom članku želim podijeliti iskustvo postavljanja takve aplikacije.

Postavljanje distribuiranih usluga u Yandex.Cloud koristeći Grafanu kao primjer

Šta želite da dobijete?

grafana - moćan alat za rješavanje analitičkih problema ili praćenje problema bilo kojeg sistema. U svojoj osnovnoj konfiguraciji, ovo je virtuelna mašina sa Grafana web serverom, kao i baza podataka (ClickHouse, InfluxDB, itd.) sa skupom podataka koji će se koristiti za izradu analitike.

Nakon pokretanja virtuelne mašine sa web serverom, možete otići na njen host i dobiti prekrasan korisnički interfejs, odrediti baze podataka kao izvore za dalji rad, kreirati kontrolne table i grafikone.

Postavljanje distribuiranih usluga u Yandex.Cloud koristeći Grafanu kao primjer

Osnovna verzija ima jedan značajan nedostatak - nije nimalo otporna na greške. Odnosno, cjelokupna izvedba aplikacije ovisi o održivosti jedne virtualne mašine. Ako ona odbije ili ako 10 ljudi istovremeno otvori UI, onda će nastati problemi.

Oni su jednostavno riješeni: potrebno je samo postaviti mnogo identičnih virtuelnih mašina sa web serverom i staviti ih pod L3 balanser. Ali ovdje nije sve tako jasno. Grafana pohranjuje korisnička podešavanja (puteve do baza podataka, nadzorne ploče, grafike, itd.) direktno na disk svoje virtuelne mašine. Dakle, ako promijenite neke postavke u korisničkom sučelju, tada će se te promjene prikazati samo na virtuelnoj mašini na koju nam je poslao balanser. To će dovesti do nedosljednih postavki naše aplikacije, problema s pokretanjem i korištenjem.

Ovdje će druga baza podataka doći u pomoć, na primjer, MySQL ili njegov ekvivalent. Kažemo Grafani da bi trebala pohraniti korisnička podešavanja u ovu "rezervnu" bazu podataka. Nakon toga će biti dovoljno da na svakoj mašini jednom odredite putanju do ove baze podataka i uredite sve ostale korisničke postavke na bilo kojoj od virtuelnih mašina, one će rasti na ostalim.

Evo dijagrama konačne aplikativne infrastrukture:

Postavljanje distribuiranih usluga u Yandex.Cloud koristeći Grafanu kao primjer

Naučite podizati rukama

MySQL i ClickHouse

Prije implementacije takve aplikacije jednim klikom na dugme, bilo je potrebno naučiti kako podići svaku od njenih komponenti pomoću ručki i integrirati ih jednu s drugom.

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

Registrovao sam se, kreirao oblak i račun za naplatu za sebe. Nakon toga sam otišao u oblak i podigao MySQL i ClickHouse klastere sa minimalnim postavkama. Pričekajte dok ne postanu aktivni.

Postavljanje distribuiranih usluga u Yandex.Cloud koristeći Grafanu kao primjerPostavljanje distribuiranih usluga u Yandex.Cloud koristeći Grafanu kao primjer

Također morate zapamtiti da kreirate bazu podataka u svakom klasteru i konfigurirate joj pristup putem prijave i lozinke. Ovdje neću ulaziti u detalje - sve je očigledno u interfejsu.

Neočigledan detalj bio je da ove baze podataka imaju mnogo hostova koji pružaju njihovu toleranciju grešaka. Međutim, Grafana zahtijeva tačno jedan host za svaku bazu podataka s kojom radi. Dugo čitanje dokumentaciju Oblaci su me naveli na odluku. Ispostavilo se da je domaćin forme c-<cluster_id>.rw.mdb.yandexcloud.net Preslikava na trenutno aktivan glavni host klastera s odgovarajućim ID-om. To je ono što ćemo dati Grafani.

web server

Sada je na web serveru. Hajde da podignemo običnu virtuelnu mašinu sa Linuxom i postavimo Grafanu na njoj svojim rukama.

Postavljanje distribuiranih usluga u Yandex.Cloud koristeći Grafanu kao primjer

Postavljanje distribuiranih usluga u Yandex.Cloud koristeći Grafanu kao primjer

Povežimo se preko ssh-a i instaliramo 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 ćemo pokrenuti Grafanu pod systemctl i instalirati dodatak za rad sa ClickHouse (da, ne dolazi u osnovnom paketu).

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

Sve nakon toga jednostavnom komandom

sudo service grafana-server start

pokrenućemo web server. Sada će biti moguće ubaciti eksternu IP adresu virtuelne mašine u pretraživač, navesti port 3000 i videti prelepu UI grafanu.
Postavljanje distribuiranih usluga u Yandex.Cloud koristeći Grafanu kao primjer

Ali nemojte žuriti, prije postavljanja Grafane, ne smijete zaboraviti navesti putanju do MySQL-a kako bi on tamo pohranio postavke.

Cijela konfiguracija web servera Grafana je u datoteci /etc/grafana/grafana.ini. Potrebna linija izgleda ovako:

;url =

Izlažemo host MySQL klasteru. Ista datoteka sadrži login i lozinku za pristup Grafani na gornjoj slici, koje su po defaultu jednake admin.

Možete koristiti sed komande:

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 da ponovo pokrenete web server!

sudo service grafana-server restart

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

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

Postavljanje distribuiranih usluga u Yandex.Cloud koristeći Grafanu kao primjer

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

Sve! Imamo jednu funkcionalnu virtuelnu mašinu sa web serverom povezanim na CH i MySQL. Već možete prenijeti skup podataka u ClickHouse i napraviti nadzorne ploče. Međutim, još nismo postigli svoj cilj i nismo razvili potpunu infrastrukturu.

Packer

Yandex.Cloud vam omogućava da kreirate sliku diska postojeće virtuelne mašine i na osnovu nje možete kreirati onoliko identičnih mašina koliko želite. To je upravo ono što ćemo koristiti. Za prikladno sastavljanje slike uzmite alat Packer od HashiCorp. Kao ulaz uzima json fajl sa uputstvima za pravljenje slike.

Naš json fajl će se sastojati od dva bloka: graditelja i provajdera. Prvi blok opisuje parametre same slike kao entiteta, a drugi opisuje upute za njeno popunjavanje potrebnim sadržajem.

Builders

{
"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 sekcije u oblaku u kojoj želite da kreirate sliku, kao i putanju do datoteke sa ključevima sa naloga usluge koji ste prethodno kreirali u ovom odeljku. Više o kreiranju servisnih naloga i ključeva u obliku datoteke možete pročitati u odgovarajućem odjeljku. dokumentaciju.

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

Provisioners

Sada za zanimljiviji dio konfiguracije. Opisat će slijed radnji koje će se morati izvršiti na virtuelnoj mašini prije zamrzavanja njenog 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 akcije podijeljene u 3 faze. U prvoj fazi izvršava se jednostavna skripta koja kreira 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 virtualne mašine. Ova skripta će postaviti korisničke varijable koje treba postaviti u Grafaninu konfiguraciju i ponovo pokrenuti web 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

Nakon toga, postoje 3 stvari koje treba uraditi:
1) instalirajte pakete
2) pokrenite Grafanu pod systemctl i instalirajte ClickHouse dodatak
3) stavite setup.sh skriptu u red za pokretanje odmah nakon uključivanja virtuelne mašine.

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;

Sada ostaje pokrenuti Packer i dobiti izlaznu sliku smještenu u navedenu particiju. Kada kreirate virtuelnu mašinu, možete je odabrati kao disk za pokretanje i nakon pokretanja dobiti gotov Grafana web server.

Postavljanje distribuiranih usluga u Yandex.Cloud koristeći Grafanu kao primjer
Postavljanje distribuiranih usluga u Yandex.Cloud koristeći Grafanu kao primjer

Grupa instanci i balanser

Kada postoji slika diska koja vam omogućava da kreirate mnogo identičnih Grafana web servera, možemo kreirati grupu instanci. Na platformi Yandex.Cloud, ovaj termin se odnosi na uniju virtuelnih mašina koje imaju iste karakteristike. Prilikom kreiranja grupe instance, konfiguriše se prototip svih mašina u ovoj grupi, a zatim i karakteristike same grupe (na primer, minimalni i maksimalni broj aktivnih mašina). Ako trenutni broj ne ispunjava ovaj kriterij, tada će sama grupa instanci ukloniti nepotrebne strojeve ili stvoriti nove na slici i sličnosti.

Kao dio našeg zadatka, kreirat ćemo grupu instanci web servera koji će biti stvoreni iz prethodno kreirane slike diska.

Postavljanje distribuiranih usluga u Yandex.Cloud koristeći Grafanu kao primjer

Postavljanje distribuiranih usluga u Yandex.Cloud koristeći Grafanu kao primjer

Posljednja postavka grupe je zaista značajna. Ciljna grupa u integraciji sa Load Balancer će vam pomoći da postavite L3 balanser na vrhu virtuelnih mašina ove grupe pritiskom na nekoliko tastera.

Postavljanje distribuiranih usluga u Yandex.Cloud koristeći Grafanu kao primjer

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

  1. Napravio sam tako da balanser prihvata korisnički saobraćaj na portu 80, i preusmerio ga na port 3000 virtuelnih mašina, baš na mestu gde živi Grafana.
  2. Postavite provjere zdravlja mašine tako što ćete ih pingovati na portu 3000.

Postavljanje distribuiranih usluga u Yandex.Cloud koristeći Grafanu kao primjer

mini-total

Konačno, uspjeli smo ručno implementirati željenu infrastrukturu aplikacija i sada imamo vrlo otpornu uslugu Grafana. Potrebno je samo znati IP adresu balansera kao ulazne tačke u aplikaciju i domaćina ClickHouse klastera da bi se skup podataka učitao u njega.

Činilo bi se pobjedom? Da, pobeda. Ali nešto me ipak muči. Cijeli gore navedeni proces zahtijeva puno ručnih radnji i uopće se ne skalira, želim ga automatizirati ako je moguće. Ovo će biti fokus sljedećeg odjeljka.

Integracija sa Terraformom

Opet ćemo koristiti alat iz HashiCorp-a pod nazivom Terraform. Pomoći će u implementaciji cjelokupne infrastrukture aplikacije pritiskom na dugme, na osnovu nekoliko varijabli koje je korisnik proslijedio. Hajde da napišemo recept koji se može pokrenuti više puta u različitim odjeljcima različitih korisnika.

Sav rad sa Terraformom svodi se na pisanje konfiguracionog fajla (*.tf) i stvaranje infrastrukture na njoj.

Varijable

Na samom početku fajla ćemo izvući varijable koje određuju gdje i kako će buduća infrastruktura biti raspoređena.

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 implementacije aplikacije će se svesti na pravljenje slike diska i postavljanje ovih varijabli. Dozvolite mi da objasnim za šta su odgovorni:

oauth_token — token za pristup oblaku. Može se dobiti od strane link.
cloud_id - identifikator oblaka u kojem ćemo implementirati aplikaciju
folder_id — identifikator sekcije u kojoj ćemo implementirati aplikaciju
service_account_id — identifikator naloga usluge u odgovarajućem delu oblaka.
image_id - identifikator slike diska dobijenog pomoću Packer-a
korisničko ime и lozinka - korisničko ime i lozinka za pristup objema bazama podataka i web serveru Grafana
dbname - ime baze podataka unutar CH i MySQL klastera
public_key_path - put do datoteke sa vašim javnim ssh ključem, koji se može koristiti za povezivanje pod imenom ubuntu na virtuelne mašine sa web serverima

Postavka provajdera

Sada morate konfigurirati provajdera 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"
}

Možete vidjeti da ovdje koristimo varijable definirane gore.

Mreža i klasteri

Sada napravimo mrežu u kojoj će komunicirati elementi naše infrastrukture, tri podmreže (po jedna u svakoj regiji) i podići 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 je napravljen da bude prilično otporan na greške tako što je smješten u tri zone dostupnosti.

Web serveri

Čini se da možete nastaviti u istom duhu, ali sam naišao na poteškoće. Prije toga sam prvo podigao MySQL klaster i tek nakon toga, znajući njegov ID, prikupio sliku diska sa željenom konfiguracijom, gdje sam odredio host klastera. Ali sada ne znamo ID klastera prije lansiranja Terraforma, uključujući i vrijeme izrade slike. Tako da sam morao da pribegnem sledećem trik.

Koristeći servis metapodataka iz Amazona, proći ćemo neke parametre virtuelnoj mašini, koje će ona prihvatiti i obraditi. Potreban nam je stroj da ide do metapodataka za MySQL host klastera i za korisničko ime-lozinku koju je korisnik naveo u Terraform datoteci nakon pokretanja. Malo promijenite sadržaj datoteke setup.sh, koji se pokreće kada je virtuelna mašina uključena.

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

Intans grupa i balanser

Nakon što smo ponovo napravili novu sliku diska, konačno možemo dodati naš fajl za Terraform.

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

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

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

Vrijedi obratiti pažnju na to kako smo prošli do metapodataka cluster_uri, username и password. Njihova virtuelna mašina će je dobiti pri pokretanju i staviti u konfiguraciju Grafane.

Radi se o 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

Ostalo je vrlo malo. Nakon što se infrastruktura rasporedi, morat ćete otići na Grafana UI i ručno dodati CH klaster (čiji ID još trebate dobiti) kao izvor podataka. Ali Terraform zna ID klastera. Hajde da ga nateramo da završi posao.

Hajde da dodamo novog provajdera - Grafanu, i stavimo balanser IP kao host. Sve promene koje Terraform napravi na mašini gde njen balanser odredi će rasti u MySQL, a samim tim i na svim drugim mašinama.

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

Hajde da se češljamo

Prikaži IP balansera i ClickHouse host 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 da trči

Sve! Naš konfiguracijski fajl je spreman i možemo, postavljanjem varijabli, reći Terraformu da podigne sve što smo opisali gore. Cijeli proces mi je trajao oko 15 minuta.
Na kraju možete vidjeti prelijepu 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:

Postavljanje distribuiranih usluga u Yandex.Cloud koristeći Grafanu kao primjer

Hajde da sumiramo rezultate

Sada, koristeći primjer Grafane, svako od vas može implementirati aplikacije sa velikom arhitekturom oblaka na platformi Yandex.Cloud. Korisni alati iz HashiCorp-a kao što su Packer i Terraform mogu vam pomoći u tome. Nadam se da će nekome ovaj članak biti koristan 🙂

PS U nastavku ću priložiti link do spremišta, gdje možete pronaći gotove recepte za Packer i Terraform, čije sam fragmente citirao u ovom članku.

spremište

izvor: www.habr.com

Dodajte komentar