Sveiki visiem! Kursa darba ietvaros izpÄtÄ«ju tÄdas paÅ”mÄju mÄkoÅu platformas iespÄjas kÄ
Ko vÄlaties saÅemt?
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.
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:
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.
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 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.
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.
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:
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
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ļÄ
Å 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.
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.
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.
Iestatot balansÄtÄju, es ievÄroju divus svarÄ«gus punktus:
- 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.
- Es iestatÄ«ju maŔīnu dzÄ«votspÄjas pÄrbaudi, piesÅ«tot tÄm uz 3000. portu.
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
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
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Å”Ä
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:
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Ä.
Avots: www.habr.com