Deployment of distributed services in Yandex.Cloud benotzt Grafana als Beispill

Moien alleguer! Als Deel vu menger Coursaarbecht hunn ech d'Fähigkeiten vun esou enger Haus Cloud Plattform wéi Yandex.Cloud. D'Plattform bitt verschidde Servicer fir praktesch Problemer ze léisen. Wéi och ëmmer, heiansdo musst Dir Är eege Cloud-Applikatioun mat enger zimlech extensiv Infrastruktur opbauen op Basis vun dëse Servicer. An dësem Artikel wëll ech meng Erfahrung deelen beim Ofbau vun esou enger Applikatioun.

Deployment of distributed services in Yandex.Cloud benotzt Grafana als Beispill

Wat wëllt Dir kréien?

grafana - e mächtegt Tool fir analytesch Probleemer ze léisen oder Probleemer vun all System ze iwwerwaachen. A senger Basiskonfiguratioun ass dëst eng virtuell Maschinn mat engem Grafana Webserver, souwéi eng Datebank (ClickHouse, InfluxDB, asw.) mat engem Dataset op deem d'Analyse baséiert.

Nodeems Dir eng virtuell Maschinn mat engem Webserver lancéiert hutt, kënnt Dir op säi Host goen an e schéine UI kréien, Datenbanken als Quelle fir weider Aarbecht spezifizéieren, Dashboards a Grafike erstellen.

Deployment of distributed services in Yandex.Cloud benotzt Grafana als Beispill

Der Basis Versioun huet e groussen Nodeel - et ass guer net Feeler-tolerant. Dat ass, déi ganz Funktionalitéit vun der Applikatioun hänkt vun der Viabilitéit vun enger virtueller Maschinn of. Wann et refuséiert oder 10 Leit d'UI zur selwechter Zäit opmaachen, da komme Problemer.

Si kënnen einfach geléist ginn: Dir musst just ... vill identesch virtuell Maschinnen mat engem Webserver ofsetzen an se ënner engem L3 Balancer setzen. Awer net alles ass hei sou kloer. Grafana späichert d'Benotzer Astellunge (Weeër zu Datenbanken, Dashboards, Grafiken, etc.) direkt op der Scheif vu senger virtueller Maschinn. Also, wa mir e puer Astellungen an der UI änneren, ginn dës Ännerungen nëmmen op der virtueller Maschinn reflektéiert wou de Balancer eis geschéckt huet. Dëst wäert zu inkonsistente Astellunge fir eis Applikatioun féieren, wat Problemer mam Start a Gebrauch verursaacht.

Hei kënnt eng aner Datebank zur Rettung, zum Beispill MySQL oder seng Äquivalent. Mir soen Grafana datt si Benotzer Astellungen an dëser "Ersatzspiller" Datebank späichere soll. Duerno ass et genuch fir de Wee zu dëser Datebank eemol op all Maschinn ze spezifizéieren, an all aner Benotzer-Astellungen op eng vun de virtuelle Maschinnen z'änneren; si ginn op déi aner verlängert.

Hei ass en Diagramm vun der definitiver Applikatiounsinfrastruktur:

Deployment of distributed services in Yandex.Cloud benotzt Grafana als Beispill

Loosst eis léieren mat eisen Hänn opzehiewen

MySQL a ClickHouse

Ier Dir esou eng Applikatioun mat engem Klick op de Knäppchen deployéiert, war et néideg ze léieren wéi ee vu senge Komponenten handelt an se mateneen integréiert.

Hei hëlleft Yandex.Cloud eis, déi L3 Balancer, ClickHouse a MySQL als verwaltete Servicer ubitt. De Benotzer brauch nëmmen d'Parameteren ze spezifizéieren a waart bis d'Plattform alles an d'Aarbechtsplaz bréngt.

Ech hunn mech ugemellt, eng Wollek an e Bezuelkonto erstallt. Duerno sinn ech an d'Wollek gaang an hunn MySQL a ClickHouse Cluster mat minimalen Astellungen opgestallt. Ech hunn gewaart bis se aktiv ginn.

Deployment of distributed services in Yandex.Cloud benotzt Grafana als BeispillDeployment of distributed services in Yandex.Cloud benotzt Grafana als Beispill

Dir musst och drun erënneren datt Dir eng Datebank an all Stärekoup erstellt an den Zougang dozou konfiguréiert mat engem Login a Passwuert. Ech ginn net an Detailer hei - alles ass ganz offensichtlech an der Interface.

Den net offensichtlechen Detail war datt dës Datenbanken vill Hosten hunn, déi hir Feeler Toleranz garantéieren. Wéi och ëmmer, Grafana erfuerdert genau een Host fir all Datebank mat deem se funktionnéiert. Laang liesen Dokumentatioun D'Wolleken hunn mech zu enger Entscheedung bruecht. Et stellt sech eraus datt de Host vun der Spezies c-<cluster_id>.rw.mdb.yandexcloud.net op den aktuellen aktive Masterhost vum Cluster mat der entspriechender ID kartéiert. Dëst ass wat mir Grafana ginn.

Webserver

Elo ass et un de Webserver. Loosst eis eng regulär virtuell Maschinn mat Linux erhéijen an Grafana manuell konfiguréieren.

Deployment of distributed services in Yandex.Cloud benotzt Grafana als Beispill

Deployment of distributed services in Yandex.Cloud benotzt Grafana als Beispill

Loosst eis iwwer ssh verbannen an déi néideg Packagen installéieren.

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 

Duerno, loosst eis Grafana ënner systemctl lafen an de Plugin installéieren fir mat ClickHouse ze schaffen (jo, et gëtt net am Basispaket geliwwert).

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

Dat ass et, duerno mat engem einfachen Kommando

sudo service grafana-server start

mir starten de Webserver. Elo kënnt Dir déi extern IP Adress vun der virtueller Maschinn am Browser aginn, port 3000 spezifizéieren an de schéine Grafana UI gesinn.
Deployment of distributed services in Yandex.Cloud benotzt Grafana als Beispill

Awer net presséiert, ier Dir Grafana opstellt, musst Dir drun erënneren et de Wee op MySQL ze soen fir d'Astellungen do ze späicheren.

Déi ganz Konfiguratioun vum Grafana Webserver ass an der Datei /etc/grafana/grafana.ini. Déi erfuerderlech Linn gesäit esou aus:

;url =

Mir setzen den Host op de MySQL Cluster. Déi selwecht Datei enthält de Login a Passwuert fir Zougang zu Grafana am Bild hei uewen, déi als Standard allebéid gläich sinn admin.

Dir kënnt sed Kommandoen benotzen:

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

Et ass Zäit de Webserver nei ze starten!

sudo service grafana-server restart

Elo an der Grafana UI spezifizéiere mir ClickHouse als DataSource.

Ech konnt eng Aarbechtskonfiguratioun mat de folgenden Astellungen erreechen:

Deployment of distributed services in Yandex.Cloud benotzt Grafana als Beispill

Ech uginn als URL https://c-<cluster_id>.rw.mdb.yandexcloud.net:8443

Alles! Mir hunn eng funktionéierend virtuell Maschinn mat engem Webserver verbonne mat CH a MySQL. Dir kënnt d'Dateset schonn op ClickHouse eroplueden an Dashboards bauen. Mir hunn eist Zil awer nach net erreecht an hunn keng vollwäerteg Infrastruktur agesat.

Packer

Yandex.Cloud erlaabt Iech e Scheifbild vun enger existéierender virtueller Maschinn ze kreéieren, an op senger Basis - all Zuel vu Maschinnen identesch mateneen. Dëst ass genau wat mir wäerte benotzen. Fir d'Bild bequem ze sammelen, huelt de Tool Packer vun HashiCorp. Et hëlt als Input eng json Datei mat Instruktioune fir d'Bild ze montéieren.

Eis json Datei besteet aus zwee Blocken: Builder a Provisioner. Den éischte Block beschreift d'Parameter vum Bild selwer als Entitéit, an den zweete Block beschreift d'Instruktioune fir et mat dem néidegen Inhalt ze fëllen.

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

An dëser Schabloun musst Dir den Identifizéierer vun der Sektioun an der Wollek setzen, wou Dir d'Bild erstellen wëllt, wéi och de Wee fir d'Datei mat de Schlësselen aus dem Servicekonto, dee virdrun an dëser Sektioun erstallt gouf. Dir kënnt méi iwwer d'Erstelle vu Servicekonten a Schlësselen a Form vun enger Datei an der entspriechender Rubrik liesen Dokumentatioun.

Dës Konfiguratioun seet datt d'Disk Image baséiert op der Plattform gebaut gëtt ubuntu-1804-lts, an der entspriechender Benotzersektioun an der Bildfamill gesat GRAFANA ënner dem Numm grafana-{{timestamp}}.

Provisoren

Elo kënnt de méi interessanten Deel vun der Konfiguratioun. Et wäert d'Sequenz vun Aktiounen beschreiwen, déi op der virtueller Maschinn ausgeführt musse ginn ier se säin Zoustand an e Scheifbild afréieren.

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

Hei sinn all Aktiounen an 3 Etappen opgedeelt. Op der éischter Etapp gëtt en einfache Skript ausgefouert deen en Hilfsverzeechnes erstellt.

preparéieren-ctg.sh:

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

Op der nächster Stuf setzen mir e Skript an dësem Verzeichnis, deen direkt no der Start vun der virtueller Maschinn lancéiert muss ginn. Dëse Skript wäert d'Benotzervariablen setzen déi an der Grafana Konfiguratioun registréiert musse ginn an de Webserver nei starten.

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

Duerno bleiwen nach 3 Saachen ze maachen:
1) Packagen installéieren
2) lafen Grafana ënner systemctl an installéiert de ClickHouse Plugin
3) setzt de setup.sh Skript an der Startschlaang direkt nodeems Dir d'virtuell Maschinn aktivéiert.

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;

Elo bleift alles fir Packer ze lafen an d'Ausgabbild an der spezifizéierter Sektioun ze kréien. Wann Dir eng virtuell Maschinn erstellt, kënnt Dir se als Bootdisk auswielen an nom Start kritt Dir e fäerdege Grafana Webserver.

Deployment of distributed services in Yandex.Cloud benotzt Grafana als Beispill
Deployment of distributed services in Yandex.Cloud benotzt Grafana als Beispill

Instanz Grupp a Balancer

Wann mir en Disk Image hunn, deen eis erlaabt vill identesch Grafana Webserver ze kreéieren, kënne mir eng Instanzgrupp erstellen. Op der Yandex.Cloud Plattform bezitt dëse Begrëff op d'Gewerkschaft vu virtuelle Maschinnen, déi déiselwecht Charakteristiken hunn. Wann Dir eng Instanzgrupp erstellt, gëtt de Prototyp vun alle Maschinnen an dëser Grupp konfiguréiert, an dann d'Charakteristike vun der Grupp selwer (zum Beispill d'Mindest- a Maximalzuel vun aktive Maschinnen). Wann déi aktuell Zuel dës Critèren net entsprécht, da wäert d'Instanzgrupp selwer onnéideg Maschinnen ewechhuelen oder nei a sengem eegene Bild erstellen.

Als Deel vun eiser Aufgab wäerte mir eng Instanzgrupp vu Webserver erstellen, déi aus dem virdru erstallte Disk Image generéiert ginn.

Deployment of distributed services in Yandex.Cloud benotzt Grafana als Beispill

Deployment of distributed services in Yandex.Cloud benotzt Grafana als Beispill

Wat wierklech bemierkenswäert ass ass déi lescht Instanz Grupp Setup. D'Zilgrupp an der Integratioun mam Load Balancer hëlleft Iech fir e L3 Balancer uewen op de virtuelle Maschinnen vun dëser Grupp ze konfiguréieren andeems Dir e puer Knäppercher klickt.

Deployment of distributed services in Yandex.Cloud benotzt Grafana als Beispill

Beim Astellung vum Balancer hunn ech zwee wichteg Punkten ëmgesat:

  1. Ech hunn de Balancer de Benotzerverkéier um Hafen 80 akzeptéiert an et op den Hafen 3000 vun de virtuelle Maschinnen ëmgeleet, genau wou Grafana wunnt.
  2. Ech hunn opgestallt d'Viabilitéit vu Maschinnen ze kontrolléieren andeems se se op den Hafen 3000 pingelen.

Deployment of distributed services in Yandex.Cloud benotzt Grafana als Beispill

Mini Resumé

Schlussendlech konnte mir déi gewënscht Applikatiounsinfrastruktur manuell ofsetzen, an elo hu mir en héich elastesche Grafana Service. Dir braucht nëmmen d'IP Adress vum Balancer ze kennen als Entrée fir d'Applikatioun an den Host vum ClickHouse Cluster fir d'Dateset an et ze lueden.

Et géif schéngen wéi eng Victoire? Jo, Victoire. Mee eppes duercherneen mech nach. De ganze Prozess hei uewen erfuerdert vill manuell Schrëtt an ass guer net skalierbar; Ech wéilt et automatiséieren wa méiglech. Dëst ass wat déi nächst Sektioun gewidmet ass.

Terraform Integratioun

Mir wäerten erëm en Outil vun HashiCorp benotzen genannt Terraform. Et hëlleft Iech déi ganz Applikatiounsinfrastruktur mat engem Klick op e Knäppchen z'installéieren, baséiert op verschidde Variabelen, déi vum Benotzer passéiert sinn. Loosst eis e Rezept schreiwen dat e puer Mol a verschiddene Sektioune vu verschiddene Benotzer ka lafen.

All Aarbecht mat Terraform geet erof op d'Schreiwen vun enger Konfiguratiounsdatei (*.tf) an d'Schafe vun Infrastrukturen op der Basis.

Verännerlechen

Ganz am Ufank vum Fichier wäerte mir Variablen enthalen déi bestëmmen wou a wéi déi zukünfteg Infrastruktur agesat gëtt.

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

De ganze Applikatiouns-Deploymentprozess wäert erofgoen fir en Disk Image ze bauen an dës Variablen ze setzen. Loosst mech erkläre fir wat se verantwortlech sinn:

oauth_token - en Token fir Zougang zu der Wollek. Kann duerch kritt ginn Link.
cloud_id - Cloud Identifizéierer wou mir d'Applikatioun ofsetzen
folder_id - Sektioun Identifizéierer wou mir d'Applikatioun ofsetzen
service_account_id - Service Account Identifizéierer an der entspriechender Sektioun vun der Wollek.
image_id - Identifizéierer vum Disk Image kritt mat Packer
Benotzernumm и Passwuert - Benotzernumm a Passwuert fir Zougang zu béid Datenbanken an de Grafana Webserver
dbnumm - Datebank Numm bannent CH a MySQL Cluster
public_key_path - Wee op d'Datei mat Ärem ëffentleche ssh Schlëssel, deen Dir benotze kënnt fir ënner dem Numm ze verbannen ubuntu zu virtuelle Maschinnen mat Webserver

Provider Setup

Elo musst Dir den Terraform Provider konfiguréieren - an eisem Fall, Yandex:

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

Dir wäert feststellen datt hei mir d'Variabelen benotzen déi hei uewen definéiert sinn.

Netzwierk a Stärekéip

Elo wäerte mir en Netz erstellen an deem Elementer vun eiser Infrastruktur kommunizéieren, dräi Subnets (een an all Regioun) an CH an MySQL Cluster erhéijen.


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

Wéi Dir kënnt gesinn, ass jidderee vun deenen zwee Stärekéip zimmlech Feelertolerant erstallt andeems se an dräi Disponibilitéitszonen lokaliséiert sinn.

Web Serveren

Et géif schéngen datt mir am selwechte Geescht weiderfuere kënnen, awer ech sinn a Schwieregkeeten gerannt. Virun dësem hunn ech fir d'éischt e MySQL Cluster opgeworf an eréischt duerno, well ech seng ID kennen, hunn ech e Disk Image mat der erfuerderter Konfiguratioun gesammelt, wou ech den Host an de Cluster spezifizéiert hunn. Awer elo kennen mir d'Cluster ID net ier Dir Terraform lancéiert, och zum Zäitpunkt vum Bau vum Bild. Dofir hunn ech missen op déi folgend zréckgräifen trick.

Mat Amazon's Metadatenservice benotze mir e puer Parameteren un déi virtuell Maschinn, déi se akzeptéiert a veraarbecht. Mir brauchen d'Maschinn fir op d'Metadaten hannert dem MySQL Clusterhost a Benotzernumm-Passwuert ze goen, wat de Benotzer an der Terraform-Datei spezifizéiert huet, nom Start. Loosst eis den Inhalt vun der Datei liicht änneren setup.sh, déi leeft wann déi virtuell Maschinn ageschalt ass.

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

Intanz Grupp a Balancer

Nodeems mir en neit Disk Image nei opgebaut hunn, kënne mir endlech eis Datei fir Terraform derbäisetzen.

Loosst eis uginn datt mir en existent Disk Image benotze wëllen:

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

Loosst eis elo eng Instanzgrupp erstellen:

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

Et ass derwäert opmierksam ze maachen wéi mir et an d'Metadaten iwwerginn hunn cluster_uri, username и password. Et ass dës déi d'virtuell Maschinn beim Start eraushëlt an an d'Grafana Config setzt.

Et ass un 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
      }
    }
  }
}

E bësse Zocker

Et bleift nëmmen e bëssen. Nodeems d'Infrastruktur ofgesat ass, musst Dir op d'Grafana UI goen an den CH Cluster manuell addéieren (d'ID vun deem nach ëmmer kritt muss ginn) als Datenquell. Awer Terraform weess de Cluster ID. Loosst eis him uvertraut d'Saach op d'Been ze bréngen.

Loosst eis en neie Provider addéieren - Grafana, a gitt hir d'IP Adress vum Balancer als Host. All Ännerungen déi Terraform op der Maschinn mécht, wou säi Balancer bestëmmt, wäerten am MySQL wuessen, an dofir op all aner Maschinnen.

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

Komm mir kämmen eis Hoer

Loosst eis d'Balancer IP Adress an den Host vum ClickHouse Cluster weisen

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

Dir kënnt lafen

Alles! Eis Konfiguratiounsdatei ass prett a mir kënnen, andeems Dir d'Variabelen setzt, Terraform soen fir alles z'erhéijen wat mir hei uewen beschriwwen hunn. De ganze Prozess huet mech ongeféier 15 Minutten gedauert.
Um Enn kënnt Dir e schéine Message gesinn:

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

An an der Wollek wäerten Elementer vun der opgehuewe Infrastruktur siichtbar sinn:

Deployment of distributed services in Yandex.Cloud benotzt Grafana als Beispill

Loosst eis d'Resultater summen

Elo, mat Grafana als Beispill, kann jidderee vun iech Uwendungen mat enger verbreeter Cloudarchitektur op der Yandex.Cloud Plattform ofsetzen. Nëtzlech Tools vun HashiCorp wéi Packer an Terraform kënnen Iech mat dësem hëllefen. Ech hoffen, datt een dësen Artikel nëtzlech fënnt :)

PS Hei drënner wäert ech e Link op de Repository befestegt wou Dir fäerdeg Rezepter fir Packer an Terraform fannt, Fragmenter vun deenen ech an dësem Artikel geliwwert hunn.

repository

Source: will.com

Setzt e Commentaire