Мысал ретінде Grafana көмегімен Yandex.Cloud-та таратылған қызметтерді орналастыру

Бәріңе сәлем! Курстық жұмысымның бір бөлігі ретінде мен отандық бұлттық платформаның мүмкіндіктерін зерттедім Yandex.Cloud. Платформа практикалық мәселелерді шешу үшін әртүрлі қызметтерді ұсынады. Дегенмен, кейде осы қызметтерге негізделген жеткілікті ауқымды инфрақұрылымы бар жеке бұлттық қолданбаны орнату қажет. Бұл мақалада мен осындай қолданбаны қолдану тәжірибеммен бөліскім келеді.

Мысал ретінде Grafana көмегімен Yandex.Cloud-та таратылған қызметтерді орналастыру

Сіз не алғыңыз келеді?

Графана — кез келген жүйенің аналитикалық есептерін немесе мониторинг мәселелерін шешуге арналған қуатты құрал. Негізгі конфигурациясында бұл Grafana веб-сервері бар виртуалды машина, сондай-ақ аналитика негізделетін деректер жинағы бар дерекқор (ClickHouse, InfluxDB және т.б.).

Веб-сервері бар виртуалды машинаны іске қосқаннан кейін сіз оның хостына өтіп, әдемі UI ала аласыз, әрі қарай жұмыс үшін дереккөздер ретінде дерекқорларды көрсете аласыз, бақылау тақталары мен графиктерін жасай аласыз.

Мысал ретінде Grafana көмегімен Yandex.Cloud-та таратылған қызметтерді орналастыру

Негізгі нұсқаның бір маңызды кемшілігі бар - ол ақауларға мүлдем төзбейді. Яғни, қолданбаның барлық функционалдығы бір виртуалды машинаның өміршеңдігіне байланысты. Егер ол бас тартса немесе UI бір уақытта 10 адам ашса, проблемалар туындайды.

Оларды оңай шешуге болады: сізге... веб-сервері бар көптеген бірдей виртуалды машиналарды орналастыру және оларды L3 балансизаторының астына орналастыру қажет. Бірақ мұнда бәрі соншалықты анық емес. Grafana пайдаланушы параметрлерін (деректер базасына жолдар, бақылау тақталары, графиктер және т.б.) тікелей өзінің виртуалды машинасының дискісінде сақтайды. Осылайша, егер біз пайдаланушы интерфейсіндегі кейбір параметрлерді өзгертсек, бұл өзгерістер тек теңгеруші бізге жіберген виртуалды машинада көрсетіледі. Бұл біздің қолданбамыздың сәйкес келмейтін параметрлеріне әкеледі, бұл іске қосу және пайдалану кезінде қиындықтар тудырады.

Мұнда басқа дерекқор құтқаруға келеді, мысалы, MySQL немесе оның баламасы. Біз Графанаға пайдаланушы параметрлерін осы «қосалқы» дерекқорда сақтау керектігін айтамыз. Әрі қарай, бұл дерекқорға жолды әр машинада бір рет көрсету және кез келген виртуалды машиналарда барлық басқа пайдаланушы параметрлерін өңдеу жеткілікті болады; олар басқаларына таралады.

Мұнда соңғы қолданба инфрақұрылымының диаграммасы берілген:

Мысал ретінде Grafana көмегімен Yandex.Cloud-та таратылған қызметтерді орналастыру

Қолымызбен көтеруді үйренейік

MySQL және ClickHouse

Түймені басу арқылы мұндай қолданбаны орналастырмас бұрын оның әрбір құрамдас бөліктерін өңдеуді және оларды бір-бірімен біріктіруді үйрену қажет болды.

Мұнда Яндекс.Cloud бізге көмектеседі, ол басқарылатын қызметтер ретінде L3 теңгерімдерін, ClickHouse және MySQL ұсынатын болады. Пайдаланушы тек параметрлерді көрсетіп, платформа барлығын жұмыс тәртібіне келтіргенше күтуі керек.

Мен тіркелдім, бұлтты және төлем шотын жасадым. Осыдан кейін мен бұлтқа кіріп, MySQL және ClickHouse кластерлерін минималды параметрлермен орнаттым. Мен олар белсенді болғанша күттім.

Мысал ретінде Grafana көмегімен Yandex.Cloud-та таратылған қызметтерді орналастыруМысал ретінде Grafana көмегімен Yandex.Cloud-та таратылған қызметтерді орналастыру

Сондай-ақ, әрбір кластерде дерекқор жасауды және оған логин мен құпия сөзді пайдаланып кіруді конфигурациялауды есте сақтау қажет. Мен мұнда егжей-тегжейлі айтпаймын - интерфейсте бәрі анық.

Бұл дерекқорларда олардың ақауларға төзімділігін қамтамасыз ететін көптеген хосттар бар екендігі анық емес деталь болды. Дегенмен, Grafana өзі жұмыс істейтін әрбір дерекқор үшін дәл бір хостты қажет етеді. Ұзақ оқу құжаттама Бұлттар мені бір шешімге келді. Түрдің иесі болып шықты c-<cluster_id>.rw.mdb.yandexcloud.net сәйкес идентификаторы бар кластердің ағымдағы белсенді басты хостымен салыстырылады. Бұл біз Графанаға береміз.

Веб-сервер

Енді бұл веб-серверге байланысты. Linux-пен кәдімгі виртуалды машинаны көтеріп, оған Grafana-ны қолмен конфигурациялайық.

Мысал ретінде Grafana көмегімен Yandex.Cloud-та таратылған қызметтерді орналастыру

Мысал ретінде Grafana көмегімен Yandex.Cloud-та таратылған қызметтерді орналастыру

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 

Осыдан кейін, Grafana жүйесін 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

веб-серверді іске қосамыз. Енді браузерде виртуалды машинаның сыртқы IP мекенжайын енгізіп, 3000 портын көрсетіп, әдемі Grafana UI көре аласыз.
Мысал ретінде Grafana көмегімен Yandex.Cloud-та таратылған қызметтерді орналастыру

Бірақ асықпаңыз, Grafana-ны орнатпас бұрын, параметрлерді сақтау үшін оған MySQL жолын айтуды ұмытпаңыз.

Grafana веб-серверінің барлық конфигурациясы файлда /etc/grafana/grafana.ini. Қажетті жол келесідей көрінеді:

;url =

Біз хостты MySQL кластеріне орнаттық. Бір файлда жоғарыдағы суреттегі Grafana қолданбасына кіруге арналған логин мен құпия сөз бар, әдепкі бойынша екеуі де бірдей 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

Енді Grafana UI-де біз ClickHouse-ды Деректер көзі ретінде көрсетеміз.

Мен келесі параметрлермен жұмыс конфигурациясына қол жеткізе алдым:

Мысал ретінде Grafana көмегімен Yandex.Cloud-та таратылған қызметтерді орналастыру

URL мекенжайы ретінде көрсеттім https://c-<cluster_id>.rw.mdb.yandexcloud.net:8443

Барлық! Бізде CH және MySQL-ге қосылған веб-сервері бар бір жұмыс істейтін виртуалды машина бар. Деректер жиынын ClickHouse қызметіне жүктеп салуға және бақылау тақталарын құруға болады. Дегенмен, біз әлі мақсатымызға жеткен жоқпыз және толыққанды инфрақұрылымды орнатқан жоқпыз.

Packer

Yandex.Cloud бар виртуалды машинаның дискілік кескінін жасауға мүмкіндік береді және оның негізінде - бір-біріне ұқсас машиналар санының кез келген саны. Біз дәл осыны қолданамыз. Кескінді ыңғайлы түрде жинау үшін құралды алыңыз Packer HashiCorp компаниясынан. Ол кескінді құрастыру нұсқаулары бар json файлын кіріс ретінде қабылдайды.

Біздің json файлымыз екі блоктан тұрады: құрылысшылар және провайдерлер. Бірінші блок нысан ретіндегі кескіннің параметрлерін сипаттайды, ал екінші блок оны қажетті мазмұнмен толтыру нұсқауларын сипаттайды.

құрылысшылар

{
"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": [
    {
            "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 кезеңге бөлінген. Бірінші кезеңде көмекші каталогты жасайтын қарапайым сценарий орындалады.

Preparat-ctg.sh:

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

Келесі кезеңде біз сценарийді осы каталогқа орналастырамыз, ол виртуалды машинаны іске қосқаннан кейін бірден іске қосылуы керек. Бұл сценарий 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 астында Grafana бағдарламасын іске қосыңыз және 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 көмегімен Yandex.Cloud-та таратылған қызметтерді орналастыру
Мысал ретінде Grafana көмегімен Yandex.Cloud-та таратылған қызметтерді орналастыру

Даналар тобы және теңгеруші

Бізде көптеген бірдей Grafana веб-серверлерін жасауға мүмкіндік беретін диск кескіні болғаннан кейін біз даналар тобын жасай аламыз. Yandex.Cloud платформасында бұл термин бірдей сипаттамалары бар виртуалды машиналарды біріктіреді. Даналар тобын құру кезінде осы топтағы барлық машиналардың прототипі конфигурацияланады, содан кейін топтың өзіне тән сипаттамалары (мысалы, белсенді машиналардың минималды және максималды саны). Ағымдағы нөмір осы критерийлерге сәйкес келмесе, даналар тобының өзі қажетсіз машиналарды жояды немесе өз кескінінде жаңаларын жасайды.

Тапсырмамыздың бөлігі ретінде біз бұрын жасалған диск кескінінен жасалатын веб-серверлердің даналық тобын жасаймыз.

Мысал ретінде Grafana көмегімен Yandex.Cloud-та таратылған қызметтерді орналастыру

Мысал ретінде Grafana көмегімен Yandex.Cloud-та таратылған қызметтерді орналастыру

Ең таңғаларлық - соңғы даналық топты орнату. Load Balancer бағдарламасымен біріктірудегі мақсатты топ бірнеше түймені басу арқылы осы топтың виртуалды машиналарының жоғарғы жағында L3 балансизаторын конфигурациялауға көмектеседі.

Мысал ретінде Grafana көмегімен Yandex.Cloud-та таратылған қызметтерді орналастыру

Балансты орнату кезінде мен екі маңызды тармақты орындадым:

  1. Мен балансизаторды 80-ші портта пайдаланушы трафигін қабылдауға және оны виртуалды машиналардың 3000 портына, яғни Grafana тұратын жеріне қайта бағыттауға мәжбүр еттім.
  2. Мен машиналарды 3000 портына пингтеу арқылы олардың өміршеңдігін тексеруді орнаттым.

Мысал ретінде Grafana көмегімен Yandex.Cloud-та таратылған қызметтерді орналастыру

Шағын қорытынды

Ақырында, біз қажетті қолданба инфрақұрылымын қолмен орналастыра алдық, енді бізде жоғары төзімді Grafana қызметі бар. Деректер жиынын оған жүктеу үшін бағдарламаға кіру нүктесі және ClickHouse кластерінің хосты ретінде теңдестіргіштің IP мекенжайын ғана білу қажет.

Жеңіс сияқты көрінетін шығар? Иә, жеңіс. Бірақ мені әлі де бір нәрсе шатастырады. Жоғарыдағы бүкіл процесс көптеген қолмен орындалатын қадамдарды қажет етеді және мүлдем масштабталмайды; мүмкін болса, оны автоматтандырғым келеді. Келесі бөлім осыған арналады.

Терраформа интеграциясы

Біз HashiCorp деп аталатын құралды қайтадан қолданамыз Terraform. Ол пайдаланушы жіберген бірнеше айнымалы мәндерге негізделген түймені басу арқылы бүкіл қолданба инфрақұрылымын орналастыруға көмектеседі. Әртүрлі пайдаланушылардың әртүрлі бөлімдерінде бірнеше рет іске қосуға болатын рецепт жазайық.

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 — қолданбаны орналастыратын бұлт идентификаторы
қалта_идентификаторы — қолданбаны орналастыратын бөлім идентификаторы
қызмет_шотының_идентификаторы — бұлттың сәйкес бөліміндегі қызмет тіркелгісінің идентификаторы.
image_id — Packer көмегімен алынған диск кескінінің идентификаторы
пайдаланушы аты и пароль — дерекқорларға және Grafana веб-серверіне қол жеткізу үшін пайдаланушы аты мен құпия сөз
dbname — CH және MySQL кластерлерінің ішіндегі дерекқор атауы
жалпы_кілт_жолы — атаумен қосылу үшін пайдалануға болатын жалпы ssh кілтімен файлға жол ubuntu веб-серверлері бар виртуалды машиналарға

Провайдерді орнату

Енді сіз Terraform провайдерін конфигурациялауыңыз керек - біздің жағдайда Яндекс:

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 кластерін көтердім, содан кейін ғана оның идентификаторын біле отырып, мен кластерге хостты көрсеткен қажетті конфигурациямен диск кескінін жинадым. Бірақ қазір біз Terraform іске қоспас бұрын, соның ішінде кескінді құру кезінде кластер идентификаторын білмейміз. Сондықтан мен келесіге жүгінуге тура келді қулық.

Amazon метадеректер қызметін пайдалана отырып, біз виртуалды машинаға кейбір параметрлерді жібереміз, ол қабылдайды және өңдейді. Іске қосылғаннан кейін пайдаланушы Terraform файлында көрсеткен MySQL кластерінің хостының және пайдаланушы аты-парольінің артындағы метадеректерге өту үшін құрылғы қажет. Файлдың мазмұнын сәл өзгертейік 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

Интенс тобы және теңгеруші

Жаңа диск кескінін қалпына келтіріп, біз Terraform үшін файлымызды қоса аламыз.

Бар дискінің кескінін пайдаланғымыз келетінін көрсетейік:

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. Дәл осылар виртуалды машинаны іске қосқан кезде шығарып, Grafana конфигурациясына қояды.

Бұл теңгерімшіге байланысты.

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

Кішкене қант

Аз ғана қалды. Инфрақұрылымды орнатқаннан кейін сізге Grafana UI-ге өтіп, деректер көзі ретінде CH кластерін (идентификаторы әлі де алынуы керек) қолмен қосу керек. Бірақ Terraform кластер идентификаторын біледі. Мәселені шешуді оған сеніп тапсырайық.

Жаңа провайдерді - Grafana қосамыз және оған хост ретінде балансизатордың IP мекенжайын берейік. Terraform оның теңгеруші анықтайтын құрылғыда жасайтын барлық өзгерістер 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"
}

Шашымызды тарайық

Балансты IP мекенжайын және 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"
}

Жүгіре алады

Барлық! Біздің конфигурация файлымыз дайын және біз айнымалы мәндерді орнату арқылы Terraform-қа жоғарыда сипатталғанның барлығын көтеруді айта аламыз. Бүкіл процесс маған шамамен 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 көмегімен Yandex.Cloud-та таратылған қызметтерді орналастыру

Жинақтау

Енді Grafana-ны мысал ретінде пайдалана отырып, әрқайсыңыз Яндекс.Cloud платформасында кең бұлт архитектурасы бар қолданбаларды орналастыра аласыз. HashiCorp компаниясының Packer және Terraform сияқты пайдалы құралдары осыған көмектесе алады. Біреу бұл мақаланы пайдалы деп санаймын :)

PS Төменде мен репозиторийге сілтеме қоса беремін, онда сіз осы мақалада үзінділерін берген Packer және Terraform үшін дайын рецепттерді таба аласыз.

репозиторий

Ақпарат көзі: www.habr.com

пікір қалдыру