Skjerament ta 'servizzi distribwiti f'Yandex.Cloud bl-użu ta' Grafana bħala eżempju

Hi kollha! Bħala parti mix-xogħol tal-kors tiegħi, irriċerkajt il-kapaċitajiet ta 'pjattaforma domestika tal-cloud bħal din Yandex.Cloud. Il-pjattaforma toffri diversi servizzi biex issolvi problemi prattiċi. Madankollu, xi kultant ikollok bżonn twaqqaf l-applikazzjoni tiegħek cloud b'infrastruttura pjuttost estensiva bbażata fuq dawn is-servizzi. F'dan l-artikolu nixtieq naqsam l-esperjenza tiegħi fl-iskjerament ta 'applikazzjoni bħal din.

Skjerament ta 'servizzi distribwiti f'Yandex.Cloud bl-użu ta' Grafana bħala eżempju

Xi trid tirċievi?

grafana — għodda b'saħħitha biex issolvi problemi analitiċi jew problemi ta' monitoraġġ ta' kwalunkwe sistema. Fil-konfigurazzjoni bażika tagħha, din hija magna virtwali b'server tal-web Grafana, kif ukoll database (ClickHouse, InfluxDB, eċċ.) B'sett tad-dejta li fuqu se tkun ibbażata l-analiżi.

Wara li tniedi magna virtwali b'server tal-web, tista 'tmur għand l-ospitant tagħha u tikseb UI sabiħa, tispeċifika databases bħala sorsi għal aktar xogħol, toħloq dashboards u graphs.

Skjerament ta 'servizzi distribwiti f'Yandex.Cloud bl-użu ta' Grafana bħala eżempju

Il-verżjoni bażika għandha żvantaġġ wieħed sinifikanti - mhija tolleranti għall-ħsarat xejn. Jiġifieri, il-funzjonalità kollha tal-applikazzjoni tiddependi fuq il-vijabbiltà ta 'magna virtwali waħda. Jekk tirrifjuta jew 10 persuni jiftħu l-UI fl-istess ħin, allura jinqalgħu problemi.

Jistgħu jiġu solvuti sempliċiment: għandek bżonn biss... tuża ħafna magni virtwali identiċi b'server tal-web u poġġihom taħt balancer L3. Imma mhux kollox huwa daqshekk ċar hawn. Grafana jaħżen is-settings tal-utent (mogħdijiet għal databases, dashboards, graphs, eċċ.) direttament fuq id-diska tal-magna virtwali tagħha. Għalhekk, jekk nibdlu xi settings fl-UI, dawn il-bidliet ikunu riflessi biss fuq il-magna virtwali fejn il-balancer bagħatna. Dan iwassal għal settings inkonsistenti għall-applikazzjoni tagħna, li jikkawżaw problemi bit-tnedija u l-użu.

Hawnhekk se tiġi salvata database oħra, pereżempju, MySQL jew l-ekwivalenti tiegħu. Ngħidu lil Grafana li għandha taħżen is-settings tal-utent f'din id-database "spare". Wara, ikun biżżejjed li tispeċifika l-mogħdija għal din id-database darba fuq kull magna, u teditja s-settings l-oħra kollha tal-utent fuq kwalunkwe waħda mill-magni virtwali; dawn se jestendu għall-oħrajn.

Hawnhekk hawn dijagramma tal-infrastruttura tal-applikazzjoni finali:

Skjerament ta 'servizzi distribwiti f'Yandex.Cloud bl-użu ta' Grafana bħala eżempju

Ejja nitgħallmu nerfgħu b’idejna

MySQL u ClickHouse

Qabel ma tiġi skjerata applikazzjoni bħal din bil-klikk ta 'buttuna, kien meħtieġ li titgħallem kif timmaniġġja kull wieħed mill-komponenti tagħha u tintegrahom ma' xulxin.

Hawnhekk Yandex.Cloud se jgħinna, li jipprovdi balancers L3, ClickHouse u MySQL bħala servizzi ġestiti. L-utent jeħtieġ biss li jispeċifika l-parametri u jistenna sakemm il-pjattaforma ġġib kollox fis-seħħ.

Irreġistrajt, ħloqt sħaba u kont tal-ħlas. Wara dan, mort fil-sħaba u waqqaft raggruppamenti MySQL u ClickHouse b'settings minimi. Stennejt sakemm saru attivi.

Skjerament ta 'servizzi distribwiti f'Yandex.Cloud bl-użu ta' Grafana bħala eżempjuSkjerament ta 'servizzi distribwiti f'Yandex.Cloud bl-użu ta' Grafana bħala eżempju

Trid tiftakar ukoll li toħloq database f'kull cluster u tikkonfigura l-aċċess għaliha billi tuża login u password. Mhux se nidħol fid-dettalji hawn - kollox huwa pjuttost ovvju fl-interface.

Id-dettall mhux ovvju kien li dawn id-databases għandhom ħafna hosts, li jiżguraw it-tolleranza tal-ħsarat tagħhom. Madankollu, Grafana teħtieġ eżattament host wieħed għal kull database li taħdem magħha. Qari twil dokumentazzjoni Is-sħab ġabni għal deċiżjoni. Jirriżulta li l-ospitanti tal-ispeċi c-<cluster_id>.rw.mdb.yandexcloud.net immappjat mal-host prinċipali attiv attwali tar-raggruppament bl-ID korrispondenti. Dan hu li se nagħtu lil Grafana.

Web server

Issa huwa f'idejn is-server tal-web. Ejja ngħollu magna virtwali regolari bil-Linux u kkonfiguraw manwalment Grafana fuqha.

Skjerament ta 'servizzi distribwiti f'Yandex.Cloud bl-użu ta' Grafana bħala eżempju

Skjerament ta 'servizzi distribwiti f'Yandex.Cloud bl-użu ta' Grafana bħala eżempju

Ejja nqabbdu permezz ta' ssh u ninstallaw il-pakketti meħtieġa.

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 

Wara dan, ejja nħaddmu Grafana taħt systemctl u installa l-plugin biex taħdem ma 'ClickHouse (iva, mhux fornut fil-pakkett bażiku).

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

Dak hu, wara li bi kmand sempliċi

sudo service grafana-server start

se nibdew is-server tal-web. Issa tista 'tidħol l-indirizz IP estern tal-magna virtwali fil-browser, speċifika l-port 3000 u ara l-UI Grafana sabiħa.
Skjerament ta 'servizzi distribwiti f'Yandex.Cloud bl-użu ta' Grafana bħala eżempju

Imma tgħaġġlax, qabel ma twaqqaf Grafana, trid tiftakar li tgħidlu t-triq lejn MySQL sabiex taħżen is-settings hemmhekk.

Il-konfigurazzjoni kollha tas-server tal-web Grafana tinsab fil-fajl /etc/grafana/grafana.ini. Il-linja meħtieġa tidher bħal din:

;url =

Aħna waqqafna l-host għall-cluster MySQL. L-istess fajl fih il-login u l-password għall-aċċess għal Grafana fl-istampa ta’ hawn fuq, li b’mod awtomatiku huma t-tnejn ugwali admin.

Tista' tuża kmandi sed:

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

Wasal iż-żmien li terġa 'tibda l-web server!

sudo service grafana-server restart

Issa fl-UI Grafana se nispeċifikaw ClickHouse bħala DataSource.

Stajt nikseb konfigurazzjoni tax-xogħol bis-settings li ġejjin:

Skjerament ta 'servizzi distribwiti f'Yandex.Cloud bl-użu ta' Grafana bħala eżempju

I speċifikat bħala l-URL https://c-<cluster_id>.rw.mdb.yandexcloud.net:8443

Kollha! Għandna magna virtwali waħda li taħdem b'server tal-web konness ma 'CH u MySQL. Diġà tista’ ttella’ s-sett tad-dejta fuq ClickHouse u tibni dashboards. Madankollu, għadna ma ksibniex l-għan tagħna u ma wżajnax infrastruttura sħiħa.

Min jippakkja

Yandex.Cloud jippermettilek li toħloq immaġni tad-diska ta 'magna virtwali eżistenti, u fuq il-bażi tagħha - kwalunkwe numru ta' magni identiċi għal xulxin. Dan huwa eżattament dak li se nużaw. Biex tgħaqqad b'mod konvenjenti l-immaġni, ħu l-għodda Min jippakkja minn HashiCorp. Huwa jieħu bħala input fajl json b'istruzzjonijiet għall-assemblaġġ tal-immaġni.

Il-fajl json tagħna se jikkonsisti f'żewġ blokki: bennejja u provvedituri. L-ewwel blokka tiddeskrivi l-parametri tal-immaġni nnifisha bħala entità, u t-tieni blokka tiddeskrivi l-istruzzjonijiet biex timlaha bil-kontenut meħtieġ.

bennejja

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

F'dan il-mudell, għandek bżonn tissettja l-identifikatur tas-sezzjoni fis-sħaba fejn trid toħloq l-immaġni, kif ukoll il-mogħdija għall-fajl biċ-ċwievet mill-kont tas-servizz maħluq qabel f'din it-taqsima. Tista' taqra aktar dwar il-ħolqien ta' kontijiet tas-servizz u ċwievet fil-forma ta' fajl fit-taqsima korrispondenti dokumentazzjoni.

Din il-konfigurazzjoni tgħid li l-immaġni tad-diska se tinbena bbażata fuq il-pjattaforma ubuntu-1804-lts, imqiegħda fit-taqsima tal-utent xierqa fil-familja tal-immaġni GRAFANA taħt l-isem grafana-{{timestamp}}.

Fornituri

Issa ġejja l-aktar parti interessanti tal-konfigurazzjoni. Se tiddeskrivi s-sekwenza ta 'azzjonijiet li se jeħtieġu li jsiru fuq il-magna virtwali qabel ma tiffriża l-istat tagħha f'immaġni tad-diska.

{
...,
"provisioners": [
    {
            "type": "shell",
            "pause_before": "5s",
            "scripts": [
                "prepare-ctg.sh"
            ]
        },
    {
            "type": "file",
            "source": "setup.sh",
            "destination": "/opt/grafana/setup.sh"
        },
        {
            "type": "shell",
        "execute_command": "sudo {{ .Vars }} bash '{{ .Path }}'",
            "pause_before": "5s",
            "scripts": [
                "install-packages.sh",
                "grafana-setup.sh",
                "run-setup-at-reboot.sh"
        ]
        }
  ]
}

Hawnhekk l-azzjonijiet kollha huma maqsuma fi 3 stadji. Fl-ewwel stadju, titwettaq b'kitba sempliċi li toħloq direttorju awżiljarju.

prepara-ctg.sh:

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

Fl-istadju li jmiss, inpoġġu skript f'dan id-direttorju, li jkun jeħtieġ li jiġi mniedi immedjatament wara li tibda l-magna virtwali. Dan l-iskritt se jpoġġi l-varjabbli tal-utent li jeħtieġ li jiġu rreġistrati fil-konfigurazzjoni Grafana u jerġa 'jibda s-server tal-web.

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

Wara dan fadal 3 affarijiet x'tagħmel:
1) tinstalla pakketti
2) mexxi Grafana taħt systemctl u installa l-plugin ClickHouse
3) poġġi l-iskrittura setup.sh fil-kju tat-tnedija immedjatament wara li tixgħel il-magna virtwali.

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;

Issa dak kollu li jibqa 'huwa li tħaddem Packer u tpoġġi l-immaġni tal-output fit-taqsima speċifikata. Meta toħloq magna virtwali, tista' tagħżelha bħala boot disk u wara t-tnedija tirċievi web server Grafana lest.

Skjerament ta 'servizzi distribwiti f'Yandex.Cloud bl-użu ta' Grafana bħala eżempju
Skjerament ta 'servizzi distribwiti f'Yandex.Cloud bl-użu ta' Grafana bħala eżempju

Grupp ta 'istanza u balancer

Ladarba jkollna immaġni tad-diska li tippermettilna noħolqu ħafna servers tal-web Grafana identiċi, nistgħu noħolqu grupp ta 'istanza. Fuq il-pjattaforma Yandex.Cloud, dan it-terminu jirreferi għall-unjoni ta 'magni virtwali li għandhom l-istess karatteristiċi. Meta jinħoloq grupp ta 'istanza, il-prototip tal-magni kollha f'dan il-grupp huwa kkonfigurat, u mbagħad il-karatteristiċi tal-grupp innifsu (per eżempju, in-numru minimu u massimu ta' magni attivi). Jekk in-numru attwali ma jissodisfax dawn il-kriterji, allura l-grupp tal-istanza innifsu jneħħi magni mhux meħtieġa jew joħloq oħrajn ġodda fl-immaġni tiegħu stess.

Bħala parti mill-kompitu tagħna, aħna se noħolqu grupp ta 'istanza ta' servers tal-web li se jiġu ġġenerati mill-immaġni tad-diska maħluqa qabel.

Skjerament ta 'servizzi distribwiti f'Yandex.Cloud bl-użu ta' Grafana bħala eżempju

Skjerament ta 'servizzi distribwiti f'Yandex.Cloud bl-użu ta' Grafana bħala eżempju

Dak li hu tassew notevoli huwa s-setup tal-grupp tal-aħħar istanza. Il-grupp fil-mira fl-integrazzjoni ma 'Load Balancer jgħinek tikkonfigura bilanċjar L3 fuq il-magni virtwali ta' dan il-grupp billi tikklikkja ftit buttuni.

Skjerament ta 'servizzi distribwiti f'Yandex.Cloud bl-użu ta' Grafana bħala eżempju

Meta waqqaft il-balancer, implimentajt żewġ punti importanti:

  1. Jien għamilt lill-balancer jaċċetta t-traffiku tal-utent fuq il-port 80 u jidderieġih lejn il-port 3000 tal-magni virtwali, eżattament fejn jgħix Grafana.
  2. Jien waqqaft il-verifika tal-vijabbiltà tal-magni billi pingaġġhom fil-port 3000.

Skjerament ta 'servizzi distribwiti f'Yandex.Cloud bl-użu ta' Grafana bħala eżempju

Mini sommarju

Fl-aħħarnett, stajna niskjeraw manwalment l-infrastruttura tal-applikazzjoni mixtieqa, u issa għandna servizz Grafana reżiljenti ħafna. Għandek bżonn biss tkun taf l-indirizz IP tal-balancer bħala l-punt tad-dħul għall-applikazzjoni u l-host tal-cluster ClickHouse sabiex tagħbija s-sett tad-dejta fih.

Jidher bħala rebħa? Iva, rebħa. Imma xi ħaġa għadha tħawwadni. Il-proċess kollu ta 'hawn fuq jeħtieġ ħafna passi manwali u mhuwa skalabbli xejn; Nixtieq nawtomatah jekk possibbli. Dan huwa dak it-taqsima li jmiss se tkun iddedikata.

Integrazzjoni Terraform

Aħna se nerġgħu nużaw għodda minn HashiCorp imsejħa Terraform. Dan jgħinek tiskjera l-infrastruttura kollha tal-applikazzjoni bil-klikk ta 'buttuna, ibbażata fuq diversi varjabbli mgħoddija mill-utent. Ejja nikteb riċetta li tista 'titħaddem diversi drabi f'sezzjonijiet differenti ta' utenti differenti.

Ix-xogħol kollu ma' Terraform jirriżulta għall-kitba ta' fajl ta' konfigurazzjoni (*.tf) u l-ħolqien ta' infrastruttura bbażata fuqha.

Varjabbli

Fil-bidu nett tal-fajl, se ninkludu varjabbli li jiddeterminaw fejn u kif se tiġi skjerata l-infrastruttura futura.

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

Il-proċess kollu tal-iskjerament tal-applikazzjoni se jinżel għall-bini ta 'immaġni tad-diska u l-iffissar ta' dawn il-varjabbli. Ħa nispjega għalxiex huma responsabbli:

oauth_token — token għall-aċċess għall-cloud. Jista 'jinkiseb minn rabta.
cloud_id — identifikatur tal-cloud fejn se niskjeraw l-applikazzjoni
folder_id — identifikatur tat-taqsima fejn se niskjeraw l-applikazzjoni
service_account_id — identifikatur tal-kont tas-servizz fit-taqsima korrispondenti tal-cloud.
image_id — identifikatur ta' l-immaġni tad-diska miksuba bl-użu ta' Packer
username и password — username u password biex jaċċessaw iż-żewġ databases u s-server tal-web Grafana
dbname — isem tad-database ġewwa raggruppamenti CH u MySQL
public_key_path — mogħdija għall-fajl biċ-ċavetta ssh pubblika tiegħek, li tista' tuża biex tikkonnettja taħt l-isem ubuntu għal magni virtwali b'servers tal-web

Setup tal-fornitur

Issa għandek bżonn tikkonfigura l-fornitur Terraform - fil-każ tagħna, Yandex:

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

Tinduna li hawnhekk qed nużaw il-varjabbli definiti hawn fuq.

Netwerk u raggruppamenti

Issa se noħolqu netwerk li fih elementi tal-infrastruttura tagħna se jikkomunikaw, tliet subnets (wieħed f'kull reġjun) u jgħollu raggruppamenti CH u MySQL.


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

Kif tistgħu taraw, kull wieħed miż-żewġ gruppi huwa maħluq pjuttost tolleranti għall-ħsarat billi jitqiegħed fi tliet żoni ta 'disponibbiltà.

Web servers

Jidher li nistgħu nkomplu bl-istess spirtu, imma dħalt f’diffikultà. Qabel dan, l-ewwel qajjejt cluster MySQL u biss wara dan, billi naf l-ID tiegħu, ġabar immaġni tad-diska bil-konfigurazzjoni meħtieġa, fejn speċifikajt l-ospitant għall-cluster. Imma issa ma nafux l-ID tal-cluster qabel ma tniedi Terraform, inkluż fil-ħin tal-bini tal-immaġni. Għalhekk, kelli nirrikorri għal dan li ġej trick.

Bl-użu tas-servizz tal-metadata ta 'Amazon, aħna se ngħaddu xi parametri lill-magna virtwali, li se taċċetta u tipproċessa. Għandna bżonn li l-magna tmur għall-metadata wara l-host tal-grupp MySQL u l-username-password, li l-utent speċifikat fil-fajl Terraform, wara li jibda. Ejja nibdlu ftit il-kontenut tal-fajl setup.sh, li taħdem meta l-magna virtwali tkun mixgħula.

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 group u balancer

Wara li bnew immaġini tad-diska ġdida, fl-aħħar nistgħu nżidu l-fajl tagħna għal Terraform.

Ejja nindikaw li rridu nużaw immaġini tad-diska eżistenti:

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

Issa ejja noħolqu grupp ta 'istanza:

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

Ta 'min nagħtu attenzjoni għal kif għaddihna fil-metadata cluster_uri, username и password. Huma dawn li l-magna virtwali se tieħu fl-istartjar u tpoġġi fil-konfigurazzjoni Grafana.

Huwa f'idejn il-balancer.

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

Ftit zokkor

Fadal biss ftit. Wara li l-infrastruttura tiġi skjerata, ikollok tmur għall-UI Grafana u żżid manwalment il-grupp CH (l-ID tiegħu għad irid jinkiseb) bħala Sors tad-Data. Imma Terraform jaf l-ID tal-cluster. Ejja nafdawh biex il-kwistjoni titwettaq.

Ejja nżidu fornitur ġdid - Grafana, u agħtiha l-indirizz IP tal-balancer bħala host. Il-bidliet kollha li Terraform jagħmel fuq il-magna fejn jiddetermina l-balancer tiegħu se jikbru fil-MySQL, u għalhekk fuq il-magni l-oħra kollha.

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

Ejja moxtna xagħarna

Ejja nuru l-indirizz IP tal-balancer u l-host tal-cluster ClickHouse

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

Jista 'jiġri

Kollha! Il-fajl tal-konfigurazzjoni tagħna huwa lest u nistgħu, billi nissettjaw il-varjabbli, ngħidu lil Terraform biex tgħolli dak kollu li ddeskrivejna hawn fuq. Il-proċess kollu ħa me madwar 15-il minuta.
Fl-aħħar tista’ tara messaġġ sabiħ:

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

U fis-sħaba, elementi tal-infrastruttura mgħollija se jkunu viżibbli:

Skjerament ta 'servizzi distribwiti f'Yandex.Cloud bl-użu ta' Grafana bħala eżempju

Qosor

Issa, billi tuża Grafana bħala eżempju, kull wieħed minnkom jista 'jutilizza applikazzjonijiet b'arkitettura ta' sħaba mifruxa fuq il-pjattaforma Yandex.Cloud. Għodod utli minn HashiCorp bħal Packer u Terraform jistgħu jgħinuk f'dan. Nispera li xi ħadd isib dan l-artiklu utli :)

PS Hawn taħt ser nehmeż link għar-repożitorju fejn tista 'ssib riċetti lesti għal Packer u Terraform, li frammenti minnhom ipprovdejt f'dan l-artikolu.

repożitorju

Sors: www.habr.com

Żid kumment