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 ZÀit fir de Webserver. Loosst eis eng normal virtuell Maschinn opstellen mat Linux an mir wÀerten Grafana mat eisen HÀnn drop opstellen.

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

Kaaft zouverlĂ€sseg Hosting fir Site mat DDoS Schutz, VPS VDS Server đŸ”„ Kaaft zouverlĂ©issegt WebsĂ€ithosting mat DDoS-Schutz, VPS VDS Server | ProHoster