Izkliedēto pakalpojumu izvietošana pakalpojumā Yandex.Cloud, kā piemēru izmantojot Grafana

Sveiki visiem! Kursa darba ietvaros izpētīju tādas pašmāju mākoņu platformas iespējas kā Yandex.Cloud. Platforma piedāvā dažādus pakalpojumus praktisku problēmu risināšanai. Tomēr dažreiz jums ir jāiestata sava mākoņa lietojumprogramma ar diezgan plašu infrastruktūru, kuras pamatā ir šie pakalpojumi. Šajā rakstā es vēlos dalīties savā pieredzē par šādas lietojumprogrammas izvietošanu.

Izkliedēto pakalpojumu izvietošana pakalpojumā Yandex.Cloud, kā piemēru izmantojot Grafana

Ko vēlaties saņemt?

grafana — spēcīgs instruments analītisko problēmu risināšanai vai jebkuras sistēmas uzraudzības problēmu risināšanai. Pamatkonfigurācijā tā ir virtuāla mašīna ar Grafana tīmekļa serveri, kā arī datu bāze (ClickHouse, InfluxDB utt.) ar datu kopu, uz kuras balstīsies analītika.

Pēc virtuālās mašīnas palaišanas ar tīmekļa serveri varat doties uz tās resursdatoru un iegūt skaistu lietotāja interfeisu, norādīt datu bāzes kā avotus turpmākajam darbam, izveidot informācijas paneļus un grafikus.

Izkliedēto pakalpojumu izvietošana pakalpojumā Yandex.Cloud, kā piemēru izmantojot Grafana

Pamatversijai ir viens būtisks trūkums – tā nepavisam nav izturīga pret kļūmēm. Tas nozīmē, ka visa lietojumprogrammas funkcionalitāte ir atkarīga no vienas virtuālās mašīnas dzīvotspējas. Ja tas atsakās vai 10 cilvēki vienlaikus atver lietotāja interfeisu, radīsies problēmas.

Tos var atrisināt vienkārši: jums vienkārši nepieciešams... izvietot daudzas identiskas virtuālās mašīnas ar tīmekļa serveri un novietot tās zem L3 balansētāja. Bet šeit ne viss ir tik skaidrs. Grafana saglabā lietotāja iestatījumus (ceļus uz datu bāzēm, informācijas paneļiem, diagrammas utt.) tieši savas virtuālās mašīnas diskā. Tādējādi, ja mēs mainīsim dažus lietotāja interfeisa iestatījumus, šīs izmaiņas tiks atspoguļotas tikai tajā virtuālajā mašīnā, uz kuru balansētājs mūs nosūtīja. Tas novedīs pie nekonsekventiem iestatījumiem mūsu lietojumprogrammai, radot problēmas ar palaišanu un lietošanu.

Šeit palīgā nāks cita datu bāze, piemēram, MySQL vai tās ekvivalents. Mēs sakām Grafanai, ka viņai ir jāsaglabā lietotāja iestatījumi šajā “rezerves” datu bāzē. Pēc tam pietiks vienreiz katrā datorā norādīt ceļu uz šo datu bāzi un rediģēt visus pārējos lietotāja iestatījumus jebkurā no virtuālajām mašīnām; tie attieksies arī uz pārējām.

Šeit ir galīgās lietojumprogrammas infrastruktūras diagramma:

Izkliedēto pakalpojumu izvietošana pakalpojumā Yandex.Cloud, kā piemēru izmantojot Grafana

Mācīsimies celt ar rokām

MySQL un ClickHouse

Pirms šādas lietojumprogrammas izvietošanas ar pogas klikšķi bija jāiemācās rīkoties ar katru tās komponentu un integrēt tos savā starpā.

Šeit mums palīdzēs Yandex.Cloud, kas nodrošina L3 balansētājus, ClickHouse un MySQL kā pārvaldītus pakalpojumus. Lietotājam tikai jānorāda parametri un jāgaida, līdz platforma visu sakārtos darba kārtībā.

Reģistrējos, izveidoju mākoni un maksājumu kontu. Pēc tam es devos uz mākoni un iestatīju MySQL un ClickHouse klasterus ar minimāliem iestatījumiem. Es gaidīju, kamēr viņi aktivizējas.

Izkliedēto pakalpojumu izvietošana pakalpojumā Yandex.Cloud, kā piemēru izmantojot GrafanaIzkliedēto pakalpojumu izvietošana pakalpojumā Yandex.Cloud, kā piemēru izmantojot Grafana

Jums arī jāatceras izveidot datubāzi katrā klasterī un konfigurēt piekļuvi tai, izmantojot pieteikumvārdu un paroli. Es šeit neiedziļināšos - saskarnē viss ir diezgan skaidrs.

Nepārprotamā detaļa bija tāda, ka šīm datu bāzēm ir daudz saimniekdatoru, kas nodrošina to kļūdu toleranci. Tomēr Grafana katrai datubāzei, ar kuru tā darbojas, ir nepieciešams tieši viens resursdators. Ilga lasīšana dokumentācija Mākoņi mani noveda pie lēmuma. Izrādās, ka sugas saimnieks c-<cluster_id>.rw.mdb.yandexcloud.net kartēts uz klastera pašreizējo aktīvo galveno saimniekdatoru ar atbilstošo ID. To mēs iedosim Grafānai.

Web serveris

Tagad tas ir atkarīgs no tīmekļa servera. Izveidosim parastu virtuālo mašīnu ar Linux un manuāli konfigurēsim tajā Grafana.

Izkliedēto pakalpojumu izvietošana pakalpojumā Yandex.Cloud, kā piemēru izmantojot Grafana

Izkliedēto pakalpojumu izvietošana pakalpojumā Yandex.Cloud, kā piemēru izmantojot Grafana

Savienojamies caur ssh un instalēsim nepieciešamās pakotnes.

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 

Pēc tam palaidīsim Grafana zem systemctl un instalēsim spraudni darbam ar ClickHouse (jā, tas nav iekļauts pamata pakotnē).

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

Tas arī viss, pēc tam ar vienkāršu komandu

sudo service grafana-server start

mēs sāksim tīmekļa serveri. Tagad pārlūkprogrammā varat ievadīt virtuālās mašīnas ārējo IP adresi, norādīt portu 3000 un redzēt skaisto Grafana UI.
Izkliedēto pakalpojumu izvietošana pakalpojumā Yandex.Cloud, kā piemēru izmantojot Grafana

Bet nesteidzieties, pirms iestatāt Grafana, neaizmirstiet tai norādīt ceļu uz MySQL, lai tur saglabātu iestatījumus.

Visa Grafana tīmekļa servera konfigurācija ir failā /etc/grafana/grafana.ini. Nepieciešamā rinda izskatās šādi:

;url =

Mēs iestatījām saimniekdatoru MySQL klasterim. Tajā pašā failā ir pieteikumvārds un parole, lai piekļūtu Grafana iepriekš redzamajā attēlā, kas pēc noklusējuma ir vienādi admin.

Varat izmantot sed komandas:

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

Ir pienācis laiks restartēt tīmekļa serveri!

sudo service grafana-server restart

Tagad Grafana lietotāja saskarnē mēs norādīsim ClickHouse kā datu avotu.

Man izdevās sasniegt darba konfigurāciju ar šādiem iestatījumiem:

Izkliedēto pakalpojumu izvietošana pakalpojumā Yandex.Cloud, kā piemēru izmantojot Grafana

Es norādīju kā URL https://c-<cluster_id>.rw.mdb.yandexcloud.net:8443

Visi! Mums ir viena funkcionējoša virtuālā mašīna ar tīmekļa serveri, kas savienots ar CH un MySQL. Jūs jau varat augšupielādēt datu kopu pakalpojumā ClickHouse un izveidot informācijas paneļus. Taču mēs vēl neesam sasnieguši savu mērķi un neesam izvietojuši pilnvērtīgu infrastruktūru.

Saiņotājs

Yandex.Cloud ļauj izveidot esošas virtuālās mašīnas diska attēlu un, pamatojoties uz to, jebkuru mašīnu skaitu, kas ir identiskas viena otrai. Tas ir tieši tas, ko mēs izmantosim. Lai ērti saliktu attēlu, paņemiet rīku Saiņotājs no HashiCorp. Kā ievade tiek izmantots json fails ar instrukcijām attēla salikšanai.

Mūsu json fails sastāvēs no diviem blokiem: veidotāji un nodrošinātāji. Pirmais bloks apraksta paša attēla parametrus kā entītiju, bet otrajā blokā ir aprakstītas instrukcijas, kā to aizpildīt ar nepieciešamo saturu.

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

Šajā veidnē jāiestata mākonī esošās sadaļas identifikators, kurā vēlaties izveidot attēlu, kā arī ceļš uz failu ar atslēgām no iepriekš šajā sadaļā izveidotā pakalpojuma konta. Vairāk par pakalpojumu kontu un atslēgu izveidi faila veidā varat lasīt attiecīgajā sadaļā dokumentācija.

Šajā konfigurācijā teikts, ka diska attēls tiks veidots, pamatojoties uz platformu ubuntu-1804-lts, kas ievietots attēlu saimes atbilstošajā lietotāju sadaļā GRAFANA zem nosaukuma grafana-{{timestamp}}.

Nodrošinātāji

Tagad nāk interesantākā konfigurācijas daļa. Tajā tiks aprakstīta darbību secība, kas būs jāveic virtuālajā mašīnā pirms tās stāvokļa iesaldēšanas diska attēlā.

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

Šeit visas darbības ir sadalītas 3 posmos. Pirmajā posmā tiek izpildīts vienkāršs skripts, kas izveido palīgdirektoriju.

ready-ctg.sh:

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

Nākamajā posmā šajā direktorijā ievietojam skriptu, kas būs jāpalaiž uzreiz pēc virtuālās mašīnas palaišanas. Šis skripts ievietos lietotāja mainīgos, kas jāreģistrē Grafana konfigurācijā, un restartēs tīmekļa serveri.

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

Pēc tam atliek veikt 3 lietas:
1) instalējiet pakotnes
2) palaidiet Grafana zem systemctl un instalējiet spraudni ClickHouse
3) ievietojiet setup.sh skriptu palaišanas rindā uzreiz pēc virtuālās mašīnas ieslēgšanas.

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;

Tagad atliek tikai palaist Packer un iegūt izvades attēlu norādītajā sadaļā. Veidojot virtuālo mašīnu, to var izvēlēties kā sāknēšanas disku un pēc palaišanas saņemsi gatavu Grafana tīmekļa serveri.

Izkliedēto pakalpojumu izvietošana pakalpojumā Yandex.Cloud, kā piemēru izmantojot Grafana
Izkliedēto pakalpojumu izvietošana pakalpojumā Yandex.Cloud, kā piemēru izmantojot Grafana

Instanču grupa un balansētājs

Kad mums ir diska attēls, kas ļauj mums izveidot daudzus identiskus Grafana tīmekļa serverus, mēs varam izveidot gadījumu grupu. Platformā Yandex.Cloud šis termins attiecas uz virtuālo mašīnu savienību, kurām ir vienādas īpašības. Veidojot instanču grupu, tiek konfigurēts visu šīs grupas mašīnu prototips un pēc tam pašas grupas raksturlielumi (piemēram, minimālais un maksimālais aktīvo mašīnu skaits). Ja pašreizējais numurs neatbilst šiem kritērijiem, gadījumu grupa pati noņems nevajadzīgās mašīnas vai izveidos jaunas savā attēlā.

Mūsu uzdevuma ietvaros mēs izveidosim tīmekļa serveru gadījumu grupu, kas tiks ģenerēta no iepriekš izveidotā diska attēla.

Izkliedēto pakalpojumu izvietošana pakalpojumā Yandex.Cloud, kā piemēru izmantojot Grafana

Izkliedēto pakalpojumu izvietošana pakalpojumā Yandex.Cloud, kā piemēru izmantojot Grafana

Kas ir patiesi ievērojams, ir pēdējās instances grupas iestatīšana. Mērķa grupa integrācijā ar Load Balancer palīdzēs konfigurēt L3 balansētāju virs šīs grupas virtuālajām mašīnām, noklikšķinot uz pāris pogām.

Izkliedēto pakalpojumu izvietošana pakalpojumā Yandex.Cloud, kā piemēru izmantojot Grafana

Iestatot balansētāju, es ievēroju divus svarīgus punktus:

  1. Es liku balansētājam pieņemt lietotāju trafiku 80. portā un novirzīt to uz virtuālās mašīnas 3000. portu, tieši tur, kur dzīvo Grafana.
  2. Es iestatīju mašīnu dzīvotspējas pārbaudi, piesūtot tām uz 3000. portu.

Izkliedēto pakalpojumu izvietošana pakalpojumā Yandex.Cloud, kā piemēru izmantojot Grafana

Mini kopsavilkums

Visbeidzot, mēs varējām manuāli izvietot vēlamo lietojumprogrammu infrastruktūru, un tagad mums ir ļoti izturīgs Grafana pakalpojums. Lai ielādētu datu kopu tajā, jums jāzina tikai balansētāja IP adrese kā lietojumprogrammas ieejas punkts un ClickHouse klastera saimniekdators.

Šķiet, ka tā ir uzvara? Jā, uzvara. Bet kaut kas mani joprojām mulsina. Visam iepriekšminētajam procesam ir nepieciešamas daudzas manuālas darbības, un tas vispār nav mērogojams; Ja iespējams, es vēlētos to automatizēt. Tam būs veltīta nākamā sadaļa.

Terraformu integrācija

Mēs atkal izmantosim HashiCorp rīku, ko sauc Terraform. Tas palīdzēs izvietot visu lietojumprogrammu infrastruktūru, noklikšķinot uz pogas, pamatojoties uz vairākiem lietotāja nodotiem mainīgajiem. Uzrakstīsim recepti, kuru var palaist vairākas reizes dažādās dažādu lietotāju sadaļās.

Viss darbs ar Terraform ir saistīts ar konfigurācijas faila rakstīšanu (*.tf) un uz to balstītas infrastruktūras izveide.

Mainīgie

Faila pašā sākumā mēs iekļausim mainīgos, kas nosaka, kur un kā tiks izvietota nākotnes infrastruktūra.

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

Viss lietojumprogrammas izvietošanas process būs saistīts ar diska attēla izveidi un šo mainīgo iestatīšanu. Ļaujiet man paskaidrot, par ko viņi ir atbildīgi:

oauth_token — marķieris, lai piekļūtu mākonim. Var iegūt pēc saite.
cloud_id — mākoņa identifikators, kurā mēs izvietosim lietojumprogrammu
mapes_id — sadaļas identifikators, kurā mēs izvietosim lietojumprogrammu
pakalpojuma_konta_id — pakalpojuma konta identifikators attiecīgajā mākoņa sadaļā.
attēla_id — diska attēla identifikators, kas iegūts, izmantojot Packer
lietotājvārds и parole — lietotājvārds un parole, lai piekļūtu gan datu bāzēm, gan Grafana tīmekļa serverim
dbname — datu bāzes nosaukums CH un MySQL klasteros
publiskā_atslēgas_ceļš — ceļš uz failu ar savu publisko ssh atslēgu, kuru varat izmantot, lai izveidotu savienojumu ar nosaukumu ubuntu uz virtuālajām mašīnām ar tīmekļa serveriem

Pakalpojumu sniedzēja iestatīšana

Tagad jums ir jākonfigurē Terraform nodrošinātājs - mūsu gadījumā Yandex:

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

Jūs ievērosiet, ka šeit mēs izmantojam iepriekš definētos mainīgos.

Tīkls un klasteri

Tagad mēs izveidosim tīklu, kurā sazināsies mūsu infrastruktūras elementi, trīs apakštīklus (vienu katrā reģionā) un celsim CH un MySQL klasteri.


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

Kā redzat, katrs no diviem klasteriem ir izveidots diezgan izturīgs pret defektiem, ievietojot tos trīs pieejamības zonās.

Web serveri

Šķiet, ka mēs varētu turpināt tādā pašā garā, bet es saskāros ar grūtībām. Pirms tam es vispirms izaudzināju MySQL klasteru un tikai pēc tam, zinot tā ID, savācu diska attēlu ar nepieciešamo konfigurāciju, kurā norādīju klasterim resursdatoru. Bet tagad mēs nezinām klastera ID pirms Terraform palaišanas, tostarp attēla veidošanas laikā. Tāpēc man nācās ķerties pie sekojošā triks.

Izmantojot Amazon metadatu pakalpojumu, mēs nosūtīsim dažus parametrus virtuālajai mašīnai, ko tā pieņems un apstrādās. Pēc palaišanas mašīnai ir jāpāriet uz metadatiem aiz MySQL klastera saimniekdatora un lietotājvārda-paroles, ko lietotājs norādījis Terraform failā. Nedaudz mainīsim faila saturu setup.sh, kas darbojas, kad ir ieslēgta virtuālā mašīna.

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 grupa un balansētājs

Pēc jauna diska attēla atjaunošanas mēs beidzot varam pievienot savu failu Terraform.

Norādīsim, ka vēlamies izmantot esošu diska attēlu:

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

Tagad izveidosim gadījumu grupu:

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

Ir vērts pievērst uzmanību tam, kā mēs to nodevām metadatos cluster_uri, username и password. Tieši tos virtuālā mašīna izņems startēšanas laikā un ievietos Grafana konfigurācijā.

Tas ir balansētāja ziņā.

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

Mazliet cukura

Palicis tikai nedaudz. Pēc infrastruktūras izvietošanas jums būs jādodas uz Grafana UI un manuāli jāpievieno CH klasteris (kura ID vēl ir jāiegūst) kā datu avots. Bet Terraform zina klastera ID. Uzticēsim viņam lietas novešanu līdz galam.

Pievienosim jaunu pakalpojumu sniedzēju — Grafana un piešķirsim viņai balansētāja IP adresi kā saimniekdatoram. Visas izmaiņas, ko Terraform veic mašīnā, kur tās balansētājs nosaka, pieaugs MySQL un līdz ar to arī visās citās iekārtās.

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

Izķemmēsim matus

Parādīsim balansētāja IP adresi un ClickHouse klastera saimniekdatoru

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

Tu vari skriet

Visi! Mūsu konfigurācijas fails ir gatavs, un, iestatot mainīgos, mēs varam likt Terraform paaugstināt visu iepriekš aprakstīto. Viss process man aizņēma apmēram 15 minūtes.
Beigās jūs varat redzēt skaistu ziņojumu:

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

Un mākonī būs redzami paaugstinātās infrastruktūras elementi:

Izkliedēto pakalpojumu izvietošana pakalpojumā Yandex.Cloud, kā piemēru izmantojot Grafana

Rezumēt

Tagad, izmantojot Grafana kā piemēru, katrs no jums var Yandex.Cloud platformā izvietot lietojumprogrammas ar plašu mākoņa arhitektūru. Noderīgi HashiCorp rīki, piemēram, Packer un Terraform, var jums palīdzēt. Ceru, ka kādam šis raksts noderēs :)

PS Zemāk pievienošu saiti uz repozitoriju, kurā var atrast gatavas receptes Packer un Terraform, kuru fragmentus es sniedzu šajā rakstā.

krātuve

Avots: www.habr.com

Pievieno komentāru