Дэплой размеркаваных сэрвісаў у Яндэкс.Аблокі на прыкладзе Grafana

Ўсім прывітанне! У рамках курсавой працы я займаўся даследаваннямі магчымасцяў такой айчыннай хмарнай платформы, як Яндэкс.Хмара. Платформа прапануе розныя сэрвісы для вырашэння практычных задач. Аднак часам бывае трэба на аснове гэтых сэрвісаў наладзіць свой хмарнае прыкладанне з досыць разгалістым інфраструктурай. У гэтым артыкуле я хачу падзяліцца вопытам разгорткі такога дадатку.

Дэплой размеркаваных сэрвісаў у Яндэкс.Аблокі на прыкладзе Grafana

Што жадаецца атрымаць?

Графана - Магутны інструмент для вырашэння аналітычных задач або задач маніторынгу якіх-небудзь сістэм. У сваёй базавай камплектацыі гэта віртуальная машына з вэб-серверам Графаны, а таксама база дадзеных (ClickHouse, InfluxDB, etc.) з датасетам, па якім будзе будавацца аналітыка.

Пасля запуску віртуальнай машыны з вэб-серверам можна будзе зайсці на яго хост і атрымаць прыгожы UI, пазначыць базы дадзеных у якасці крыніц для далейшай працы, стварыць дашборды і графікі.

Дэплой размеркаваных сэрвісаў у Яндэкс.Аблокі на прыкладзе Grafana

У базавай версіі ёсць адзін істотны недахоп - яна зусім не адмоваўстойлівая. Гэта значыць уся працаздольнасць прыкладання залежыць ад жыццяздольнасці адной віртуальнай машыны. Калі яна адмовіць ці ж 10 чалавек адначасова адкрыюць UI, то ўзнікнуць праблемы.

Вырашаюцца яны проста: трэба ўсяго толькі… разгарнуць шмат аднолькавых віртуальных машын з вэб-серверам і змясціць іх пад L3-балансар. Але не тут не ўсё так адназначна. Графана захоўвае прыстасаваныя наладкі (шляхі да баз дадзеных, дашборды, графікі і г.д.) прама на дыску сваёй віртуальнай машыны. Такім чынам, калі змяніць нейкія налады ў UI, то гэтыя змены адлюструюцца толькі на той віртуальнай машыне, куды адправіў нас балансар. Гэта прывядзе да некансістэнтных налад нашага прыкладання, узнікнуць праблемы з запускам і выкарыстаннем.

Тут на дапамогу прыйдзе яшчэ адна база дадзеных, напрыклад, MySQL ці яе аналог. Гаворым Графане, што яна павінна захоўваць прыстасаваныя наладкі менавіта ў гэтай "запасны" базе. Пасля дастаткова будзе адзін раз паказаць на кожнай машыне шлях да гэтай БД, а ўсе астатнія карыстацкія налады рэдагаваць на любой з віртуальных машын, яны будуць прарастаць на астатнія.

Вось схема выніковай інфраструктуры прыкладання:

Дэплой размеркаваных сэрвісаў у Яндэкс.Аблокі на прыкладзе Grafana

Навучымся паднімаць рукамі

MySQL і ClickHouse

Перш чым разгортваць такое прыкладанне націскам адной кнопкі, трэба было навучыцца паднімаць ручкамі кожны яго кампанент і інтэграваць іх сябар з сябрам.

Тут нам дапаможа Яндэкс.Хмара, якое дае L3-балансеры, ClickHouse і MySQL у якасці managed-сэрвісаў. Карыстальніку неабходна толькі пазначыць параметры і пачакаць, пакуль платформа прывядзе ўсё ў працаздольны стан.

Я зарэгістраваўся, стварыў сабе воблака і плацежны акаўнт. Пасля гэтага зайшоў у воблака і падняў кластары MySQL і ClickHouse з мінімальнымі наладамі. Дачакаўся, пакуль яны стануць актыўнымі.

Дэплой размеркаваных сэрвісаў у Яндэкс.Аблокі на прыкладзе GrafanaДэплой размеркаваных сэрвісаў у Яндэкс.Аблокі на прыкладзе Grafana

Таксама трэба не забыцца стварыць у кожным кластары базу дадзеных і наладзіць доступ да яе па лагіне і паролю. Удавацца тут у дэталі не буду - у інтэрфейсе ўсё дастаткова відавочна.

Невідавочная дэталь была ў тым, што ў гэтых БД мноства хастоў, якія забяспечваюць іх адмоваўстойлівасць. Аднак Графана патрабуе роўна адзін хост для кожнай БД, з якой яна працуе. Доўгае чытанне дакументацыі Аблокі прывяло мяне да рашэння. Аказваецца, хост віду c-<cluster_id>.rw.mdb.yandexcloud.net маппится ў бягучы актыўны майстар-хост кластара з адпаведным айдзішнікам. Менавіта яго мы і аддамо Графане.

Вэб-сервер

Цяпер справа за вэб-серверам. Паднімем звычайную віртуальную машыну з Linux і рукамі наладзім на ёй Графану.

Дэплой размеркаваных сэрвісаў у Яндэкс.Аблокі на прыкладзе Grafana

Дэплой размеркаваных сэрвісаў у Яндэкс.Аблокі на прыкладзе Grafana

Подлючимся па ssh і ўсталюем неабходныя пакеты.

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 

Пасля гэтага завядзем Графану пад systemctl і ўсталюем убудову для працы з ClickHouse (так, у базавай камплектацыі ён не пастаўляецца).

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

Усё, пасля гэтага простай камандай

sudo service grafana-server start

мы запусцім вэб-сервер. Зараз можна будзе ў браўзэры забіць вонкавы айпишник віртуальнай машыны, паказаць порт 3000 і ўбачыць прыгожы UI графаны.
Дэплой размеркаваных сэрвісаў у Яндэкс.Аблокі на прыкладзе Grafana

Але не варта спяшацца, перш чым наладжваць Графану, трэба не забыцца паказаць ёй шлях да MySQL, каб захоўваць налады там.

Уся канфігурацыя вэб-сервера Графаны ляжыць у файле /etc/grafana/grafana.ini. Патрэбны радок выглядае так:

;url =

Выстаўляем хост да кластара MySQL. У гэтым жа файле знаходзяцца лагін і пароль для доступу да Графана на малюнку вышэй, якія па змаўчанні абодва роўныя admin.

Можна скарыстацца 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

Самы час перазапусціць вэб-сервер!

sudo service grafana-server restart

Зараз у UI Графаны пакажам ClickHouse у якасці DataSource.

Дамагчыся якая працуе канфігурацыі ў мяне атрымалася пры наступных наладах:

Дэплой размеркаваных сэрвісаў у Яндэкс.Аблокі на прыкладзе Grafana

У якасці URL я паказаў https://c-<cluster_id>.rw.mdb.yandexcloud.net:8443

Усё! У нас ёсць адна працаздольная віртуальная машынка з вэб-серверам, падлучаным да CH і MySQL. Ужо можна загружаць датасет у ClickHouse і будаваць дашборды. Аднак мы яшчэ не дасягнулі нашай мэты і не разгарнулі паўнавартасную інфраструктуру.

Ўпакоўшчык

Яндекс.Облако дазваляе стварыць выяву дыска існуючай віртуальнай машыны, а на яго аснове - колькі заўгодна ідэнтычных адзін аднаму машын. Менавіта гэтым мы і скарыстаемся. Каб зручна сабраць выяву, возьмем прыладу Ўпакоўшчык ад HashiCorp. Ён прымае на ўваход json-файл з інструкцыяй па зборцы выявы.

Наш json-файл будзе складацца з двух блокаў: builders і provisioners. Першы блок апісвае параметры самай выявы як сутнасці, а другі - інструкцыю па напаўненні патрэбным змесцівам.

Будаўнікі

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

У гэтым шаблоне трэба выставіць ідэнтыфікатар часткі ў воблаку, дзе вы жадаеце стварыць выяву, а таксама шлях да файла з ключамі ад сэрвіснага акаўнта, папярэдне заведзенага ў гэтай частцы. Падрабязней пра стварэнне сэрвісных акаўнтаў і ключоў у выглядзе файла можна пачытаць у адпаведнай частцы дакументацыі.

Такая канфігурацыя кажа, што выява дыска будзе сабраны на аснове платформы. ubuntu-1804-lts, змешчаны ў адпаведным раздзеле карыстальніка ў сямействе вобразаў GRAFANA пад імем grafana-{{timestamp}}.

Provisioners

Цяпер цікавейшая частка канфігурацыі. У ёй будзе апісана паслядоўнасць дзеянняў, якія трэба будзе здзейсніць на віртуальнай машыне, перш чым замарозіць яе стан у выяву дыска.

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

Тут усе дзеянні падзелены на 3 этапы. На першым этапе выконваецца просценькі скрыпт, які стварае дапаможную дырэкторыю.

prepare-ctg.sh:

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

На наступным этапе ў гэтую дырэкторыю змяшчаем скрыпт, які трэба будзе запусціць адразу пасля запуску віртуальнай машыны. Гэты скрыпт пакладзе карыстацкія зменныя, якія трэба прапісаць, у канфіг Графаны і перазапусціць вэб-сервер.

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

Пасля гэтага засталося зрабіць 3 рэчы:
1) усталяваць пакеты
2) завесці Графану пад systemctl і ўсталяваць убудову ClickHouse
3) пакласці скрыпт setup.sh у чарзе на запуск адразу пасля ўключэння віртуальнай машыны.

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;

Зараз застаецца запусціць Packer і на вынахадзе атрымаць выяву, змешчаны ў паказанай частцы. Пры стварэнні віртуальнай машыны можна абраць яго ў якасці загрузнай кружэлкі і пасля запуску атрымаць гатовы вэб-сервер Графаны.

Дэплой размеркаваных сэрвісаў у Яндэкс.Аблокі на прыкладзе Grafana
Дэплой размеркаваных сэрвісаў у Яндэкс.Аблокі на прыкладзе Grafana

Інстанс-група і балансер

Пасля таго, як з'явілася выява дыска, які дазваляе ствараць мноства аднолькавых вэб-сервераў Графаны, мы можам стварыць інстанс-групу. На платформе Яндэкс.Хмара гэтым тэрмінам называецца аб'яднанне віртуальных машын, якія маюць аднолькавыя характарыстыкі. Пры стварэнні інстанс-групы канфігуруецца прататып усіх машын у гэтай групе, а потым і характарыстыкі самой групы (напрыклад, мінімальная і максімальная колькасць актыўных машын). Калі бягучая колькасць будзе не адпавядаць гэтым крытэрам, то інстанс-група сама выдаліць непатрэбныя машыны або створыць новыя па выяве і падабенству.

У рамках нашай задачы мы створым інстанс-групу вэб-сервераў, якія будуць спараджацца са створанай раней выявы дыска.

Дэплой размеркаваных сэрвісаў у Яндэкс.Аблокі на прыкладзе Grafana

Дэплой размеркаваных сэрвісаў у Яндэкс.Аблокі на прыкладзе Grafana

Па-сапраўднаму характэрна апошняя настройка інстанс-групы. Мэтавая група ў інтэграцыі з Load Balancer дапаможа націскам пары кнопак наладзіць L3-балансар па-над віртуальнымі машынамі гэтай групы.

Дэплой размеркаваных сэрвісаў у Яндэкс.Аблокі на прыкладзе Grafana

Пры наладзе балансара я рэалізаваў два важныя моманты:

  1. Зрабіў так, каб балансар прымаў карыстацкі трафік на 80 порце, а перанакіроўваў яго на 3000 порт віртуальных машын, як раз туды, дзе жыве Графана.
  2. Наладзіў праверку жыццяздольнасці машын, пінгуючы іх у 3000 порт.

Дэплой размеркаваных сэрвісаў у Яндэкс.Аблокі на прыкладзе Grafana

Міні-вынік

Нарэшце мы змаглі рукамі разгарнуць жаданую інфраструктуру прыкладання, і зараз у нас ёсць высокаўстойлівы сэрвіс Grafana. Неабходна толькі ведаць IP-адрас балансера як кропку ўваходу ў дадатак і хост кластара ClickHouse, каб загрузіць у яго датасет.

Здавалася б, перамога? Так, перамога. Але нешта ўсё ж такі бянтэжыць. Увесь працэс вышэй патрабуе вельмі шмат ручных дзеянняў і зусім не маштабуецца, жадаецца яго па магчымасці аўтаматызаваць. Гэтаму і будзе прысвечаны наступны раздзел.

Інтэграцыя з Terraform

Мы зноў скарыстаемся інструментам ад кампаніі HashiCorp па імені Terraform. Ён дапаможа націскам кнопкі разгортваць усю інфраструктуру прыкладання, засноўваючыся на некалькіх зменных, перададзеных карыстачом. Давайце напішам рэцэпт, які можна будзе запускаць шматкроць у розных раздзелах розных карыстальнікаў.

Уся праца з Тэраформам зводзіцца да напісання канфігурацыйнага файла (*.tf) і стварэнню інфраструктуры на яго аснове.

зменныя

У самае пачаткі файла вынесем зменныя, ад якіх залежыць, дзе і як будзе разгорнутая будучая інфраструктура.

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

Увесь працэс разгорткі прыкладання звядзецца да зборкі выявы дыска і выстаўленню гэтых зменных. Патлумачу, завошта яны адказваюць:

oauth_token - токен для доступу да воблака. Можна атрымаць па спасылцы.
cloud_id - Ідэнтыфікатар аблокі, дзе будзем разгортваць прыкладанне
тэчка_id - Ідэнтыфікатар падзелу, дзе будзем разгортваць дадатак
service_account_id - Ідэнтыфікатар сэрвіснага акаўнта ў адпаведным раздзеле аблокі.
image_id - ідэнтыфікатар выявы дыска, атрыманага з дапамогай Packer
імя карыстальніка и пароль - імя карыстальніка і пароль для доступу да абедзвюх баз дадзеных і вэб-серверу Графаны
dbname - імя базы дадзеных усярэдзіне кластараў CH і MySQL
public_key_path - шлях да файла з вашым публічным ssh-ключом, па якім можна будзе падлучацца пад імем ubuntu да віртуальных машын з вэб-серверамі

Настройка правайдэра

Цяпер трэба наладзіць правайдэр Тэраформа - у нашым выпадку Яндэкс:

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

Можна заўважыць, што тут мы выкарыстоўваем зменныя, зададзеныя вышэй.

Сетка і кластары

Цяпер створым сетку, у якой будуць мець зносіны элементы нашай інфраструктуры, тры падсеткі (па адной у кожным рэгіёне) і паднімем кластары 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
  }
}

Як можна заўважыць, кожны з двух кластараў створаны досыць адмоваўстойлівым за кошт размяшчэння ў трох зонах даступнасці.

Вэб-серверы

Здавалася б, можна працягваць у тым жа духу, але я сутыкнуўся са складанасцю. Да гэтага я спачатку паднімаў MySQL кластар і толькі пасля гэтага, ведаючы яго ID, збіраў выяву дыска з патрэбнай канфігурацыяй, дзе паказваў хост да кластара. Але зараз мы не ведаем ID кластара да запуску Тэраформа, у тым ліку і на момант зборкі выявы. Таму прыйшлося звярнуцца да наступнага труку.

Выкарыстоўваючы сэрвіс метададзеных ад Amazon, мы перадамо ў віртуальную машыну некаторыя параметры, якія яна прыме і апрацуе. Нам неабходна, каб пасля запуску машына схадзіла ў метададзеныя за хастом MySQL кластара і за username-password, якія карыстач паказваў у файле Terraform. Нязначна зменім змесціва файла setup.sh, які запускаецца пры ўключэнні віртуальнай машыны.

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

Інтанс-група і балансер

Перабраўшы новую выяву дыска, мы можам нарэшце дапісаць наш файл для Тэраформа.

Пакажам, што мы жадаем выкарыстаць існую выяву дыска:

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

Цяпер створым інстанс-групу:

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

Варта звярнуць увагу, як мы перадалі ў метадату cluster_uri, username и password. Менавіта іх віртуальная машына пры запуску дастане і пакладзе ў канфіг Графаны.

Справа за балансерам.

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

Трохі цукру

Засталася самая драбніца. Пасля таго, як інфраструктура разгорнецца, давядзецца схадзіць у UI Графаны і рукамі дадаць кластар CH (ID якога трэба яшчэ здабыць) як Data Source. Але ж ID кластара ведае Тэраформ. Даручым яму давесці справу да розуму.

Дадамо новага правайдэра — Графану, а ў якасці хаста падсунем ёй айпішнік балансера. Усе змены, якія зробіць Тэраформ на машыне, куды вызначыць яго балансер, прарастуць у MySQL, а значыць і на ўсе астатнія машыны.

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

Прычэшам

Вывядзем айпішнік балансера і хост кластара 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"
}

Можна запускаць

Усё! Наш канфігурацыйны файл гатовы і можна, выставіўшы зменныя, сказаць Тэраформу падняць усё, што мы апісалі вышэй. Увесь працэс у мяне заняў каля 15 хвілін.
У канцы можна ўбачыць прыгожае паведамленне:

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

А ў воблаку будуць бачныя элементы паднятай інфраструктуры:

Дэплой размеркаваных сэрвісаў у Яндэкс.Аблокі на прыкладзе Grafana

Падвядзем вынікі

Зараз на прыкладзе Графаны кожны з вас умее разгортваць прыкладанні з развесістай хмарнай архітэктурай на платформе Яндэкс.Хмара. У гэтым могуць дапамагчы такія карысныя прылады ад HashiCorp, як Packer і Terraform. Спадзяюся, каму-небудзь гэты артыкул апынецца карысным 🙂

PS Ніжэй прыкладу спасылачку на рэпазітар, у якім можна знайсці гатовыя рэцэпты для Пакера і Тэраформа, фрагменты якіх я прыводзіў у гэтым артыкуле.

Рэпазітар

Крыніца: habr.com

Дадаць каментар