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