Мисал катары Grafana колдонуу менен Yandex.Cloud бөлүштүрүлгөн кызматтарды жайылтуу

Баарына салам! Курстук ишимдин алкагында мен ата мекендик булут платформасынын мүмкүнчүлүктөрүн изилдеп жаткам Yandex.Cloud. Платформа практикалык маселелерди чечүү үчүн ар кандай кызматтарды сунуш кылат. Бирок, кээде бул кызматтардын негизинде бир кыйла кеңири инфраструктура менен булут тиркемесин конфигурациялоо керек болот. Бул макалада мен мындай тиркемени жайылтуу тажрыйбасы менен бөлүшкүм келет.

Мисал катары Grafana колдонуу менен Yandex.Cloud бөлүштүрүлгөн кызматтарды жайылтуу

Сиз эмнени алгыңыз келет?

Графана - ар кандай системалардын аналитикалык маселелерди же мониторинг көйгөйлөрүн чечүү үчүн күчтүү курал. Негизги конфигурациясында бул Grafana веб-сервери бар виртуалдык машина, ошондой эле аналитика куруу үчүн колдонула турган берилиштер топтому бар маалымат базасы (ClickHouse, InfluxDB ж.б.).

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

Мисал катары Grafana колдонуу менен Yandex.Cloud бөлүштүрүлгөн кызматтарды жайылтуу

Негизги версиянын бир олуттуу кемчилиги бар - ал такыр эле катага чыдабайт. Башкача айтканда, колдонмонун бүтүндөй иштеши бир виртуалдык машинанын жашоо жөндөмдүүлүгүнөн көз каранды. Эгер ал баш тартса же UIди бир эле учурда 10 адам ачса, анда көйгөйлөр пайда болот.

Алар жөн гана чечилет: сиз жөн гана веб-сервери бар көптөгөн окшош виртуалдык машиналарды орнотуп, аларды L3 баланстоочусунун астына коюшуңуз керек. Бирок бул жерде бардыгы анчалык ачык-айкын эмес. Grafana колдонуучунун жөндөөлөрүн (маалымат базасына баруучу жолдор, аспаптар такталары, графика ж.б.) түздөн-түз өзүнүн виртуалдык машинасынын дискинде сактайт. Ошентип, эгер сиз UIдеги кээ бир орнотууларды өзгөртсөңүз, анда бул өзгөртүүлөр баланстоочу бизге жөнөткөн виртуалдык машинада гана көрсөтүлөт. Бул биздин колдонмобуздун туура келбеген орнотууларына, ишке киргизүү жана колдонуудагы көйгөйлөргө алып келет.

Бул жерде дагы бир маалымат базасы жардамга келет, мисалы, MySQL же анын эквиваленти. Биз Графанага бул "запастык" маалымат базасында колдонуучунун жөндөөлөрүн сактоо керектигин айтабыз. Андан кийин, ар бир машинада бул маалымат базасына жолду бир жолу көрсөтүү жана виртуалдык машиналардын каалаганында башка бардык колдонуучунун орнотууларын түзөтүү жетиштүү болот, алар калгандарында өсөт.

Бул жерде акыркы колдонмо инфраструктурасынын диаграммасы:

Мисал катары Grafana колдонуу менен Yandex.Cloud бөлүштүрүлгөн кызматтарды жайылтуу

Колуңуз менен көтөрүүнү үйрөнүңүз

MySQL жана ClickHouse

Мындай тиркемени бир баскычты чыкылдатуу менен жайылтуудан мурун, анын ар бир компонентин туткалары менен көтөрүп, бири-бири менен интеграциялоону үйрөнүү керек болчу.

Yandex.Cloud бул жерде бизге жардам берет, ал L3 баланстоочуларды, ClickHouse жана MySQL-ди башкарылган кызматтар катары көрсөтөт. Колдонуучуга параметрлерди көрсөтүп, платформа бардыгын иштөө абалына келтиргиче күтүшү керек.

Мен катталып, өзүм үчүн булут жана эсеп эсебин түздүм. Андан кийин, мен булутка кирип, MySQL жана ClickHouse кластерлерин минималдуу орнотуулар менен көтөрдүм. Алар активдүү болгуча күтө туруңуз.

Мисал катары Grafana колдонуу менен Yandex.Cloud бөлүштүрүлгөн кызматтарды жайылтууМисал катары Grafana колдонуу менен Yandex.Cloud бөлүштүрүлгөн кызматтарды жайылтуу

Ошондой эле ар бир кластерде маалымат базасын түзүп, ага логин жана сырсөз аркылуу кирүү мүмкүнчүлүгүн конфигурациялоону унутпашыңыз керек. Мен бул жерде майда-чүйдөсүнө чейин кирбейм - интерфейсте баары ачык-айкын көрүнүп турат.

Ачык эмес детал бул маалымат базаларында катачылыкка чыдамдуулугун камсыз кылган көптөгөн хосттор бар экендиги болду. Бирок, Grafana иштеген ар бир маалымат базасы үчүн бир хостту талап кылат. Узак окуу документтер Булут мени бир чечимге алып келди. Форманын бир хосту бар экен c-<cluster_id>.rw.mdb.yandexcloud.net Тиешелүү ID менен учурдагы активдүү кластердин башкы хостуна карталар. Графанага ушуну беребиз.

веб сервер

Эми бул веб-серверде. Келгиле, 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 портун көрсөтүү жана кооз 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'ду DataSource катары көрсөтөбүз.

Мен төмөнкү орнотуулар менен жумушчу конфигурацияга жетише алдым:

Мисал катары 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;

Эми Пакерди иштетүү жана көрсөтүлгөн бөлүмгө жайгаштырылган чыгаруу сүрөтүн алуу калды. Виртуалдык машинаны түзүүдө сиз аны жүктөө диски катары тандап, баштагандан кийин даяр Grafana веб-серверин ала аласыз.

Мисал катары Grafana колдонуу менен Yandex.Cloud бөлүштүрүлгөн кызматтарды жайылтуу
Мисал катары Grafana колдонуу менен Yandex.Cloud бөлүштүрүлгөн кызматтарды жайылтуу

Инстанциялар тобу жана баланстоочу

Көптөгөн окшош Grafana веб серверлерин түзүүгө мүмкүндүк берген дисктин сүрөтү болгондон кийин, биз инстанциялар тобун түзө алабыз. Yandex.Cloud платформасында бул термин бирдей мүнөздөмөлөргө ээ болгон виртуалдык машиналардын биримдигин билдирет. Инстанциялар тобун түзүүдө бул топтун бардык машиналарынын прототиби конфигурацияланат, андан кийин топтун өзүнүн мүнөздөмөлөрү (мисалы, активдүү машиналардын минималдуу жана максималдуу саны). Эгерде учурдагы сан бул критерийге жооп бербесе, анда инстанциялар тобунун өзү керексиз машиналарды алып салат же сүрөттө жана окшоштукта жаңыларын түзөт.

Милдетибиздин бир бөлүгү катары, биз мурда түзүлгөн дисктин сүрөттөлүшүнөн пайда боло турган веб-серверлердин инстанциялык тобун түзөбүз.

Мисал катары Grafana колдонуу менен Yandex.Cloud бөлүштүрүлгөн кызматтарды жайылтуу

Мисал катары Grafana колдонуу менен Yandex.Cloud бөлүштүрүлгөн кызматтарды жайылтуу

Акыркы инстанция тобунун жөндөөлөрү чындап эле көрүнүктүү. Load Balancer менен интеграцияланган максаттуу топ бир нече баскычты басуу менен бул топтун виртуалдык машиналарынын үстүнө L3 балансизаторун орнотууга жардам берет.

Мисал катары Grafana колдонуу менен Yandex.Cloud бөлүштүрүлгөн кызматтарды жайылтуу

Балансты орнотууда мен эки маанилүү пунктту ишке ашырдым:

  1. Мен муну баланстоочу 80-портто колдонуучу трафигин кабыл алып, аны Grafana жашаган 3000 виртуалдык машинанын портуна багыттадым.
  2. 3000 портуна пинг коюу менен машинанын ден соолугун текшерүүнү орнотуңуз.

Мисал катары Grafana колдонуу менен Yandex.Cloud бөлүштүрүлгөн кызматтарды жайылтуу

мини-жалпы

Акыр-аягы, биз каалаган колдонмо инфраструктурасын кол менен орното алдык жана азыр бизде абдан ийкемдүү Grafana кызматы бар. Ага берилиштер топтомун жүктөө үчүн, тиркемеге кирүү чекити жана ClickHouse кластеринин хосту катары баланстоочунун IP дарегин билүү гана керек.

Бул жеңиш окшойт? Ооба, жеңиш. Бирок дагы эле мени бир нерсе тынчсыздандырат. Жогорудагы бардык процесс көптөгөн кол аракеттерди талап кылат жана такыр масштабдабайт, мүмкүн болсо, аны автоматташтыргым келет. Бул кийинки бөлүмдө басым болот.

Terraform менен интеграция

Биз кайрадан 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 - биз колдонмону орното турган булуттун идентификатору
folder_id — тиркемени жайылта турган бөлүмдүн идентификатору
service_account_id — булуттун тиешелүү бөлүмүндөгү кызматтык эсептин идентификатору.
image_id - Пакердин жардамы менен алынган дисктин сүрөтүнүн идентификатору
колдонуучунун аты и купуя сөз - маалымат базаларына жана Grafana веб серверине кирүү үчүн колдонуучу аты жана сырсөз
dbname - CH жана MySQL кластерлеринин ичиндеги маалымат базасынын аталышы
public_key_path - аты менен туташа турган жалпы ssh ачкычыңыз менен файлга жол ubuntu веб-серверлери бар виртуалдык машиналарга

Провайдердин жөндөөсү

Эми сиз Terraform провайдерин конфигурациялашыңыз керек - биздин учурда, Yandex:

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'дун метаберилиштер кызматын колдонуу менен биз виртуалдык машинага кээ бир параметрлерди өткөрүп беребиз, ал кабыл алып, иштетет. Бизге кластердин MySQL хостунун метаберилиштерине жана колдонуучу 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

Интенс тобу жана баланстоочу

Жаңы дисктин сүрөтүн калыбына келтирип, акыры 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"
}

Чуркай алат

Баары! Биздин конфигурация файлыбыз даяр жана биз өзгөрмөлөрдү коюу менен, Терраформга биз жогоруда сүрөттөгөн нерселердин баарын көтөрүүнү айта алабыз. Бардык процесс мага 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 мисалында, ар бириңиздер Yandex.Cloud платформасында кеңири булут архитектурасы бар тиркемелерди орното аласыз. Пакер жана Terraform сыяктуу HashiCorp компаниясынын пайдалуу куралдары бул жагынан сизге жардам берет. Кимдир бирөө бул макаланы пайдалуу деп үмүттөнөм 🙂

PS Төмөндө мен репозиторийге шилтемени тиркейм, ал жерден Пакер жана Терраформ үчүн даяр рецепттерди таба аласыз, алардын фрагменттери мен бул макалада келтирилген.

репозиторий

Source: www.habr.com

Комментарий кошуу