Elosztott szolgáltatások telepítése a Yandex.Cloudban a Grafana példájával

Sziasztok! Tanfolyami munkám részeként egy olyan hazai felhőplatform képességeit kutattam, mint pl Yandex.Cloud. A platform különféle szolgáltatásokat kínál gyakorlati problémák megoldására. Néha azonban be kell állítania saját felhőalkalmazását egy meglehetősen kiterjedt infrastruktúrával ezekre a szolgáltatásokra alapozva. Ebben a cikkben szeretném megosztani tapasztalataimat egy ilyen alkalmazás telepítésével kapcsolatban.

Elosztott szolgáltatások telepítése a Yandex.Cloudban a Grafana példájával

Mit szeretnél kapni?

grafana — hatékony eszköz az analitikai problémák megoldására vagy bármely rendszer problémáinak megfigyelésére. Alapkonfigurációjában ez egy virtuális gép egy Grafana webszerverrel, valamint egy adatbázis (ClickHouse, InfluxDB stb.) egy adatkészlettel, amelyre az elemzés alapja lesz.

Miután elindított egy virtuális gépet egy webszerverrel, beléphet a gazdagépébe, és gyönyörű felhasználói felületet kaphat, megadhat adatbázisokat forrásként a további munkához, irányítópultokat és grafikonokat hozhat létre.

Elosztott szolgáltatások telepítése a Yandex.Cloudban a Grafana példájával

Az alapverziónak van egy jelentős hátránya - egyáltalán nem hibatűrő. Vagyis az alkalmazás teljes funkcionalitása egy virtuális gép életképességétől függ. Ha megtagadja, vagy 10 ember egyszerre nyitja meg a felhasználói felületet, akkor problémák merülnek fel.

Egyszerűen megoldhatók: csak... telepíteni kell sok egyforma virtuális gépet egy webszerverrel, és el kell helyezni őket egy L3-as kiegyenlítő alá. De itt nem minden olyan egyértelmű. A Grafana a felhasználói beállításokat (adatbázisok elérési útja, irányítópultok, grafikonok stb.) közvetlenül a virtuális gépe lemezén tárolja. Így, ha módosítunk néhány beállítást a felhasználói felületen, ezek a változások csak azon a virtuális gépen fognak megjelenni, amelyre a kiegyenlítő küldött minket. Ez inkonzisztens beállításokhoz vezet az alkalmazásunkhoz, ami problémákat okoz az indítással és a használattal.

Itt egy másik adatbázis fog megmenteni, például a MySQL vagy annak megfelelője. Azt mondjuk Grafanának, hogy tárolja a felhasználói beállításokat ebben a „tartalék” adatbázisban. Utána elég minden gépen egyszer megadni ennek az adatbázisnak az elérési útját, és bármelyik virtuális gépen módosítani az összes többi felhasználói beállítást, ezek kiterjednek a többire is.

Íme a végső alkalmazási infrastruktúra diagramja:

Elosztott szolgáltatások telepítése a Yandex.Cloudban a Grafana példájával

Tanuljunk meg kézzel emelni

MySQL és ClickHouse

Mielőtt egy ilyen alkalmazást egy gombnyomással telepített volna, meg kellett tanulni az egyes összetevők kezelését és egymással való integrálását.

Itt segítségünkre lesz a Yandex.Cloud, amely felügyelt szolgáltatásként biztosítja az L3 egyensúlyozókat, a ClickHouse-t és a MySQL-t. A felhasználónak csak meg kell adnia a paramétereket, és meg kell várnia, amíg a platform mindent működőképessé tesz.

Regisztráltam, létrehoztam egy felhőt és egy fizetési számlát. Ezt követően a felhőbe mentem, és minimális beállításokkal beállítottam a MySQL és a ClickHouse fürtöket. Megvártam míg aktivizálódnak.

Elosztott szolgáltatások telepítése a Yandex.Cloudban a Grafana példájávalElosztott szolgáltatások telepítése a Yandex.Cloudban a Grafana példájával

Ne felejtse el létrehozni egy adatbázist minden fürtben, és be kell állítania a hozzáférést bejelentkezési névvel és jelszóval. Nem megyek bele a részletekbe - minden nyilvánvaló a felületen.

A nem nyilvánvaló részlet az volt, hogy ezeknek az adatbázisoknak sok gazdagépe van, amelyek biztosítják a hibatűrésüket. A Grafana azonban pontosan egy gazdagépet igényel minden egyes adatbázishoz, amellyel működik. Hosszú olvasás dokumentáció A felhők döntésre hoztak. Kiderül, hogy a faj gazdája c-<cluster_id>.rw.mdb.yandexcloud.net leképezve a fürt aktuális aktív főgazdagépére a megfelelő azonosítóval. Ezt adjuk Grafanának.

web szerver

Most a webszerveren múlik. Emeljünk fel egy rendes virtuális gépet Linux alatt, és állítsuk be kézzel a Grafanát.

Elosztott szolgáltatások telepítése a Yandex.Cloudban a Grafana példájával

Elosztott szolgáltatások telepítése a Yandex.Cloudban a Grafana példájával

Csatlakozzunk ssh-n keresztül és telepítsük a szükséges csomagokat.

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 

Ezután futtassuk a Grafanát systemctl alatt, és telepítsük a ClickHouse-szal való munkavégzéshez szükséges plugint (igen, az alapcsomag nem tartalmazza).

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

Ennyi, utána egy egyszerű paranccsal

sudo service grafana-server start

elindítjuk a webszervert. Most megadhatja a virtuális gép külső IP-címét a böngészőben, megadhatja a 3000-es portot, és láthatja a gyönyörű Grafana felhasználói felületet.
Elosztott szolgáltatások telepítése a Yandex.Cloudban a Grafana példájával

De ne rohanjon, a Grafana beállítása előtt meg kell adnia neki a MySQL elérési útját, hogy ott tárolja a beállításokat.

A Grafana webszerver teljes konfigurációja a fájlban található /etc/grafana/grafana.ini. A szükséges sor így néz ki:

;url =

A gazdagépet a MySQL-fürtre állítottuk be. Ugyanez a fájl tartalmazza a fenti képen látható Grafana eléréséhez szükséges bejelentkezési nevet és jelszót, amelyek alapértelmezés szerint egyenlőek admin.

Használhatja a sed parancsokat:

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

Ideje újraindítani a webszervert!

sudo service grafana-server restart

Most a Grafana UI-ban a ClickHouse-t adatforrásként fogjuk megadni.

A következő beállításokkal sikerült működő konfigurációt elérni:

Elosztott szolgáltatások telepítése a Yandex.Cloudban a Grafana példájával

URL-ként adtam meg https://c-<cluster_id>.rw.mdb.yandexcloud.net:8443

Minden! Egy működő virtuális gépünk van CH-hoz és MySQL-hez csatlakoztatott webszerverrel. Már feltöltheti az adatkészletet a ClickHouse-ba, és irányítópultokat készíthet. Célunkat azonban még nem értük el, és nem építettünk ki teljes értékű infrastruktúrát.

csomagoló

A Yandex.Cloud lehetővé teszi egy meglévő virtuális gép lemezképének létrehozását, és ennek alapján - tetszőleges számú, egymással azonos gépről. Pontosan ezt fogjuk használni. A kép kényelmes összeállításához vegye a szerszámot csomagoló a HashiCorp. Bemenetként egy json fájlt használ a kép összeállításához szükséges utasításokkal.

A json-fájlunk két blokkból áll: építőekből és szolgáltatókból. Az első blokk magának a képnek mint entitásnak a paramétereit írja le, a második blokkban pedig a szükséges tartalommal való kitöltésére vonatkozó utasításokat.

építők

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

Ebben a sablonban be kell állítania a felhő azon szakaszának azonosítóját, ahol létre kívánja hozni a képet, valamint a fájl elérési útját az ebben a szakaszban korábban létrehozott szolgáltatásfiók kulcsaival. A szolgáltatásfiókok és kulcsok fájl formájában történő létrehozásáról a megfelelő részben olvashat bővebben dokumentáció.

Ez a konfiguráció azt mondja, hogy a lemezkép a platformon alapul ubuntu-1804-lts, amely a képcsalád megfelelő felhasználói részébe kerül GRAFANA néven grafana-{{timestamp}}.

Ellátók

Most jön a konfiguráció érdekesebb része. Leírja a műveletek sorozatát, amelyeket a virtuális gépen végre kell hajtani, mielőtt az állapotát lemezképbe fagyasztaná.

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

Itt minden művelet 3 szakaszra oszlik. Az első szakaszban egy egyszerű szkriptet hajtanak végre, amely létrehoz egy segédkönyvtárat.

ready-ctg.sh:

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

A következő lépésben ebbe a könyvtárba helyezünk egy szkriptet, amelyet a virtuális gép elindítása után azonnal el kell indítani. Ez a szkript behelyezi a regisztrálandó felhasználói változókat a Grafana konfigurációjába, és újraindítja a webszervert.

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

Ezek után 3 tennivaló van hátra:
1) telepítse a csomagokat
2) Futtassa a Grafana-t a systemctl alatt, és telepítse a ClickHouse bővítményt
3) A virtuális gép bekapcsolása után azonnal helyezze a setup.sh szkriptet az indítási sorba.

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;

Most már csak a Packer futtatása marad, és a kimeneti kép a megadott szakaszba kerül. A virtuális gép létrehozásakor kiválaszthatja indítólemezként, és az indítás után egy kész Grafana webszervert kap.

Elosztott szolgáltatások telepítése a Yandex.Cloudban a Grafana példájával
Elosztott szolgáltatások telepítése a Yandex.Cloudban a Grafana példájával

Példánycsoport és egyensúlyozó

Ha van egy lemezképünk, amely lehetővé teszi számos azonos Grafana webszerver létrehozását, létrehozhatunk egy példánycsoportot. A Yandex.Cloud platformon ez a kifejezés az azonos jellemzőkkel rendelkező virtuális gépek unióját jelenti. Példánycsoport létrehozásakor beállítja a csoport összes gépének prototípusát, majd magának a csoportnak a jellemzőit (például az aktív gépek minimális és maximális számát). Ha az aktuális szám nem felel meg ezeknek a feltételeknek, akkor maga a példánycsoport eltávolítja a szükségtelen gépeket, vagy újakat hoz létre a saját képében.

Feladatunk részeként elkészítjük a webszerverek egy példánycsoportját, amely a korábban létrehozott lemezképből lesz generálva.

Elosztott szolgáltatások telepítése a Yandex.Cloudban a Grafana példájával

Elosztott szolgáltatások telepítése a Yandex.Cloudban a Grafana példájával

Ami igazán figyelemre méltó, az az utolsó példány csoportbeállítása. A Load Balancerrel integrált célcsoport néhány gomb megnyomásával segít egy L3-as kiegyenlítő konfigurálásában a csoport virtuális gépein.

Elosztott szolgáltatások telepítése a Yandex.Cloudban a Grafana példájával

A kiegyenlítő beállításakor két fontos szempontot vettem figyelembe:

  1. A kiegyenlítővel elfogadtam a felhasználói forgalmat a 80-as porton, és átirányítottam a virtuális gépek 3000-es portjára, pontosan ott, ahol a Grafana él.
  2. A 3000-es portra pingelve beállítottam a gépek életképességének ellenőrzését.

Elosztott szolgáltatások telepítése a Yandex.Cloudban a Grafana példájával

Mini összefoglaló

Végül manuálisan tudtuk telepíteni a kívánt alkalmazási infrastruktúrát, és most egy rendkívül rugalmas Grafana szolgáltatásunk van. Csak a kiegyenlítő IP-címét kell ismernie, mint az alkalmazás belépési pontját és a ClickHouse fürt gazdagépét, hogy betölthesse az adatkészletet.

Győzelemnek tűnik? Igen, győzelem. De valami még mindig összezavar. A fenti teljes folyamat sok manuális lépést igényel, és egyáltalán nem méretezhető; szeretném, ha lehetséges, automatizálni. Ennek lesz szentelve a következő rész.

Terraform integráció

Ismét egy HashiCorp nevű eszközt fogunk használni Terraform. Segít a teljes alkalmazás-infrastruktúra egyetlen gombnyomással üzembe helyezésében, a felhasználó által átadott számos változó alapján. Írjunk egy receptet, amely többször is futtatható a különböző felhasználók különböző szekcióiban.

A Terraform-mal végzett minden munka egy konfigurációs fájl (*.tf) és az erre épülő infrastruktúra létrehozása.

Változók

A fájl legelején olyan változókat fogunk tartalmazni, amelyek meghatározzák, hogy a jövőbeni infrastruktúra hol és hogyan kerül telepítésre.

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

A teljes alkalmazástelepítési folyamat egy lemezkép létrehozásán és ezen változók beállításán múlik. Hadd magyarázzam el, miért felelősek:

oauth_token — egy token a felhőhöz való hozzáféréshez. által beszerezhető link.
cloud_id — felhő azonosító, ahol az alkalmazást telepíteni fogjuk
mappa_azonosító — szakaszazonosító, ahol az alkalmazást telepíteni fogjuk
service_account_id — a szolgáltatásfiók azonosítója a felhő megfelelő részében.
image_id — a Packer segítségével kapott lemezkép azonosítója
felhasználónév и jelszó — felhasználónév és jelszó az adatbázisok és a Grafana webszerver eléréséhez
dbname — adatbázis neve a CH és MySQL fürtökön belül
nyilvános_kulcs_útvonal — a fájl elérési útja a nyilvános ssh-kulccsal, amellyel a név alatt csatlakozhat ubuntu webszerverekkel rendelkező virtuális gépekre

Szolgáltató beállítása

Most be kell állítania a Terraform szolgáltatót - esetünkben a Yandexet:

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

Észreveheti, hogy itt a fent definiált változókat használjuk.

Hálózat és klaszterek

Most létrehozunk egy hálózatot, amelyben infrastruktúránk elemei kommunikálnak, három alhálózatot (régiónként egyet), és CH és MySQL klasztereket hozunk létre.


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

Amint látható, a két fürt mindegyike meglehetősen hibatűrő, mivel három rendelkezésre állási zónában található.

Webszerverek

Úgy tűnik, folytathatjuk ugyanabban a szellemben, de nehézségekbe ütköztem. Ezt megelőzően először felemeltem egy MySQL klasztert, majd csak ezt követően, az azonosítójának ismeretében gyűjtöttem össze egy lemezképet a szükséges konfigurációval, ahol megadtam a fürthöz a gazdagépet. Most azonban nem ismerjük a fürtazonosítót a Terraform elindítása előtt, még a kép készítésekor sem. Ezért a következőkhöz kellett folyamodnom trükk.

Az Amazon metaadat szolgáltatásával néhány paramétert átadunk a virtuális gépnek, amit az elfogad és feldolgoz. Szükségünk van arra, hogy a gép indítás után a MySQL-fürt gazdagépe és a felhasználónév-jelszó mögötti metaadatokhoz lépjen, amelyeket a felhasználó a Terraform fájlban adott meg. Változtassuk meg kissé a fájl tartalmát setup.sh, amely a virtuális gép bekapcsolásakor fut.

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 csoport és egyensúlyozó

Új lemezkép újraépítése után végre hozzáadhatjuk a Terraform fájlunkat.

Jelöljük, hogy egy meglévő lemezképet szeretnénk használni:

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

Most hozzunk létre egy példánycsoportot:

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

Érdemes odafigyelni arra, hogyan vittük át a metaadatokba cluster_uri, username и password. Ezeket veszi ki a virtuális gép indításkor, és behelyezi a Grafana konfigurációba.

Az egyensúlyozón múlik.

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

Egy kis cukor

Már csak egy kevés van hátra. Az infrastruktúra üzembe helyezése után fel kell lépnie a Grafana UI-ra, és manuálisan hozzá kell adnia a CH-fürtöt (amelynek azonosítóját még meg kell szerezni) adatforrásként. De a Terraform ismeri a fürtazonosítót. Bízzuk rá a dolog véghezvitelét.

Adjunk hozzá egy új szolgáltatót, a Grafana-t, és adjuk meg neki a kiegyenlítő IP-címét gazdagépként. Minden változtatás, amit a Terraform végrehajt a gépen, ahol a kiegyensúlyozója meghatározza, a MySQL-ben, és így az összes többi gépen is növekedni fog.

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

Fésüljük meg a hajunkat

Jelenítsük meg a Balancer IP-címét és a ClickHouse fürt gazdagépét

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

Tud futni

Minden! A konfigurációs fájlunk készen áll, és a változók beállításával megmondhatjuk a Terraformnak, hogy emelje fel mindazt, amit fent leírtunk. Az egész folyamat körülbelül 15 percig tartott.
A végén egy gyönyörű üzenet látható:

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

A felhőben pedig láthatóak lesznek a megemelt infrastruktúra elemei:

Elosztott szolgáltatások telepítése a Yandex.Cloudban a Grafana példájával

Összefoglalva:

Most, a Grafana példaként, mindegyik telepíthet egy kiterjedt felhőarchitektúrával rendelkező alkalmazásokat a Yandex.Cloud platformon. A HashiCorp olyan hasznos eszközei, mint a Packer és a Terraform segíthetnek ebben. Remélem valaki hasznosnak találja ezt a cikket :)

PS Az alábbiakban csatolok egy linket az adattárhoz, ahol kész recepteket találhat a Packer és a Terraform számára, amelyek töredékeit adtam meg ebben a cikkben.

adattár

Forrás: will.com

Hozzászólás