Ynset fan ferdielde tsjinsten yn Yandex.Cloud mei Grafana as foarbyld

Hoi allegearre! As ûnderdiel fan myn kursus wurk, Ik ûndersocht de mooglikheden fan sa'n ynlânske wolk platfoarm as Yandex.Cloud. It platfoarm biedt ferskate tsjinsten foar it oplossen fan praktyske problemen. Soms moatte jo lykwols jo eigen wolkapplikaasje ynstelle mei in frij wiidweidige ynfrastruktuer basearre op dizze tsjinsten. Yn dit artikel wol ik myn ûnderfining diele by it ynsetten fan sa'n applikaasje.

Ynset fan ferdielde tsjinsten yn Yandex.Cloud mei Grafana as foarbyld

Wat wolle jo ûntfange?

grafana - in krêftich ark foar it oplossen fan analytyske problemen of tafersjoch op problemen fan alle systemen. Yn syn basiskonfiguraasje is dit in firtuele masine mei in Grafana-webserver, en ek in databank (ClickHouse, InfluxDB, ensfh.) Mei in dataset wêrop analytics basearre wurde.

Nei it lansearjen fan in firtuele masine mei in webserver, kinne jo nei har host gean en in prachtige UI krije, databases as boarnen foar fierdere wurk opjaan, dashboards en grafiken oanmeitsje.

Ynset fan ferdielde tsjinsten yn Yandex.Cloud mei Grafana as foarbyld

De basisferzje hat ien signifikant nadeel - it is hielendal net tolerant. Dat is, de folsleine funksjonaliteit fan 'e applikaasje hinget ôf fan' e leefberens fan ien firtuele masine. As it wegeret of 10 minsken iepenje de UI tagelyk, dan sille problemen ûntstean.

Se kinne gewoan oplost wurde: jo moatte gewoan ... in protte identike firtuele masines ynsette mei in webserver en pleatse se ûnder in L3-balancer. Mar net alles is hjir sa dúdlik. Grafana bewarret brûkersynstellingen (paden nei databases, dashboards, grafiken, ensfh.) direkt op 'e skiif fan har firtuele masine. Sa, as wy feroarje guon ynstellings yn de UI, dizze feroarings sille wurde wjerspegele allinnich op de firtuele masine dêr't de balancer stjoerde ús. Dit sil liede ta inkonsistente ynstellingen foar ús applikaasje, wêrtroch problemen mei lansearring en gebrûk feroarsaakje.

Hjir sil in oare databank ta de rêding komme, bygelyks MySQL of syn lykweardich. Wy fertelle Grafana dat se brûkersynstellingen yn dizze "spare" databank opslaan moat. Neitiid sil it genôch wêze om it paad nei dizze databank ien kear op elke masine op te jaan, en alle oare brûkersynstellingen op ien fan 'e firtuele masines te bewurkjen; se sille útwreidzje nei de oaren.

Hjir is in diagram fan 'e definitive applikaasje-ynfrastruktuer:

Ynset fan ferdielde tsjinsten yn Yandex.Cloud mei Grafana as foarbyld

Litte wy leare om mei ús hannen op te heffen

MySQL en ClickHouse

Foardat jo sa'n applikaasje mei de klik op in knop ynsette, wie it nedich om te learen hoe't jo elk fan syn komponinten behannelje en se mei elkoar yntegrearje.

Hjir sil Yandex.Cloud ús helpe, dy't L3 balancers, ClickHouse en MySQL as managed tsjinsten leveret. De brûker moat allinich de parameters opjaan en wachtsje oant it platfoarm alles yn wurking bringt.

Ik registrearre, makke in wolk en in betelling account. Dêrnei gie ik nei de wolk en sette MySQL- en ClickHouse-klusters op mei minimale ynstellingen. Ik wachte oant se aktyf waarden.

Ynset fan ferdielde tsjinsten yn Yandex.Cloud mei Grafana as foarbyldYnset fan ferdielde tsjinsten yn Yandex.Cloud mei Grafana as foarbyld

Jo moatte ek ûnthâlde om in databank yn elke kluster te meitsjen en tagong ta it te konfigurearjen mei in oanmelding en wachtwurd. Ik sil hjir net yn details gean - alles is frij dúdlik yn 'e ynterface.

It net foar de hân lizzende detail wie dat dizze databases in protte hosts hawwe, dy't har skuldtolerânsje garandearje. Grafana fereasket lykwols krekt ien host foar elke databank wêrmei't it wurket. Lang lêzen dokumintaasje De wolken brochten my ta in beslút. It docht bliken dat de gasthear fan 'e soarte c-<cluster_id>.rw.mdb.yandexcloud.net yn kaart brocht oan de hjoeddeiske aktive master host fan it kluster mei de oerienkommende ID. Dit is wat wy sille jaan oan Grafana.

Webtsjinner

No is it oan de webserver. Litte wy in gewoane firtuele masine mei Linux ferheegje en Grafana der manuell konfigurearje.

Ynset fan ferdielde tsjinsten yn Yandex.Cloud mei Grafana as foarbyld

Ynset fan ferdielde tsjinsten yn Yandex.Cloud mei Grafana as foarbyld

Litte wy ferbine fia ssh en ynstallearje de nedige pakketten.

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 

Litte wy dêrnei Grafana ûnder systemctl útfiere en de plugin ynstallearje foar wurkjen mei ClickHouse (ja, it wurdt net levere yn it basispakket).

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

Dat is it, dêrnei mei in ienfâldich kommando

sudo service grafana-server start

wy sille begjinne de web tsjinner. No kinne jo it eksterne IP-adres fan 'e firtuele masine yn' e browser ynfiere, poarte 3000 opjaan en de prachtige Grafana UI sjen.
Ynset fan ferdielde tsjinsten yn Yandex.Cloud mei Grafana as foarbyld

Mar haast net, foardat jo Grafana ynstelle, moatte jo ûnthâlde om it it paad nei MySQL te fertellen om de ynstellingen dêr op te slaan.

De folsleine konfiguraasje fan 'e Grafana-webserver is yn it bestân /etc/grafana/grafana.ini. De fereaske line sjocht der sa út:

;url =

Wy sette de host yn op it MySQL-kluster. Itselde bestân befettet de oanmelding en wachtwurd foar tagong ta Grafana yn 'e foto hjirboppe, dy't standert beide gelyk binne admin.

Jo kinne sed-kommando's brûke:

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

It is tiid om de webserver opnij te starten!

sudo service grafana-server restart

No yn 'e Grafana UI sille wy ClickHouse spesifisearje as in DataSource.

Ik koe in wurkjende konfiguraasje berikke mei de folgjende ynstellings:

Ynset fan ferdielde tsjinsten yn Yandex.Cloud mei Grafana as foarbyld

Ik spesifisearre as de URL https://c-<cluster_id>.rw.mdb.yandexcloud.net:8443

Alle! Wy hawwe ien wurkjende firtuele masine mei in webserver ferbûn mei CH en MySQL. Jo kinne de dataset al uploade nei ClickHouse en dashboards bouwe. Wy hawwe ús doel lykwols noch net berikt en hawwe gjin folweardige ynfrastruktuer ynset.

packer

Yandex.Cloud kinne jo meitsje in skiif ôfbylding fan in besteande firtuele masine, en op syn basis - elk oantal masines identyk oan elkoar. Dit is krekt wat wy sille brûke. Om it byld maklik te sammeljen, nim it ark packer fan HashiCorp. It nimt as ynfier in json-bestân mei ynstruksjes foar it gearstallen fan de ôfbylding.

Us json-bestân sil bestean út twa blokken: bouwers en foarsjenningen. It earste blok beskriuwt de parameters fan 'e ôfbylding sels as in entiteit, en it twadde blok beskriuwt ynstruksjes foar it ynfoljen fan it mei de nedige ynhâld.

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

Yn dit sjabloan moatte jo de identifier ynstelle fan 'e seksje yn' e wolk wêr't jo de ôfbylding wolle oanmeitsje, lykas it paad nei it bestân mei de kaaien fan it tsjinstkonto dat earder yn dizze seksje makke is. Jo kinne mear lêze oer it meitsjen fan tsjinstakkounts en kaaien yn 'e foarm fan in bestân yn' e oerienkommende seksje dokumintaasje.

Dizze konfiguraasje seit dat it skiifôfbylding sil wurde boud op basis fan it platfoarm ubuntu-1804-lts, pleatst yn 'e passende brûkersseksje yn' e ôfbyldingsfamylje GRAFANA ûnder de namme grafana-{{timestamp}}.

Provisioners

No komt it nijsgjirriger diel fan 'e konfiguraasje. It sil de folchoarder fan aksjes beskriuwe dy't op 'e firtuele masine moatte wurde útfierd foardat de steat yn in skiifôfbylding befriest.

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

Hjir binne alle aksjes ferdield yn 3 stadia. Op it earste stadium wurdt in ienfâldich skript útfierd dat in helpmap makket.

prepare-ctg.sh:

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

Op it folgjende poadium pleatse wy in skript yn dizze map, dat sil moatte wurde lansearre fuortendaliks nei it starten fan de firtuele masine. Dit skript sil de brûkersfariabelen pleatse dy't moatte wurde registrearre yn 'e Grafana-konfiguraasje en de webserver opnij starte.

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

Hjirnei binne der noch 3 dingen te dwaan:
1) ynstallearje pakketten
2) Run Grafana ûnder systemctl en ynstallearje de ClickHouse-plugin
3) set it setup.sh-skript yn 'e startwachtrige direkt nei it ynskeakeljen fan' e firtuele masine.

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;

No is alles wat oerbliuwt om Packer út te fieren en de útfierôfbylding te pleatsen yn 'e opjûne seksje. By it meitsjen fan in firtuele masine kinne jo it selektearje as in bootdisk en nei it lansearjen krije jo in klearmakke Grafana-webserver.

Ynset fan ferdielde tsjinsten yn Yandex.Cloud mei Grafana as foarbyld
Ynset fan ferdielde tsjinsten yn Yandex.Cloud mei Grafana as foarbyld

Ynstânsje groep en balancer

As wy ienris in skiifôfbylding hawwe wêrmei wy in protte identike Grafana-webservers kinne meitsje, kinne wy ​​​​in eksimplaargroep oanmeitsje. Op it Yandex.Cloud-platfoarm ferwiist dizze term nei de uny fan firtuele masines dy't deselde skaaimerken hawwe. By it meitsjen fan in eksimplaargroep wurdt it prototype fan alle masines yn dizze groep konfigureare, en dan de skaaimerken fan 'e groep sels (bygelyks it minimum en maksimum oantal aktive masines). As it hjoeddeiske nûmer net oan dizze kritearia foldocht, dan sil de eksimplaargroep sels ûnnedige masines fuortsmite of nije yn syn eigen byld meitsje.

As ûnderdiel fan ús taak sille wy in eksimplaargroep fan webservers oanmeitsje dy't sil wurde generearre út it earder oanmakke skiifôfbylding.

Ynset fan ferdielde tsjinsten yn Yandex.Cloud mei Grafana as foarbyld

Ynset fan ferdielde tsjinsten yn Yandex.Cloud mei Grafana as foarbyld

Wat wirklik opmerklik is, is de opset fan de lêste eksimplaar. De doelgroep yn yntegraasje mei Load Balancer sil jo helpe om in L3 balancer te konfigurearjen boppe op 'e firtuele masines fan dizze groep troch te klikken op in pear knoppen.

Ynset fan ferdielde tsjinsten yn Yandex.Cloud mei Grafana as foarbyld

By it ynstellen fan de balancer haw ik twa wichtige punten ymplementearre:

  1. Ik makke de balancer akseptearje brûkersferkear op poarte 80 en omliede it nei poarte 3000 fan 'e firtuele masines, krekt wêr't Grafana libbet.
  2. Ik haw ynsteld om de leefberens fan masines te kontrolearjen troch se te pingjen nei poarte 3000.

Ynset fan ferdielde tsjinsten yn Yandex.Cloud mei Grafana as foarbyld

Mini gearfetting

Uteinlik koenen wy de winske applikaasje-ynfrastruktuer manuell ynsette, en no hawwe wy in heul duorsume Grafana-tsjinst. Jo hoege allinich it IP-adres fan 'e balancer te witten as it yngongspunt foar de applikaasje en de host fan it ClickHouse-kluster om de dataset deryn te laden.

It soe lykje as in oerwinning? Ja, oerwinning. Mar noch wat ferwar my. It heule proses hjirboppe fereasket in protte hânmjittige stappen en is hielendal net skalberber; Ik soe it as mooglik automatisearje wolle. Dit is wêr't de folgjende paragraaf oan wijd wurdt.

Terraform yntegraasje

Wy sille wer brûke in ark út HashiCorp neamd Terraform. It sil jo helpe om de heule applikaasje-ynfrastruktuer yn te setten mei de klik op in knop, basearre op ferskate fariabelen trochjûn troch de brûker. Litte wy in resept skriuwe dat meardere kearen kin wurde útfierd yn ferskate seksjes fan ferskate brûkers.

Alle wurk mei Terraform komt del op it skriuwen fan in konfiguraasjetriem (*.tf) en it skeppen fan ynfrastruktuer op basis dêrfan.

Fariabelen

Oan it begjin fan it bestân sille wy fariabelen opnimme dy't bepale wêr't en hoe't de takomstige ynfrastruktuer ynset wurde sil.

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

It hiele proses fan applikaasje-ynset sil delkomme op it bouwen fan in skiifôfbylding en it ynstellen fan dizze fariabelen. Lit my útlizze wêrfoar se ferantwurdlik binne:

oauth_token - in token foar tagong ta de wolk. Kin krigen wurde troch link.
wolk_id - wolkidentifikaasje wêr't wy de applikaasje sille ynsette
folder_id - seksje-identifikaasje wêr't wy de applikaasje sille ynsette
service_account_id - tsjinst account identifier yn 'e oerienkommende seksje fan' e wolk.
image_id - identifier fan it skiifôfbylding krigen mei Packer
brûkersnamme и wachtwurd - brûkersnamme en wachtwurd om tagong te krijen ta beide databases en de Grafana-webserver
dbnamme - databasenamme binnen CH- en MySQL-klusters
iepenbiere_kaaipaad - paad nei it bestân mei jo iepenbiere ssh-kaai, dy't jo kinne brûke om te ferbinen ûnder de namme ubuntu oan firtuele masines mei webservers

Oanbieder opset

No moatte jo de Terraform-provider konfigurearje - yn ús gefal, Yandex:

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

Jo sille merke dat wy hjir de hjirboppe definieare fariabelen brûke.

Netwurk en klusters

No sille wy in netwurk meitsje wêryn eleminten fan ús ynfrastruktuer sille kommunisearje, trije subnets (ien yn elke regio) en CH- en MySQL-klusters ferheegje.


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

Sa't jo sjen kinne, is elk fan 'e twa klusters frij fouttolerant makke troch te lizzen yn trije beskikberensônes.

Web tsjinners

It soe lykje dat wy yn deselde geast trochgean koene, mar ik kaam yn swierrichheden. Dêrfoar haw ik earst in MySQL-kluster opbrocht en pas dêrnei, wittende syn ID, sammele ik in skiifôfbylding mei de fereaske konfiguraasje, wêr't ik de host oan it kluster spesifisearre. Mar no witte wy de kluster-ID net foardat Terraform lansearre, ynklusyf op it momint fan it bouwen fan de ôfbylding. Dêrom moast ik ta it folgjende tawize trúk.

Mei help fan Amazon's metadata-tsjinst sille wy guon parameters trochjaan oan 'e firtuele masine, dy't it sil akseptearje en ferwurkje. Wy hawwe de masine nedich om te gean nei de metadata efter de MySQL-klusterhost en brûkersnamme-wachtwurd, dy't de brûker spesifisearre yn it Terraform-bestân, nei it starten. Litte wy de ynhâld fan it bestân in bytsje feroarje setup.sh, dy't rint as de firtuele masine ynskeakele is.

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 groep en balancer

Nei't wy in nije skiifôfbylding hawwe opboud, kinne wy ​​einlings ús bestân tafoegje foar Terraform.

Litte wy oanjaan dat wy in besteande skiifôfbylding wolle brûke:

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

Litte wy no in eksimplaargroep oanmeitsje:

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

It is it wurdich omtinken te jaan oan hoe't wy it yn 'e metadata trochjûn hawwe cluster_uri, username и password. It binne dizze dy't de firtuele masine sil útnimme by it opstarten en yn 'e Grafana-konfiguraasje sette.

It is oan de 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
      }
    }
  }
}

In bytsje sûker

Der is mar in bytsje oer. Nei't de ynfrastruktuer is ynset, moatte jo nei de Grafana UI gean en it CH-kluster manuell tafoegje (de ID wêrfan noch moat wurde krigen) as gegevensboarne. Mar Terraform wit de kluster-ID. Lit ús him tafertrouwe om de saak ta bloei te bringen.

Lit ús in nije provider tafoegje - Grafana, en jou har it IP-adres fan 'e balancer as host. Alle feroarings dy't Terraform makket op 'e masine dêr't syn balancer bepaalt sil groeie yn MySQL, en dus op alle oare masines.

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

Litte wy ús hier kammen

Litte wy it balancer IP-adres en de host fan it ClickHouse-kluster werjaan

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

Kin drave

Alle! Us konfiguraasjetriem is klear en wy kinne, troch de fariabelen yn te stellen, Terraform fertelle om alles op te heljen dat wy hjirboppe beskreaun hawwe. It hiele proses naam my sawat 15 minuten.
Oan 'e ein kinne jo in prachtich berjocht sjen:

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

En yn 'e wolk sille eleminten fan' e ferhege ynfrastruktuer sichtber wêze:

Ynset fan ferdielde tsjinsten yn Yandex.Cloud mei Grafana as foarbyld

Lit de resultaten opkomme

No, mei Grafana as foarbyld, kin elk fan jo applikaasjes ynsette mei in útwreide wolkarsjitektuer op it Yandex.Cloud-platfoarm. Nuttige ark fan HashiCorp lykas Packer en Terraform kinne jo hjirmei helpe. Ik hoopje dat immen dit artikel nuttich fynt :)

PS Hjirûnder sil ik in keppeling taheakje nei it repository wêr't jo klearmakke resepten kinne fine foar Packer en Terraform, fragminten wêrfan ik yn dit artikel levere.

repository

Boarne: www.habr.com

Add a comment