Hajautettujen palvelujen käyttöönotto Yandex.Cloudissa käyttämällä esimerkkiä Grafanasta

Hei kaikki! Osana kurssityötäni tutkin sellaisen kotimaisen pilvialustan mahdollisuuksia kuin Yandex.Cloud. Alusta tarjoaa erilaisia ​​palveluita käytännön ongelmien ratkaisemiseen. Joskus joudut kuitenkin perustamaan oman pilvisovelluksen, jossa on melko laaja infrastruktuuri näihin palveluihin perustuen. Tässä artikkelissa haluan jakaa kokemukseni tällaisen sovelluksen käyttöönotosta.

Hajautettujen palvelujen käyttöönotto Yandex.Cloudissa käyttämällä esimerkkiä Grafanasta

Mitä haluat vastaanottaa?

grafana — tehokas työkalu analyyttisten ongelmien ratkaisemiseen tai minkä tahansa järjestelmän ongelmien seurantaan. Peruskokoonpanossaan tämä on virtuaalikone, jossa on Grafana-verkkopalvelin, sekä tietokanta (ClickHouse, InfluxDB jne.), jossa on tietojoukko, johon analytiikka perustuu.

Kun olet käynnistänyt verkkopalvelimella varustetun virtuaalikoneen, voit siirtyä sen isäntään ja hankkia kauniin käyttöliittymän, määrittää tietokannat lähteiksi jatkotyötä varten, luoda kojelaudat ja kaaviot.

Hajautettujen palvelujen käyttöönotto Yandex.Cloudissa käyttämällä esimerkkiä Grafanasta

Perusversiolla on yksi merkittävä haittapuoli - se ei ole ollenkaan vikasietoinen. Toisin sanoen sovelluksen koko toiminnallisuus riippuu yhden virtuaalikoneen toimivuudesta. Jos se kieltäytyy tai 10 ihmistä avaa käyttöliittymän samanaikaisesti, syntyy ongelmia.

Ne voidaan ratkaista yksinkertaisesti: sinun tarvitsee vain... ottaa käyttöön useita identtisiä virtuaalikoneita verkkopalvelimen kanssa ja sijoittaa ne L3-tasapainottimen alle. Mutta kaikki ei ole täällä niin selvää. Grafana tallentaa käyttäjäasetukset (polut tietokantoihin, kojelaudat, kaaviot jne.) suoraan virtuaalikoneensa levylle. Näin ollen, jos muutamme joitain käyttöliittymän asetuksia, nämä muutokset näkyvät vain siinä virtuaalikoneessa, johon balansoija lähetti meidät. Tämä johtaa epäjohdonmukaisiin asetuksiin sovelluksessamme, mikä aiheuttaa ongelmia käynnistyksessä ja käytössä.

Täällä tulee apuun toinen tietokanta, esimerkiksi MySQL tai vastaava. Kerromme Grafanalle, että hänen pitäisi tallentaa käyttäjäasetukset tähän "varatietokantaan". Myöhemmin riittää, että määrität polku tähän tietokantaan kerran jokaisessa koneessa ja muokkaat kaikkia muita käyttäjän asetuksia missä tahansa virtuaalikoneessa; ne ulottuvat muihinkin.

Tässä on kaavio lopullisesta sovellusinfrastruktuurista:

Hajautettujen palvelujen käyttöönotto Yandex.Cloudissa käyttämällä esimerkkiä Grafanasta

Opitaan nostelemaan käsin

MySQL ja ClickHouse

Ennen sellaisen sovelluksen käyttöönottoa napin painalluksella, oli tarpeen oppia käsittelemään sen kutakin komponenttia ja integroimaan ne keskenään.

Tässä auttaa meitä Yandex.Cloud, joka tarjoaa L3-tasapainottajia, ClickHouse- ja MySQL-hallintapalveluita. Käyttäjän tarvitsee vain määrittää parametrit ja odottaa, kunnes alusta saa kaiken toimintakuntoon.

Rekisteröidyin, loin pilven ja maksutilin. Sen jälkeen menin pilveen ja määritin MySQL- ja ClickHouse-klusterit minimaalisilla asetuksilla. Odotin, että ne aktivoituivat.

Hajautettujen palvelujen käyttöönotto Yandex.Cloudissa käyttämällä esimerkkiä GrafanastaHajautettujen palvelujen käyttöönotto Yandex.Cloudissa käyttämällä esimerkkiä Grafanasta

Sinun on myös muistettava luoda tietokanta jokaiseen klusteriin ja määrittää pääsy siihen kirjautumistunnuksella ja salasanalla. En mene yksityiskohtiin tässä - käyttöliittymässä kaikki on aivan ilmeistä.

Ei-ilmeinen yksityiskohta oli, että näillä tietokannoilla on monia isäntiä, jotka varmistavat niiden vikasietoisuuden. Grafana vaatii kuitenkin täsmälleen yhden isännän jokaista tietokantaa kohden, jonka kanssa se toimii. Pitkä lukeminen dokumentointi Pilvet toivat minut päätökseen. Osoittautuu, että lajin isäntä c-<cluster_id>.rw.mdb.yandexcloud.net kartoitetaan klusterin nykyiseen aktiiviseen pääisäntään vastaavalla tunnuksella. Tämän me annamme Grafanalle.

verkkopalvelin

Nyt se on verkkopalvelimen tehtävä. Nostetaan tavallinen virtuaalikone Linuxilla ja määritetään siihen manuaalisesti Grafana.

Hajautettujen palvelujen käyttöönotto Yandex.Cloudissa käyttämällä esimerkkiä Grafanasta

Hajautettujen palvelujen käyttöönotto Yandex.Cloudissa käyttämällä esimerkkiä Grafanasta

Otetaan yhteys ssh:n kautta ja asennetaan tarvittavat paketit.

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 

Sen jälkeen ajetaan Grafana systemctl:llä ja asennetaan ClickHousen kanssa työskentelyyn tarkoitettu laajennus (kyllä, se ei sisälly peruspakettiin).

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

Siinä se, sen jälkeen yksinkertaisella komennolla

sudo service grafana-server start

käynnistämme verkkopalvelimen. Nyt voit kirjoittaa virtuaalikoneen ulkoisen IP-osoitteen selaimeen, määrittää portin 3000 ja nähdä kauniin Grafana-käyttöliittymän.
Hajautettujen palvelujen käyttöönotto Yandex.Cloudissa käyttämällä esimerkkiä Grafanasta

Mutta älä kiirehdi, ennen kuin asennat Grafanan, muista kertoa sille polku MySQL:ään, jotta asetukset voidaan tallentaa sinne.

Grafana-verkkopalvelimen koko kokoonpano on tiedostossa /etc/grafana/grafana.ini. Vaadittu rivi näyttää tältä:

;url =

Asetamme isännän MySQL-klusteriin. Sama tiedosto sisältää yllä olevan kuvan Grafanaan pääsyn kirjautumistunnuksen ja salasanan, jotka ovat oletusarvoisesti samat admin.

Voit käyttää sed-komentoja:

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

On aika käynnistää verkkopalvelin uudelleen!

sudo service grafana-server restart

Nyt Grafana-käyttöliittymässä määritämme ClickHouse-tietolähteeksi.

Sain toimivan kokoonpanon seuraavilla asetuksilla:

Hajautettujen palvelujen käyttöönotto Yandex.Cloudissa käyttämällä esimerkkiä Grafanasta

Määritin URL-osoitteeksi https://c-<cluster_id>.rw.mdb.yandexcloud.net:8443

Kaikki! Meillä on yksi toimiva virtuaalikone, jossa on verkkopalvelin yhdistettynä CH:hen ja MySQL:ään. Voit jo ladata tietojoukon ClickHouseen ja rakentaa hallintapaneeleja. Emme kuitenkaan ole vielä saavuttaneet tavoitettamme, emmekä ole ottaneet käyttöön täysimittaista infrastruktuuria.

Pakkaaja

Yandex.Cloud antaa sinun luoda levykuvan olemassa olevasta virtuaalikoneesta ja sen perusteella - minkä tahansa määrän keskenään identtisiä koneita. Juuri tätä tulemme käyttämään. Voit koota kuvan kätevästi ottamalla työkalun Pakkaaja HashiCorpilta. Se ottaa syötteenä json-tiedoston, jossa on ohjeet kuvan kokoamiseen.

Json-tiedostomme koostuu kahdesta lohkosta: rakentajista ja palveluntarjoajista. Ensimmäinen lohko kuvaa itse kuvan parametreja kokonaisuutena ja toisessa lohkossa ohjeita sen täyttämiseksi tarvittavalla sisällöllä.

Rakennusliitto

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

Tässä mallissa sinun on asetettava sen pilven osion tunniste, johon haluat luoda kuvan, sekä polku tiedostoon tässä osiossa aiemmin luodun palvelutilin avaimilla. Voit lukea lisää palvelutilien ja avainten luomisesta tiedoston muodossa vastaavasta osiosta dokumentointi.

Tämä kokoonpano sanoo, että levykuva rakennetaan alustan perusteella ubuntu-1804-lts, sijoitetaan kuvaperheen oikeaan käyttäjäosioon GRAFANA nimellä grafana-{{timestamp}}.

Palveluntarjoajat

Nyt tulee kokoonpanon mielenkiintoisempi osa. Se kuvaa toimintosarjan, joka on suoritettava virtuaalikoneessa ennen kuin sen tila jäädytetään levykuvaksi.

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

Tässä kaikki toiminnot on jaettu 3 vaiheeseen. Ensimmäisessä vaiheessa suoritetaan yksinkertainen komentosarja, joka luo apuhakemiston.

ready-ctg.sh:

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

Seuraavassa vaiheessa asetamme tähän hakemistoon komentosarjan, joka on käynnistettävä välittömästi virtuaalikoneen käynnistämisen jälkeen. Tämä komentosarja asettaa käyttäjämuuttujat, jotka on rekisteröitävä Grafana-kokoonpanoon ja käynnistää verkkopalvelimen uudelleen.

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

Tämän jälkeen on jäljellä 3 asiaa:
1) asenna paketit
2) Suorita Grafana systemctl:n alla ja asenna ClickHouse-laajennus
3) laita setup.sh-skripti käynnistysjonoon heti virtuaalikoneen käynnistämisen jälkeen.

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;

Nyt jäljellä on vain ajaa Packer ja saada tulostekuva määritettyyn osioon. Kun luot virtuaalikoneen, voit valita sen käynnistyslevykkeeksi ja käynnistämisen jälkeen saat valmiin Grafana-verkkopalvelimen.

Hajautettujen palvelujen käyttöönotto Yandex.Cloudissa käyttämällä esimerkkiä Grafanasta
Hajautettujen palvelujen käyttöönotto Yandex.Cloudissa käyttämällä esimerkkiä Grafanasta

Instanssiryhmä ja tasapainottaja

Kun meillä on levykuva, jonka avulla voimme luoda useita identtisiä Grafana-verkkopalvelimia, voimme luoda ilmentymäryhmän. Yandex.Cloud-alustalla tämä termi viittaa virtuaalikoneiden liittoon, joilla on samat ominaisuudet. Instanssiryhmää luotaessa konfiguroidaan kaikkien tähän ryhmään kuuluvien koneiden prototyyppi ja sitten itse ryhmän ominaisuudet (esimerkiksi aktiivisten koneiden vähimmäis- ja enimmäismäärä). Jos nykyinen numero ei täytä näitä ehtoja, ilmentymäryhmä itse poistaa tarpeettomat koneet tai luo uusia omaan kuvaansa.

Osana tehtäväämme luomme web-palvelimien esiintymäryhmän, joka luodaan aiemmin luodusta levyvedosta.

Hajautettujen palvelujen käyttöönotto Yandex.Cloudissa käyttämällä esimerkkiä Grafanasta

Hajautettujen palvelujen käyttöönotto Yandex.Cloudissa käyttämällä esimerkkiä Grafanasta

Mikä on todella merkittävää, on viimeisen instanssin ryhmän määritys. Load Balancerin kanssa integroitu kohderyhmä auttaa sinua konfiguroimaan L3-tasapainottimen tämän ryhmän virtuaalikoneiden päälle napsauttamalla muutamaa painiketta.

Hajautettujen palvelujen käyttöönotto Yandex.Cloudissa käyttämällä esimerkkiä Grafanasta

Tasapainotinta asettaessani toteutin kaksi tärkeää asiaa:

  1. Tein tasapainottimen hyväksymään käyttäjäliikenteen portissa 80 ja ohjaamaan sen virtuaalikoneiden porttiin 3000, tarkalleen missä Grafana asuu.
  2. Asetin tarkistamaan koneiden toimivuuden pingillä ne porttiin 3000.

Hajautettujen palvelujen käyttöönotto Yandex.Cloudissa käyttämällä esimerkkiä Grafanasta

Mini yhteenveto

Lopulta pystyimme ottamaan halutun sovellusinfrastruktuurin käyttöön manuaalisesti, ja nyt meillä on erittäin joustava Grafana-palvelu. Sinun tarvitsee vain tietää tasapainottimen IP-osoite sovelluksen sisääntulopisteenä ja ClickHouse-klusterin isäntä, jotta voit ladata tietojoukon siihen.

Näyttäisikö se voitolta? Kyllä, voitto. Mutta jokin hämmentää minua silti. Koko yllä oleva prosessi vaatii paljon manuaalisia vaiheita, eikä se ole ollenkaan skaalautuva; haluaisin automatisoida sen, jos mahdollista. Tälle seuraava jakso on omistettu.

Terraformin integrointi

Käytämme jälleen HashiCorpin työkalua nimeltä terraform. Se auttaa sinua ottamaan koko sovellusinfrastruktuurin käyttöön napin painalluksella useiden käyttäjän välittämien muuttujien perusteella. Kirjoitetaan resepti, joka voidaan suorittaa useita kertoja eri käyttäjien eri osioissa.

Kaikki työ Terraformin kanssa rajoittuu asetustiedoston kirjoittamiseen (*.tf) ja siihen perustuvan infrastruktuurin luomiseen.

muuttujat

Aivan tiedoston alussa sisällytämme muuttujat, jotka määrittävät, missä ja miten tulevaa infrastruktuuria otetaan käyttöön.

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

Koko sovelluksen käyttöönottoprosessi tiivistyy levykuvan luomiseen ja näiden muuttujien asettamiseen. Selitän, mistä he ovat vastuussa:

oauth_token - tunnus pilveen pääsyä varten. Voidaan hankkia linkki.
cloud_id — pilvitunniste, jossa otamme sovelluksen käyttöön
kansiotunnus — osion tunniste, jossa otamme sovelluksen käyttöön
service_account_id — palvelutilin tunniste pilven vastaavassa osiossa.
kuvan_tunnus — Packerin avulla saadun levykuvan tunniste
käyttäjätunnus и salasana — käyttäjätunnus ja salasana sekä tietokantoihin että Grafana-verkkopalvelimeen pääsyä varten
dbname — tietokannan nimi CH- ja MySQL-klustereissa
julkinen_avain_polku - polku tiedostoon julkisella ssh-avaimella, jota voit käyttää yhteyden muodostamiseen nimellä ubuntu virtuaalikoneisiin web-palvelimilla

Palveluntarjoajan asetukset

Nyt sinun on määritettävä Terraform-palveluntarjoaja - meidän tapauksessamme Yandex:

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

Huomaat, että tässä käytetään edellä määriteltyjä muuttujia.

Verkko ja klusterit

Nyt luomme verkon, jossa infrastruktuurimme elementit kommunikoivat, kolme aliverkkoa (yksi jokaisella alueella) ja nostamme CH- ja MySQL-klustereita.


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

Kuten näet, kumpikin kahdesta klusterista on luotu melko vikasietoiseksi sijoittamalla ne kolmelle käytettävyysalueelle.

Web-palvelimet

Vaikuttaa siltä, ​​että voisimme jatkaa samassa hengessä, mutta törmäsin vaikeuksiin. Ennen tätä nostin ensin MySQL-klusterin ja vasta sen jälkeen, tietäen sen tunnuksen, keräsin levykuvan vaaditulla konfiguraatiolla, jossa määritin klusterin isännän. Mutta nyt emme tiedä klusterin tunnusta ennen Terraformin käynnistämistä, mukaan lukien kuvan rakentamisen aikana. Siksi jouduin turvautumaan seuraavaan temppu.

Amazonin metatietopalvelun avulla välitämme joitain parametreja virtuaalikoneen, jotka se hyväksyy ja käsittelee. Tarvitsemme koneen siirtyvän MySQL-klusterin isäntäkoneen ja käyttäjätunnus-salasanan takana oleviin metatietoihin, jotka käyttäjä määritti Terraform-tiedostossa käynnistyksen jälkeen. Muutetaan hieman tiedoston sisältöä setup.sh, joka toimii, kun virtuaalikone käynnistetään.

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-ryhmä ja tasapainottaja

Kun uusi levykuva on rakennettu uudelleen, voimme vihdoin lisätä tiedostomme Terraformille.

Osoitetaan, että haluamme käyttää olemassa olevaa levykuvaa:

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

Luodaan nyt ilmentymäryhmä:

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

On syytä kiinnittää huomiota siihen, kuinka siirsimme sen metatietoihin cluster_uri, username и password. Juuri nämä virtuaalikone poistaa käynnistyksen yhteydessä ja asettaa Grafana-asetukset.

Se on tasapainottajasta kiinni.

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

Vähän sokeria

On vain vähän jäljellä. Kun infrastruktuuri on otettu käyttöön, sinun on siirryttävä Grafana-käyttöliittymään ja lisättävä manuaalisesti CH-klusteri (jonka tunnus on vielä hankittava) tietolähteeksi. Mutta Terraform tietää klusterin tunnuksen. Annetaan hänen hoitaa asia.

Lisätään uusi palveluntarjoaja - Grafana, ja annetaan hänelle tasapainottimen IP-osoite isäntänä. Kaikki muutokset, jotka Terraform tekee koneeseen, jonka tasapainottaja määrittää, kasvavat MySQL:ssä ja siten kaikissa muissa koneissa.

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

Kammataan hiuksiamme

Näytetään tasapainottimen IP-osoite ja ClickHouse-klusterin isäntä

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

Osaa juosta

Kaikki! Asetustiedostomme on valmis ja voimme asettamalla muuttujat käskeä Terraformia nostamaan kaiken edellä kuvatun. Koko prosessi kesti noin 15 minuuttia.
Lopussa näet kauniin viestin:

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

Ja pilvessä korotetun infrastruktuurin elementit näkyvät:

Hajautettujen palvelujen käyttöönotto Yandex.Cloudissa käyttämällä esimerkkiä Grafanasta

Yhteenvetona

Nyt käyttämällä Grafanaa esimerkkinä, jokainen teistä voi ottaa käyttöön sovelluksia, joissa on laaja pilviarkkitehtuuri Yandex.Cloud-alustalla. HashiCorpin hyödylliset työkalut, kuten Packer ja Terraform, voivat auttaa sinua tässä. Toivottavasti tästä artikkelista on jollekin hyötyä :)

PS Alla liitän linkin arkistoon, josta löydät valmiita reseptejä Packerille ja Terraformille, joista esitin tässä artikkelissa katkelmia.

arkisto

Lähde: will.com

Lisää kommentti