Misol tariqasida Grafana-dan foydalangan holda Yandex.Cloud-da taqsimlangan xizmatlarni joylashtirish

Hammaga salom! Kurs ishimning bir qismi sifatida men mahalliy bulutli platformaning imkoniyatlarini o'rganib chiqdim Yandex.Cloud. Platforma amaliy muammolarni hal qilish uchun turli xizmatlarni taklif etadi. Biroq, ba'zida siz ushbu xizmatlarga asoslangan juda keng infratuzilmaga ega bo'lgan o'zingizning bulutli ilovangizni o'rnatishingiz kerak bo'ladi. Ushbu maqolada men bunday dasturni joylashtirish bo'yicha tajribam bilan o'rtoqlashmoqchiman.

Misol tariqasida Grafana-dan foydalangan holda Yandex.Cloud-da taqsimlangan xizmatlarni joylashtirish

Siz nimani olishni xohlaysiz?

grafana — har qanday tizimning tahliliy muammolarini yoki monitoring muammolarini hal qilish uchun kuchli vosita. Uning asosiy konfiguratsiyasida bu Grafana veb-serveriga ega virtual mashina, shuningdek, ma'lumotlar bazasi (ClickHouse, InfluxDB va boshqalar) bo'lib, unda tahlillar asoslanadi.

Virtual mashinani veb-server bilan ishga tushirgandan so'ng, siz uning xostiga borishingiz va chiroyli UI olishingiz, keyingi ish uchun manba sifatida ma'lumotlar bazalarini belgilashingiz, asboblar paneli va grafiklarni yaratishingiz mumkin.

Misol tariqasida Grafana-dan foydalangan holda Yandex.Cloud-da taqsimlangan xizmatlarni joylashtirish

Asosiy versiyada bitta muhim kamchilik bor - u umuman nosozliklarga chidamli emas. Ya'ni, dasturning butun funksionalligi bitta virtual mashinaning hayotiyligiga bog'liq. Agar u rad etsa yoki bir vaqtning o'zida 10 kishi foydalanuvchi interfeysini ochsa, muammolar paydo bo'ladi.

Ularni oddiygina hal qilish mumkin: siz shunchaki... veb-server bilan bir xil virtual mashinalarni joylashtirishingiz va ularni L3 balanslagichi ostiga joylashtirishingiz kerak. Ammo bu erda hamma narsa unchalik aniq emas. Grafana foydalanuvchi sozlamalarini (ma'lumotlar bazasiga yo'llar, asboblar paneli, grafiklar va boshqalar) bevosita o'zining virtual mashinasi diskida saqlaydi. Shunday qilib, agar biz foydalanuvchi interfeysidagi ba'zi sozlamalarni o'zgartirsak, bu o'zgarishlar faqat balanschi bizga yuborgan virtual mashinada aks etadi. Bu bizning ilovamiz uchun mos kelmaydigan sozlamalarga olib keladi va ishga tushirish va foydalanish bilan bog'liq muammolarni keltirib chiqaradi.

Bu erda boshqa ma'lumotlar bazasi yordamga keladi, masalan, MySQL yoki uning ekvivalenti. Biz Grafanaga foydalanuvchi sozlamalarini ushbu "zaxira" ma'lumotlar bazasida saqlashi kerakligini aytamiz. Keyinchalik, ushbu ma'lumotlar bazasiga yo'lni har bir mashinada bir marta ko'rsatish va boshqa barcha foydalanuvchi sozlamalarini virtual mashinalardan birida tahrirlash kifoya qiladi; ular boshqalarga ham tarqaladi.

Mana, yakuniy dastur infratuzilmasining diagrammasi:

Misol tariqasida Grafana-dan foydalangan holda Yandex.Cloud-da taqsimlangan xizmatlarni joylashtirish

Keling, qo'llarimiz bilan ko'tarishni o'rganaylik

MySQL va ClickHouse

Bir tugmani bosish bilan bunday dasturni joylashtirishdan oldin, uning har bir komponentini boshqarish va ularni bir-biri bilan birlashtirishni o'rganish kerak edi.

Bu erda Yandex.Cloud bizga yordam beradi, u L3 balanslagichlari, ClickHouse va MySQL-ni boshqariladigan xizmatlar sifatida taqdim etadi. Foydalanuvchi faqat parametrlarni ko'rsatishi va platforma hamma narsani ish tartibiga keltirguncha kutishi kerak.

Men ro'yxatdan o'tdim, bulut va to'lov hisobini yaratdim. Shundan so'ng, men bulutga o'tdim va minimal sozlamalar bilan MySQL va ClickHouse klasterlarini o'rnatdim. Ular faollashguncha kutdim.

Misol tariqasida Grafana-dan foydalangan holda Yandex.Cloud-da taqsimlangan xizmatlarni joylashtirishMisol tariqasida Grafana-dan foydalangan holda Yandex.Cloud-da taqsimlangan xizmatlarni joylashtirish

Bundan tashqari, har bir klasterda ma'lumotlar bazasini yaratish va login va parol yordamida unga kirishni sozlashni unutmasligingiz kerak. Men bu erda tafsilotlarga kirmayman - interfeysda hamma narsa aniq.

Aniq bo'lmagan tafsilot shundaki, bu ma'lumotlar bazalarida xatolarga chidamliligini ta'minlaydigan ko'plab xostlar mavjud. Biroq, Grafana ishlaydigan har bir ma'lumotlar bazasi uchun bitta xostni talab qiladi. Uzoq o'qish hujjatlar Bulutlar meni bir qarorga keltirdi. Ma'lum bo'lishicha, turning uy egasi c-<cluster_id>.rw.mdb.yandexcloud.net mos identifikatorga ega klasterning joriy faol asosiy xostiga ko'rsatilgan. Bu biz Grafanaga beramiz.

veb-server

Endi bu veb-serverga bog'liq. Keling, Linux bilan oddiy virtual mashinani yarataylik va Grafana-ni qo'lda sozlaymiz.

Misol tariqasida Grafana-dan foydalangan holda Yandex.Cloud-da taqsimlangan xizmatlarni joylashtirish

Misol tariqasida Grafana-dan foydalangan holda Yandex.Cloud-da taqsimlangan xizmatlarni joylashtirish

Keling, ssh orqali ulanamiz va kerakli paketlarni o'rnatamiz.

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 

Shundan so'ng, Grafana-ni systemctl ostida ishga tushiramiz va ClickHouse bilan ishlash uchun plaginni o'rnatamiz (ha, u asosiy paketda mavjud emas).

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

Hammasi shu, keyin oddiy buyruq bilan

sudo service grafana-server start

veb-serverni ishga tushiramiz. Endi siz brauzerda virtual mashinaning tashqi IP-manzilini kiritishingiz, 3000-portni ko'rsatishingiz va chiroyli Grafana UI-ni ko'rishingiz mumkin.
Misol tariqasida Grafana-dan foydalangan holda Yandex.Cloud-da taqsimlangan xizmatlarni joylashtirish

Ammo shoshmang, Grafana-ni o'rnatishdan oldin, sozlamalarni u erda saqlash uchun MySQL-ga yo'lni aytib berishni unutmang.

Grafana veb-serverining butun konfiguratsiyasi faylda /etc/grafana/grafana.ini. Kerakli qator quyidagicha ko'rinadi:

;url =

Biz xostni MySQL klasteriga o'rnatdik. Xuddi shu fayl yuqoridagi rasmda Grafana-ga kirish uchun login va parolni o'z ichiga oladi, sukut bo'yicha ikkalasi ham tengdir admin.

Siz sed buyruqlaridan foydalanishingiz mumkin:

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

Veb-serverni qayta ishga tushirish vaqti keldi!

sudo service grafana-server restart

Endi Grafana UI-da biz ClickHouse-ni DataSource sifatida belgilaymiz.

Men quyidagi sozlamalar bilan ishlaydigan konfiguratsiyaga erisha oldim:

Misol tariqasida Grafana-dan foydalangan holda Yandex.Cloud-da taqsimlangan xizmatlarni joylashtirish

URL manzil sifatida ko'rsatdim https://c-<cluster_id>.rw.mdb.yandexcloud.net:8443

Hammasi! Bizda CH va MySQL ga ulangan veb-serverli bitta ishlaydigan virtual mashinamiz bor. Siz allaqachon ma'lumotlar to'plamini ClickHouse-ga yuklashingiz va asboblar paneli yaratishingiz mumkin. Biroq, biz hali maqsadimizga erisha olmadik va to'liq infratuzilmani joylashtirmadik.

Packer

Yandex.Cloud sizga mavjud virtual mashinaning disk tasvirini yaratishga imkon beradi va uning asosida - bir-biriga o'xshash har qanday miqdordagi mashinalar. Biz aynan shu narsadan foydalanamiz. Tasvirni qulay tarzda yig'ish uchun asbobni oling Packer HashiCorp dan. Kirish sifatida tasvirni yig'ish bo'yicha ko'rsatmalarga ega json faylini oladi.

Bizning json faylimiz ikkita blokdan iborat bo'ladi: quruvchilar va provayderlar. Birinchi blok ob'ekt sifatida tasvirning o'zi parametrlarini tavsiflaydi va ikkinchi blok uni kerakli tarkib bilan to'ldirish bo'yicha ko'rsatmalarni tavsiflaydi.

quruvchilar

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

Ushbu shablonda siz bulutdagi tasvirni yaratmoqchi bo'lgan qismning identifikatorini, shuningdek, ushbu bo'limda ilgari yaratilgan xizmat hisobidagi kalitlar bilan faylga yo'lni o'rnatishingiz kerak. Siz tegishli bo'limda fayl ko'rinishidagi xizmat hisoblari va kalitlarni yaratish haqida ko'proq o'qishingiz mumkin hujjatlar.

Ushbu konfiguratsiya disk tasviri platforma asosida yaratilishini aytadi ubuntu-1804-lts, tasvirlar oilasida tegishli foydalanuvchi bo'limiga joylashtirilgan GRAFANA nomi ostida grafana-{{timestamp}}.

Provayderlar

Endi konfiguratsiyaning yanada qiziqarli qismi keladi. U virtual mashinaning holatini diskdagi tasvirga muzlatishdan oldin bajarilishi kerak bo'lgan harakatlar ketma-ketligini tavsiflaydi.

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

Bu erda barcha harakatlar 3 bosqichga bo'lingan. Birinchi bosqichda yordamchi katalog yaratuvchi oddiy skript bajariladi.

Preparat-ctg.sh:

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

Keyingi bosqichda biz ushbu katalogga skriptni joylashtiramiz, uni virtual mashinani ishga tushirgandan so'ng darhol ishga tushirish kerak bo'ladi. Ushbu skript Grafana konfiguratsiyasida ro'yxatdan o'tkazilishi kerak bo'lgan foydalanuvchi o'zgaruvchilarini joylashtiradi va veb-serverni qayta ishga tushiradi.

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

Shundan so'ng 3 ta narsa qilish kerak:
1) paketlarni o'rnatish
2) systemctl ostida Grafana-ni ishga tushiring va ClickHouse plaginini o'rnating
3) virtual mashinani yoqgandan so'ng darhol setup.sh skriptini ishga tushirish navbatiga qo'ying.

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;

Endi faqat Packer-ni ishga tushirish va belgilangan bo'limga joylashtirilgan chiqish tasvirini olish qoladi. Virtual mashinani yaratishda siz uni yuklash diski sifatida tanlashingiz mumkin va ishga tushirilgandan so'ng siz tayyor Grafana veb-serverini olasiz.

Misol tariqasida Grafana-dan foydalangan holda Yandex.Cloud-da taqsimlangan xizmatlarni joylashtirish
Misol tariqasida Grafana-dan foydalangan holda Yandex.Cloud-da taqsimlangan xizmatlarni joylashtirish

Namuna guruhi va balanslashtiruvchi

Ko'p bir xil Grafana veb-serverlarini yaratishga imkon beruvchi disk tasviriga ega bo'lgach, biz misollar guruhini yaratishimiz mumkin. Yandex.Cloud platformasida bu atama bir xil xususiyatlarga ega bo'lgan virtual mashinalar birligiga ishora qiladi. Namuna guruhini yaratishda ushbu guruhdagi barcha mashinalarning prototipi, so'ngra guruhning o'ziga xos xususiyatlari (masalan, faol mashinalarning minimal va maksimal soni) sozlanadi. Agar joriy raqam ushbu mezonlarga javob bermasa, namunalar guruhining o'zi keraksiz mashinalarni olib tashlaydi yoki o'z suratida yangilarini yaratadi.

Bizning vazifamizning bir qismi sifatida biz ilgari yaratilgan disk tasviridan hosil bo'ladigan veb-serverlarning misollar guruhini yaratamiz.

Misol tariqasida Grafana-dan foydalangan holda Yandex.Cloud-da taqsimlangan xizmatlarni joylashtirish

Misol tariqasida Grafana-dan foydalangan holda Yandex.Cloud-da taqsimlangan xizmatlarni joylashtirish

Haqiqatan ham e'tiborga sazovor bo'lgan narsa - bu oxirgi guruhni sozlash. Load Balancer bilan integratsiyalashgan maqsadli guruh bir nechta tugmachalarni bosish orqali ushbu guruhning virtual mashinalari ustiga L3 balanslagichini sozlashda yordam beradi.

Misol tariqasida Grafana-dan foydalangan holda Yandex.Cloud-da taqsimlangan xizmatlarni joylashtirish

Balanslashtiruvchini o'rnatishda men ikkita muhim fikrni amalga oshirdim:

  1. Men balanslashtiruvchini 80-portdagi foydalanuvchi trafigini qabul qilishga va uni Grafana yashaydigan virtual mashinalarning 3000-portiga yo'naltirishga majbur qildim.
  2. Men 3000 portiga ping yuborish orqali mashinalarning hayotiyligini tekshirishni o'rnatdim.

Misol tariqasida Grafana-dan foydalangan holda Yandex.Cloud-da taqsimlangan xizmatlarni joylashtirish

Mini xulosa

Nihoyat, biz kerakli dastur infratuzilmasini qo'lda o'rnatishga muvaffaq bo'ldik va endi bizda juda bardoshli Grafana xizmati mavjud. Ma'lumotlar to'plamini unga yuklash uchun siz faqat dasturga kirish nuqtasi va ClickHouse klasterining xosti sifatida balanslashtiruvchining IP-manzilini bilishingiz kerak.

Bu g'alabaga o'xshaydimi? Ha, g'alaba. Lekin nimadir meni haligacha chalg'itadi. Yuqoridagi butun jarayon juda ko'p qo'lda qadamlarni talab qiladi va umuman kengaytirib bo'lmaydi; iloji bo'lsa, uni avtomatlashtirishni xohlayman. Keyingi bo'lim aynan shu narsaga bag'ishlanadi.

Terraform integratsiyasi

Biz yana HashiCorp deb nomlangan vositadan foydalanamiz Terraform. Bu foydalanuvchi tomonidan o'tkazilgan bir nechta o'zgaruvchilar asosida bir tugmani bosish bilan butun dastur infratuzilmasini joylashtirishga yordam beradi. Keling, turli foydalanuvchilarning turli bo'limlarida bir necha marta ishga tushirilishi mumkin bo'lgan retsept yozaylik.

Terraform bilan barcha ishlar konfiguratsiya faylini yozishdan iborat (*.tf) va uning asosida infratuzilmani yaratish.

O'zgaruvchilar

Faylning eng boshida biz kelajakdagi infratuzilma qayerda va qanday joylashtirilishini aniqlaydigan o'zgaruvchilarni o'z ichiga olamiz.

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

Ilovani joylashtirishning butun jarayoni disk tasvirini yaratish va ushbu o'zgaruvchilarni o'rnatishga tushadi. Ular nima uchun javobgar ekanligini tushuntirib beraman:

oauth_token — bulutga kirish uchun token. tomonidan olinishi mumkin aloqa.
cloud_id — biz ilovani joylashtiradigan bulut identifikatori
papka_id — ilovani joylashtiradigan bo'lim identifikatori
service_account_id — bulutning tegishli bo'limida xizmat hisobi identifikatori.
image_id — Packer yordamida olingan disk tasvirining identifikatori
username и parol — maʼlumotlar bazasiga va Grafana veb-serveriga kirish uchun foydalanuvchi nomi va parol
dbname — CH va MySQL klasterlari ichidagi maʼlumotlar bazasi nomi
public_key_path — nomi ostida ulanish uchun foydalanishingiz mumkin bo'lgan umumiy ssh kalitingiz bilan faylga yo'l ubuntu veb-serverlari bo'lgan virtual mashinalarga

Provayderni sozlash

Endi siz Terraform provayderini sozlashingiz kerak - bizning holatlarimizda Yandex:

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

Bu erda biz yuqorida tavsiflangan o'zgaruvchilardan foydalanayotganimizni sezasiz.

Tarmoq va klasterlar

Endi biz infratuzilmamiz elementlari aloqa qiladigan tarmoq yaratamiz, uchta pastki tarmoq (har bir mintaqada bittadan) va CH va MySQL klasterlarini ko'taramiz.


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

Ko'rib turganingizdek, ikkita klasterning har biri uchta mavjud zonada joylashganligi sababli nosozliklarga chidamli bo'lib yaratilgan.

Veb-serverlar

Xuddi shu ruhda davom etishimiz mumkindek tuyulardi, lekin men qiyinchilikka duch keldim. Bundan oldin men birinchi marta MySQL klasterini yaratdim va shundan keyingina uning identifikatorini bilib, kerakli konfiguratsiyaga ega disk tasvirini to'pladim, u erda klasterga xostni ko'rsatdim. Ammo endi biz Terraformni ishga tushirishdan oldin, shu jumladan tasvirni yaratish vaqtida klaster identifikatorini bilmaymiz. Shuning uchun men quyidagilarga murojaat qilishim kerak edi hiyla.

Amazonning metadata xizmatidan foydalanib, biz virtual mashinaga ba'zi parametrlarni o'tkazamiz, u qabul qiladi va qayta ishlaydi. Ishga tushgandan so'ng, foydalanuvchi Terraform faylida ko'rsatgan MySQL klasteri xosti va foydalanuvchi nomi-parol orqasidagi metama'lumotlarga o'tish uchun bizga mashina kerak bo'ladi. Keling, fayl mazmunini biroz o'zgartiraylik setup.sh, virtual mashina yoqilganda ishlaydi.

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

Intans guruhi va muvozanatlashtiruvchi

Yangi disk tasvirini qayta tiklab, biz nihoyat Terraform uchun faylimizni qo'shishimiz mumkin.

Keling, mavjud disk tasviridan foydalanmoqchi ekanligimizni ko'rsataylik:

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

Endi misollar guruhini yaratamiz:

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

Biz uni metadataga qanday o'tkazganimizga e'tibor qaratishimiz kerak cluster_uri, username и password. Aynan shu virtual mashina ishga tushirilganda chiqariladi va Grafana konfiguratsiyasiga o'rnatiladi.

Bu muvozanatlashtiruvchiga bog'liq.

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

Bir oz shakar

Ozgina qoldi. Infratuzilma o'rnatilgandan so'ng siz Grafana UI ga o'tishingiz va CH klasterini (uning identifikatori hali ham olinishi kerak) ma'lumotlar manbai sifatida qo'shishingiz kerak bo'ladi. Ammo Terraform klaster identifikatorini biladi. Keling, masalani hal etishni unga ishonib topshiraylik.

Keling, yangi provayder - Grafana qo'shamiz va unga xost sifatida balanslovchining IP-manzilini beramiz. Terraform o'z balanslagichi belgilaydigan mashinada qiladigan barcha o'zgarishlar MySQL-da va shuning uchun boshqa barcha mashinalarda o'sadi.

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

Keling, sochlarimizni taraylik

Balanslashtiruvchi IP-manzilni va ClickHouse klasterining xostini ko'rsatamiz

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

Yugurish mumkin

Hammasi! Bizning konfiguratsiya faylimiz tayyor va biz o'zgaruvchilarni o'rnatish orqali Terraformga yuqorida tavsiflangan hamma narsani oshirishni aytishimiz mumkin. Butun jarayon menga taxminan 15 daqiqa davom etdi.
Oxirida siz chiroyli xabarni ko'rishingiz mumkin:

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

Va bulutda ko'tarilgan infratuzilmaning elementlari ko'rinadi:

Misol tariqasida Grafana-dan foydalangan holda Yandex.Cloud-da taqsimlangan xizmatlarni joylashtirish

Natijalarni jamlaylik

Endi Grafana’dan misol tariqasida har biringiz Yandex.Cloud platformasida keng bulutli arxitekturaga ega ilovalarni joylashtirishingiz mumkin. Bunda sizga HashiCorp-dan Packer va Terraform kabi foydali vositalar yordam berishi mumkin. Umid qilamanki, kimdir bu maqolani foydali deb topadi :)

PS Quyida men ushbu maqolada taqdim etgan Packer va Terraform uchun tayyor retseptlarni topishingiz mumkin bo'lgan omborga havolani qo'shaman.

ombori

Manba: www.habr.com

a Izoh qo'shish