Implantazione di servizii distribuiti in Yandex.Cloud cù Grafana cum'è un esempiu

Salut à tutti ! Cum'è parte di u mo travagliu di u cursu, stava ricercendu e pussibulità di una tale piattaforma di nuvola domestica cum'è Yandex.Cloud. A piattaforma offre diversi servizii per risolve i prublemi pratichi. Tuttavia, qualchì volta hè necessariu di cunfigurà a vostra applicazione in nuvola cù una infrastruttura piuttostu larga basata nantu à questi servizii. In questu articulu, vogliu sparte l'esperienza di implementà una tale applicazione.

Implantazione di servizii distribuiti in Yandex.Cloud cù Grafana cum'è un esempiu

Chì vulete riceve ?

Grafana - un strumentu putente per risolve i prublemi analitici o i prublemi di monitoraghju di qualsiasi sistemi. In a so cunfigurazione basica, questu hè una macchina virtuale cù u servitore web Grafana, è ancu una basa di dati (ClickHouse, InfluxDB, etc.) cù un dataset chì serà utilizatu per custruisce analitiche.

Dopu avè principiatu una macchina virtuale cù un servitore web, pudete andà à u so òspite è uttene una bella UI, specificà e basa di dati cum'è fonti per u travagliu più, creà dashboards è grafici.

Implantazione di servizii distribuiti in Yandex.Cloud cù Grafana cum'è un esempiu

A versione basica hà un inconveniente significativu - ùn hè micca tollerante à i difetti. Vale à dì, tutta a prestazione di l'applicazione dipende da a viabilità di una macchina virtuale. S'ella ricusa o se 10 persone aprenu l'UI à u stessu tempu, i prublemi saranu.

Sò risolti simpliciamente: basta à implementà parechje macchine virtuale identiche cù un servitore web è mette sottu à un equilibratore L3. Ma micca tuttu hè cusì chjaru quì. Grafana guarda i paràmetri di l'utilizatori (percorsi à basa di dati, dashboards, gràfiche, etc.) direttamente nantu à u discu di a so macchina virtuale. Cusì, se cambiate certi paràmetri in l'UI, allora questi cambiamenti seranu visualizati solu nantu à a macchina virtuale induve l'equilibratore ci hà mandatu. Questu porta à paràmetri inconsistenti per a nostra applicazione, prublemi cù u lanciamentu è l'usu.

Quì una altra basa di dati vinarà in salvezza, per esempiu, MySQL o u so equivalente. Dicemu à Grafana chì deve guardà i paràmetri di l'utilizatori in questa basa di dati "spare". Dopu quì, serà abbastanza per specificà u percorsu à sta basa di dati in ogni macchina una volta, è edità tutti l'altri paràmetri di l'utilizatori nantu à qualsiasi di e macchine virtuali, crescenu nantu à u restu.

Eccu un diagramma di l'infrastruttura finale di l'applicazione:

Implantazione di servizii distribuiti in Yandex.Cloud cù Grafana cum'è un esempiu

Amparate à elevà cù e vostre mani

MySQL è ClickHouse

Prima di implementà una tale applicazione cù u clicu di un buttone, era necessariu d'amparà à elevà ognuna di i so cumpunenti cù manichi è integrà cù l'altri.

Yandex.Cloud ci aiuterà quì, chì furnisce balancers L3, ClickHouse è MySQL cum'è servizii amministrati. L'utilizatore solu deve specificà i paràmetri è aspittà finu à chì a piattaforma porta tuttu in un statu di travagliu.

Aghju registratu, creatu un nuvulu è un contu di fattura per mè stessu. Dopu quì, sò andatu in u nuvulu è hà risuscitatu i clusters MySQL è ClickHouse cù paràmetri minimi. Aspetta finu à chì diventanu attivu.

Implantazione di servizii distribuiti in Yandex.Cloud cù Grafana cum'è un esempiuImplantazione di servizii distribuiti in Yandex.Cloud cù Grafana cum'è un esempiu

Avete ancu bisognu di ricurdà di creà una basa di dati in ogni cluster è cunfigurà l'accessu à questu per login è password. Ùn entreraghju micca in dettagli quì - tuttu hè abbastanza ovvi in ​​l'interfaccia.

U ditagliu micca ovviu era chì queste basa di dati anu parechji ospiti chì furniscenu a so toleranza di difetti. Tuttavia, Grafana richiede esattamente un host per ogni basa di dati cù quale travaglia. Lettura longa ducumentazione I nuvuli m'hà purtatu à una decisione. Ci hè chì una mansa di a forma c-<cluster_id>.rw.mdb.yandexcloud.net Maps à l'ospitu maestru di cluster attivu attuale cù l'ID currispundente. Hè ciò chì daremu à Grafana.

Servitore web

Avà tocca à u servitore web. Cridemu una macchina virtuale regulare cù Linux è stallate Grafana nantu à questu cù e nostre mani.

Implantazione di servizii distribuiti in Yandex.Cloud cù Grafana cum'è un esempiu

Implantazione di servizii distribuiti in Yandex.Cloud cù Grafana cum'è un esempiu

Cunnetteremu via ssh è installate i pacchetti necessarii.

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 

Dopu quì, cuminciaremu Grafana sottu systemctl è installate u plugin per travaglià cù ClickHouse (sì, ùn hè micca furnitu in u pacchettu di basa).

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

Tuttu dopu cù un cumandamentu simplice

sudo service grafana-server start

avemu da principià u servore web. Avà serà pussibule di guidà in l'indirizzu IP esternu di a macchina virtuale in u navigatore, specificà u portu 3000 è vede a bella UI grafana.
Implantazione di servizii distribuiti in Yandex.Cloud cù Grafana cum'è un esempiu

Ma ùn precipite micca, prima di stabilisce Grafana, ùn devi micca scurdate di specificà a strada di MySQL per almacenà i paràmetri quì.

A cunfigurazione sana di u servitore web Grafana hè in u schedariu /etc/grafana/grafana.ini. A linea necessaria hè cusì:

;url =

Esponemu l'ospite à u cluster MySQL. U stessu schedariu cuntene u login è a password per accede à Grafana in a stampa sopra, chì sò tramindui uguali per difettu admin.

Pudete aduprà cumandamenti 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

Hè ora di riavvia u servitore web !

sudo service grafana-server restart

Avà in a Grafana UI, avemu da specificà ClickHouse cum'è DataSource.

Aghju riesciutu à ottene una cunfigurazione di travagliu cù e seguenti paràmetri:

Implantazione di servizii distribuiti in Yandex.Cloud cù Grafana cum'è un esempiu

Aghju datu cum'è URL https://c-<cluster_id>.rw.mdb.yandexcloud.net:8443

Tuttu ! Avemu una macchina virtuale chì travaglia cun un servitore web cunnessu à CH è MySQL. Pudete digià carica u dataset à ClickHouse è custruisce dashboards. Tuttavia, ùn avemu micca ancu ghjuntu à u nostru scopu è ùn avemu micca implementatu una infrastruttura cumpleta.

Imballatore

Yandex.Cloud permette di creà una maghjina di discu di una macchina virtuale esistente, è basatu annantu à questu, pudete creà tante macchine identiche chì vulete. Questu hè esattamente ciò chì useremu. Per assemblà convenientemente l'imaghjini, pigliate u strumentu Imballatore da HashiCorp. Piglia cum'è input un schedariu json cù struzzioni per custruisce l'imaghjini.

U nostru schedariu json serà custituitu da dui blocchi: custruttori è furnituri. U primu bloccu descrive i paràmetri di l'imaghjini stessu cum'è una entità, è u sicondu descrive l'istruzzioni per riempie cù u cuntenutu necessariu.

NEXUS

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

In questu mudellu, avete bisognu di stabilisce l'identificatore di a rùbbrica in u nuvulu induve vulete creà una maghjina, è ancu u percorsu à u schedariu cù i chjavi da u contu di serviziu creatu prima in questa sezione. Pudete leghje più nantu à a creazione di cunti di serviziu è chjave in a forma di un schedariu in a sezione currispundente. ducumentazione.

Sta cunfigurazione dice chì l'imaghjini di discu serà custruitu basatu annantu à a piattaforma ubuntu-1804-lts, pusatu in a sezione d'utilizatori appropritata in a famiglia di l'imaghjini GRAFANA sottu u nome grafana-{{timestamp}}.

Pruvistori

Avà per a parte più interessante di a cunfigurazione. Descriverà a sequenza di l'azzioni chì deve esse realizatu nantu à una macchina virtuale prima di congelate u so statu in una maghjina di discu.

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

Quì, tutte l'azzioni sò spartuti in 3 tappe. À a prima tappa, un script simplice hè eseguitu chì crea un repertoriu ausiliariu.

prepare-ctg.sh:

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

À a tappa dopu, pusemu un script in questu repertoriu, chì deve esse eseguitu immediatamente dopu avè principiatu a macchina virtuale. Stu script metterà e variàbili di l'utilizatori per esse stabilitu in a cunfigurazione di Grafana è riavvia u servitore 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

Dopu quì, ci sò 3 cose da fà:
1) installà i pacchetti
2) lanciate Grafana sottu systemctl è installate u plugin ClickHouse
3) mette u script setup.sh in a fila per eseguisce immediatamente dopu avè accende a macchina virtuale.

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;

Avà ferma à eseguisce Packer è uttene l'immagine di output posta in a partizione specifica. Quandu crea una macchina virtuale, pudete selezziunate cum'è un discu di boot è, dopu avè principiatu, uttene un servitore web Grafana prontu.

Implantazione di servizii distribuiti in Yandex.Cloud cù Grafana cum'è un esempiu
Implantazione di servizii distribuiti in Yandex.Cloud cù Grafana cum'è un esempiu

Gruppu di istanza è balancer

Una volta ci hè una maghjina di discu chì vi permette di creà parechji servitori web identici di Grafana, pudemu creà un gruppu di istanza. Nantu à a piattaforma Yandex.Cloud, stu terminu si riferisce à l'unione di macchine virtuali chì anu e stesse caratteristiche. Quandu creanu un gruppu di istanza, u prototipu di tutte e macchine in questu gruppu hè cunfiguratu, è dopu e caratteristiche di u gruppu stessu (per esempiu, u minimu è u massimu di macchine attive). Se u numeru attuale ùn scontra micca stu criteriu, allora u gruppu di istanza stessu sguasserà e macchine innecessarii o creà novi in ​​l'imaghjini è simili.

Comu parte di u nostru compitu, creeremu un gruppu d'istanza di servitori web chì saranu generati da l'imaghjini di discu creatu prima.

Implantazione di servizii distribuiti in Yandex.Cloud cù Grafana cum'è un esempiu

Implantazione di servizii distribuiti in Yandex.Cloud cù Grafana cum'è un esempiu

L'ultima configurazione di u gruppu di istanza hè veramente notevule. U gruppu di destinazione in integrazione cù Load Balancer vi aiuterà à stallà un equilibratore L3 in cima di e macchine virtuali di stu gruppu pressendu un paru di buttoni.

Implantazione di servizii distribuiti in Yandex.Cloud cù Grafana cum'è un esempiu

Quandu hà stallatu u balancer, aghju implementatu dui punti impurtanti:

  1. Aghju fattu cusì chì u balancer accettò u trafficu di l'utilizatori nantu à u portu 80, è l'hà ridirettu à u portu 3000 di e macchine virtuali, solu induve Grafana vive.
  2. Configurate i cuntrolli di salute di a macchina pinghjenduli in u portu 3000.

Implantazione di servizii distribuiti in Yandex.Cloud cù Grafana cum'è un esempiu

mini-totale

Infine, pudemu implementà manualmente l'infrastruttura d'applicazione desiderata, è avà avemu un serviziu Grafana altamente resistente. Solu bisognu di cunnosce l'indirizzu IP di l'equilibratore cum'è u puntu di ingressu à l'applicazione è l'ospiti di u cluster ClickHouse per carricà u dataset in questu.

Sembra una vittoria? Iè, vittoria. Ma qualcosa mi preoccupa sempre. U prucessu tutale sopra esige assai azzioni manuali è ùn scala micca in tuttu, vogliu automatizà si hè pussibule. Questu serà u focu di a prossima sezione.

Integrazione cù Terraform

Avemu da novu aduprà un strumentu da HashiCorp chjamatu Terraform. Aiuterà à implementà tutta l'infrastruttura di l'applicazione à u clicu di un buttone, basatu annantu à uni pochi di variabili passati da l'utilizatore. Scrivemu una ricetta chì pò esse eseguita parechje volte in diverse sezioni di diversi utilizatori.

Tuttu u travagliu cù Terraform si riduce à scrive un schedariu di cunfigurazione (*.tf) è a creazione di l'infrastruttura basatu annantu à questu.

Variabili

À l'iniziu di u schedariu, pigliaremu e variàbili chì determinanu induve è cumu l'infrastruttura futura serà implementata.

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

U prucessu tutale di implementazione di una applicazione scenderà à custruisce una maghjina di discu è stabilisce sti variàbili. Lasciami spiegà ciò chì sò rispunsevuli di:

oauth_token - un token per l'accessu à u nuvulu. Pò esse acquistatu da a lea.
cloud_id - identificatore di u nuvulu induve implementeremu l'applicazione
folder_id - identificatore di a sezione induve implementeremu l'applicazione
service_account_id - identificatore di u contu di serviziu in a sezione currispundente di u nuvulu.
image_id - identificatore di l'imagine di discu ottenuta cù Packer
gatti и codice - nome d'utilizatore è password per accede à e duie basa di dati è à u servitore web Grafana
dbname - nome di basa di dati in i clusters CH è MySQL
strada_chjave_pubblica - a strada di u schedariu cù a vostra chjave ssh publica, chì pò esse usata per cunnette sottu u nome ubuntu à e macchine virtuali cù i servitori web

Impostazione di u fornitore

Avà avete bisognu di cunfigurà u fornitore Terraform - in u nostru casu, Yandex:

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

Pudete vede chì quì avemu aduprà e variàbili definite sopra.

Rete è clusters

Avà criemu una reta in quale elementi di a nostra infrastruttura cumunicanu, trè subnets (una in ogni regione) è suscitarà i clusters CH è 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
  }
}

Comu pudete vede, ogni unu di i dui clusters hè custruitu per esse abbastanza tolerante à i difetti essendu postu in trè Zone di Disponibilità.

servitori web

Sembra chì pudete cuntinuà in u stessu spiritu, ma aghju avutu in difficultà. Prima di quessa, aghju prima risuscitatu u cluster MySQL è solu dopu, sapendu u so ID, aghju cullatu una maghjina di discu cù a cunfigurazione desiderata, induve aghju specificatu l'ospite à u cluster. Ma avà ùn sapemu micca l'ID di cluster prima di u lanciu di Terraform, ancu à u mumentu di a creazione di l'imaghjini. Allora aghju avutu à ricurdà à i seguenti truccu.

Utilizendu u serviziu di metadata da Amazon, avemu da passà qualchi paràmetri à a macchina virtuale, chì accettà è prucessa. Avemu bisognu di a macchina per andà à i metadati per l'ospite MySQL di u cluster è per u nome d'utilizatore-password chì l'utilizatore specifica in u schedariu Terraform dopu avè principiatu. Cambia ligeramente u cuntenutu di u schedariu setup.sh, chì corre quandu a macchina virtuale hè attivata.

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

Gruppu Intance è balancer

Dopu avè ricustruitu a nova maghjina di discu, pudemu finalmente aghjunghje u nostru schedariu per Terraform.

Indichemu chì vulemu utilizà una maghjina di discu esistenti:

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

Avà criemu un gruppu di 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"
  }
}

Hè vale a pena attente à cumu avemu passatu à i metadata cluster_uri, username и password. Hè a so macchina virtuale chì l'avete da l'iniziu è a mette in a cunfigurazione Grafana.

Si tratta di l'equilibriu.

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

Un pocu di zuccaru

Ci era assai pocu. Dopu chì l'infrastruttura hè stata implementata, duverete andà à a Grafana UI è aghjunghje manualmente u cluster CH (chì l'ID hè ancu bisognu) cum'è una Fonte di Dati. Ma Terraform cunnosce u cluster ID. Facemu ch'ellu finisci u travagliu.

Aghjunghjemu un novu fornitore - Grafana, è slip l'IP di l'equilibriu cum'è host. Tutti i cambiamenti chì Terraform faci nantu à a macchina induve u so balancer determina cresce in MySQL, è dunque in tutti l'altri machini.

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

Pettinemu

Mostra l'IP di equilibriu è l'ospite di 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"
}

Pò curriri

Tuttu ! U nostru schedariu di cunfigurazione hè prontu è pudemu, mettendu variabili, dì à Terraform per elevà tuttu ciò chì avemu descrittu sopra. Tuttu u prucessu m'hà pigliatu circa 15 minuti.
À a fine, pudete vede un bellu missaghju:

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

È in u nuvulu, elementi di l'infrastruttura elevata seranu visibili:

Implantazione di servizii distribuiti in Yandex.Cloud cù Grafana cum'è un esempiu

Immaimu i risultati

Avà, usendu l'esempiu di Grafana, ognunu di voi pò implementà applicazioni cù l'architettura nuvola sprawling nantu à a piattaforma Yandex.Cloud. Strumenti utili di HashiCorp cum'è Packer è Terraform ponu aiutà cun questu. Spergu chì questu articulu serà utile à qualchissia 🙂

PS Sottu aghjustà un ligame à u repository, induve pudete truvà ricetti pronti per Packer è Terraform, frammenti di quale aghju citatu in questu articulu.

repository

Source: www.habr.com

Add a comment