Misal olaraq Grafana-dan istifadə edərək, Yandex.Cloud-da paylanmış xidmətlərin yerləşdirilməsi

Hamıya salam! Kurs işimin bir hissəsi kimi mən yerli bulud platformasının imkanlarını araşdırırdım Yandex.Cloud. Platforma praktiki problemlərin həlli üçün müxtəlif xidmətlər təklif edir. Bununla belə, bəzən bulud tətbiqinizi bu xidmətlər əsasında kifayət qədər geniş infrastrukturla konfiqurasiya etmək lazımdır. Bu yazıda mən belə bir tətbiqin tətbiqi təcrübəsini bölüşmək istəyirəm.

Misal olaraq Grafana-dan istifadə edərək, Yandex.Cloud-da paylanmış xidmətlərin yerləşdirilməsi

Nə almaq istəyirsən?

Qrafana - hər hansı bir sistemin analitik problemləri və ya monitorinq problemlərinin həlli üçün güclü vasitədir. Əsas konfiqurasiyasında bu, Grafana veb-serverli virtual maşın, həmçinin analitika qurmaq üçün istifadə olunacaq verilənlər bazası (ClickHouse, InfluxDB və s.)dır.

Veb serveri ilə virtual maşını işə saldıqdan sonra onun hostuna gedib gözəl UI əldə edə, verilənlər bazalarını sonrakı iş üçün mənbə kimi təyin edə, idarə panelləri və qrafiklər yarada bilərsiniz.

Misal olaraq Grafana-dan istifadə edərək, Yandex.Cloud-da paylanmış xidmətlərin yerləşdirilməsi

Əsas versiyanın bir əhəmiyyətli çatışmazlığı var - o, heç bir səhvə dözümlü deyil. Yəni, tətbiqin bütün performansı bir virtual maşının həyat qabiliyyətindən asılıdır. O imtina etsə və ya eyni anda 10 nəfər istifadəçi interfeysini açsa, problemlər yaranacaq.

Onlar sadəcə olaraq həll olunur: sadəcə bir çox eyni virtual maşınları veb serverlə yerləşdirmək və onları L3 balanslaşdırıcısının altına yerləşdirmək lazımdır. Ancaq burada hər şey o qədər də aydın deyil. Grafana istifadəçi parametrlərini (verilənlər bazasına gedən yollar, idarə panelləri, qrafiklər və s.) birbaşa öz virtual maşınının diskində saxlayır. Beləliklə, UI-də bəzi parametrləri dəyişdirsəniz, bu dəyişikliklər yalnız balanslaşdırıcının bizə göndərdiyi virtual maşında göstəriləcəkdir. Bu, tətbiqimiz üçün uyğun olmayan parametrlərə, işə salınma və istifadə ilə bağlı problemlərə səbəb olacaq.

Burada başqa bir verilənlər bazası, məsələn, MySQL və ya onun ekvivalenti xilas olmağa gələcək. Biz Grafanaya deyirik ki, o, istifadəçi parametrlərini bu "ehtiyat" verilənlər bazasında saxlamalıdır. Bundan sonra, hər bir maşında bu verilənlər bazasına gedən yolu bir dəfə müəyyən etmək və virtual maşınların hər hansı birində bütün digər istifadəçi parametrlərini redaktə etmək kifayətdir, qalanlarında böyüyəcəkdir.

Budur, son tətbiq infrastrukturunun diaqramı:

Misal olaraq Grafana-dan istifadə edərək, Yandex.Cloud-da paylanmış xidmətlərin yerləşdirilməsi

Əllərinizlə qaldırmağı öyrənin

MySQL və ClickHouse

Bir düyməni basmaqla belə bir tətbiqi yerləşdirməzdən əvvəl onun hər bir komponentini tutacaqlarla qaldırmağı və bir-biri ilə inteqrasiya etməyi öyrənmək lazım idi.

L3 balanslaşdırıcıları, ClickHouse və MySQL-i idarə olunan xidmətlər kimi təqdim edən Yandex.Cloud bizə burada kömək edəcək. İstifadəçi yalnız parametrləri göstərməlidir və platforma hər şeyi işlək vəziyyətə gətirənə qədər gözləməlidir.

Mən qeydiyyatdan keçdim, özüm üçün bulud və billinq hesabı yaratdım. Bundan sonra mən buludlara daxil oldum və minimal parametrlərlə MySQL və ClickHouse klasterlərini qaldırdım. Onlar aktiv olana qədər gözləyin.

Misal olaraq Grafana-dan istifadə edərək, Yandex.Cloud-da paylanmış xidmətlərin yerləşdirilməsiMisal olaraq Grafana-dan istifadə edərək, Yandex.Cloud-da paylanmış xidmətlərin yerləşdirilməsi

Siz həmçinin hər bir klasterdə verilənlər bazası yaratmağı və ona giriş və şifrə ilə girişi konfiqurasiya etməyi unutmayın. Burada təfərrüatlara girməyəcəyəm - interfeysdə hər şey olduqca aydındır.

Qeyri-aşkar təfərrüat ondan ibarət idi ki, bu verilənlər bazalarında səhvlərə dözümlülüyünü təmin edən çoxlu hostlar var. Bununla belə, Grafana işlədiyi hər verilənlər bazası üçün tam olaraq bir host tələb edir. Uzun oxu sənədləşdirmə Buludlar məni bir qərara gətirib çıxardı. Belə çıxır ki, bir ana forma c-<cluster_id>.rw.mdb.yandexcloud.net Müvafiq ID ilə cari aktiv klaster master hostuna xəritələr. Qrafanaya verəcəyimiz budur.

veb server

İndi veb serverə aiddir. Linux ilə adi virtual maşın qaldıraq və onun üzərində əlimizlə Grafana quraşdıraq.

Misal olaraq Grafana-dan istifadə edərək, Yandex.Cloud-da paylanmış xidmətlərin yerləşdirilməsi

Misal olaraq Grafana-dan istifadə edərək, Yandex.Cloud-da paylanmış xidmətlərin yerləşdirilməsi

Gəlin ssh vasitəsilə qoşulaq və lazımi paketləri quraşdıraq.

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 

Bundan sonra biz Grafana-nı systemctl altında işə salacağıq və ClickHouse ilə işləmək üçün plaqini quraşdıracağıq (bəli, o, əsas paketdə verilmir).

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

Bundan sonra hər şey sadə bir əmrlə

sudo service grafana-server start

veb serveri işə salacağıq. İndi brauzerdə virtual maşının xarici IP ünvanını idarə etmək, 3000 portunu göstərmək və gözəl UI qrafanasını görmək mümkün olacaq.
Misal olaraq Grafana-dan istifadə edərək, Yandex.Cloud-da paylanmış xidmətlərin yerləşdirilməsi

Ancaq tələsməyin, Grafana-nı quraşdırmadan əvvəl parametrləri orada saxlamaq üçün MySQL-ə gedən yolu göstərməyi unutmamalısınız.

Grafana veb serverinin bütün konfiqurasiyası fayldadır /etc/grafana/grafana.ini. Tələb olunan xətt belə görünür:

;url =

Biz hostu MySQL klasterinə təqdim edirik. Eyni faylda yuxarıdakı şəkildəki Grafanaya daxil olmaq üçün giriş və parol var, hər ikisi defolt olaraq bərabərdir admin.

sed əmrlərindən istifadə edə bilərsiniz:

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 serveri yenidən başlatmağın vaxtı gəldi!

sudo service grafana-server restart

İndi Grafana UI-də biz DataSource olaraq ClickHouse-u təyin edəcəyik.

Aşağıdakı parametrlərlə işlək konfiqurasiya əldə edə bildim:

Misal olaraq Grafana-dan istifadə edərək, Yandex.Cloud-da paylanmış xidmətlərin yerləşdirilməsi

URL olaraq verdim https://c-<cluster_id>.rw.mdb.yandexcloud.net:8443

Hamısı! CH və MySQL-ə qoşulmuş veb serveri olan bir işləyən virtual maşınımız var. Siz artıq məlumat dəstini ClickHouse-a yükləyə və idarə panelləri yarada bilərsiniz. Lakin biz hələ ki, məqsədimizə çatmamışıq və tam infrastrukturu yerləşdirməmişik.

Packer

Yandex.Cloud sizə mövcud virtual maşının disk şəklini yaratmağa imkan verir və onun əsasında istədiyiniz qədər eyni maşın yarada bilərsiniz. Bizim istifadə edəcəyimiz məhz budur. Şəkli rahat şəkildə yığmaq üçün aləti götürün Packer HashiCorp-dan. Şəklin qurulması üçün təlimatları olan bir json faylını daxil edir.

Bizim json faylımız iki blokdan ibarət olacaq: inşaatçılar və təchizatçılar. Birinci blok bir varlıq kimi təsvirin özünün parametrlərini, ikincisi isə onu lazımi məzmunla doldurmaq üçün təlimatları təsvir edir.

İnşaatçılar

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

Bu şablonda siz buludda şəkil yaratmaq istədiyiniz bölmənin identifikatorunu, həmçinin bu bölmədə əvvəllər yaradılmış xidmət hesabından düymələrlə fayla gedən yolu təyin etməlisiniz. Müvafiq bölmədə fayl şəklində xidmət hesablarının və açarların yaradılması haqqında ətraflı oxuya bilərsiniz. sənədləşdirmə.

Bu konfiqurasiya disk şəklinin platforma əsasında qurulacağını söyləyir ubuntu-1804-lts, şəkil ailəsində müvafiq istifadəçi bölməsinə yerləşdirilir GRAFANA adı altında grafana-{{timestamp}}.

Təminatçılar

İndi konfiqurasiyanın daha maraqlı hissəsi üçün. O, vəziyyətini disk şəklinə salmadan əvvəl virtual maşında yerinə yetirilməli olan hərəkətlərin ardıcıllığını təsvir edəcək.

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

Burada bütün hərəkətlər 3 mərhələyə bölünür. Birinci mərhələdə köməkçi qovluq yaradan sadə skript icra olunur.

hazırlamaq-ctg.sh:

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

Növbəti mərhələdə biz bu qovluğa skript yerləşdiririk, virtual maşını işə saldıqdan dərhal sonra onu işə salmaq lazımdır. Bu skript istifadəçi dəyişənlərini Grafana konfiqurasiyasında təyin edəcək və veb serveri yenidən işə salacaq.

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

Bundan sonra görüləsi 3 iş var:
1) paketləri quraşdırın
2) systemctl altında Grafana-nı işə salın və ClickHouse plaginini quraşdırın
3) virtual maşını işə saldıqdan sonra dərhal işləmək üçün setup.sh skriptini növbəyə qoyun.

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;

İndi Packer-i işə salmaq və çıxış şəklini göstərilən bölməyə yerləşdirmək qalır. Virtual maşın yaratarkən onu yükləmə diski kimi seçə və işə saldıqdan sonra hazır Grafana veb serverini əldə edə bilərsiniz.

Misal olaraq Grafana-dan istifadə edərək, Yandex.Cloud-da paylanmış xidmətlərin yerləşdirilməsi
Misal olaraq Grafana-dan istifadə edərək, Yandex.Cloud-da paylanmış xidmətlərin yerləşdirilməsi

Nümunə qrupu və balanslaşdırıcı

Bir çox eyni Grafana veb serverləri yaratmağa imkan verən disk şəkli olduqda, biz nümunə qrupu yarada bilərik. Yandex.Cloud platformasında bu termin eyni xüsusiyyətlərə malik virtual maşınların birliyinə aiddir. Nümunə qrupu yaratarkən, bu qrupdakı bütün maşınların prototipi, sonra qrupun özünün xüsusiyyətləri (məsələn, aktiv maşınların minimum və maksimum sayı) konfiqurasiya edilir. Cari nömrə bu meyara uyğun gəlmirsə, nümunə qrupunun özü lazımsız maşınları siləcək və ya şəkil və bənzərlikdə yenilərini yaradacaq.

Tapşırığımızın bir hissəsi olaraq, əvvəllər yaradılmış disk təsvirindən yaradılacaq veb serverlərin nümunə qrupu yaradacağıq.

Misal olaraq Grafana-dan istifadə edərək, Yandex.Cloud-da paylanmış xidmətlərin yerləşdirilməsi

Misal olaraq Grafana-dan istifadə edərək, Yandex.Cloud-da paylanmış xidmətlərin yerləşdirilməsi

Son instansiya qrup parametrləri həqiqətən diqqətəlayiqdir. Load Balancer ilə inteqrasiyada olan hədəf qrup, bir neçə düyməyə basaraq bu qrupun virtual maşınlarının üstündə L3 balanslaşdırıcısı qurmağa kömək edəcək.

Misal olaraq Grafana-dan istifadə edərək, Yandex.Cloud-da paylanmış xidmətlərin yerləşdirilməsi

Balanslaşdırıcını qurarkən iki vacib məqamı həyata keçirdim:

  1. Mən bunu elə etdim ki, balanslaşdırıcı 80-ci portda istifadəçi trafikini qəbul etsin və onu Grafana-nın yaşadığı 3000 virtual maşın portuna yönləndirdim.
  2. 3000 portunda ping edərək maşın sağlamlığı yoxlamalarını qurun.

Misal olaraq Grafana-dan istifadə edərək, Yandex.Cloud-da paylanmış xidmətlərin yerləşdirilməsi

mini cəmi

Nəhayət, biz istədiyiniz tətbiq infrastrukturunu əl ilə yerləşdirə bildik və indi yüksək davamlı Grafana xidmətimiz var. Verilənlər toplusunu ona yükləmək üçün yalnız tətbiqin giriş nöqtəsi və ClickHouse klasterinin sahibi kimi balanslaşdırıcının IP ünvanını bilmək lazımdır.

Qələbə kimi görünür? Bəli, qələbə. Amma hələ də bir şey məni narahat edir. Yuxarıdakı bütün proses çoxlu əl hərəkətləri tələb edir və ümumiyyətlə ölçülənmir, mümkünsə onu avtomatlaşdırmaq istəyirəm. Bu, növbəti bölmənin diqqət mərkəzində olacaq.

Terraform ilə inteqrasiya

Biz yenidən HashiCorp adlı alətdən istifadə edəcəyik Terraform. O, istifadəçi tərəfindən ötürülən bir neçə dəyişən əsasında bir düyməni basmaqla bütün proqram infrastrukturunu yerləşdirməyə kömək edəcək. Müxtəlif istifadəçilərin müxtəlif bölmələrində bir neçə dəfə işlədilə bilən resept yazaq.

Terraform ilə bütün işlər konfiqurasiya faylının yazılması ilə başa çatır (*.tf) və onun əsasında infrastrukturun yaradılması.

Dəyişənlər

Faylın ən əvvəlində gələcək infrastrukturun harada və necə yerləşdiriləcəyini müəyyən edən dəyişənləri çıxaracağıq.

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

Tətbiqin yerləşdirilməsinin bütün prosesi disk şəklinin yaradılmasına və bu dəyişənlərin təyin edilməsinə qədər davam edəcək. Onların nəyə görə məsuliyyət daşıdığını izah edim:

oauth_token — buluda daxil olmaq üçün əlamət. tərəfindən əldə edilə bilər əlaqə.
cloud_id - tətbiqi yerləşdirəcəyimiz buludun identifikatoru
qovluq_id — tətbiqi yerləşdirəcəyimiz bölmənin identifikatoru
xidmət_hesabı_id — buludun müvafiq bölməsində xidmət hesabının identifikatoru.
image_id - Packer istifadə edərək əldə edilmiş disk təsvirinin identifikatoru
istifadəçi adı и parol - həm verilənlər bazasına, həm də Grafana veb serverinə daxil olmaq üçün istifadəçi adı və şifrə
dbname - CH və MySQL klasterlərində verilənlər bazası adı
ictimai_açar_yolu - adı altında qoşulmaq üçün istifadə edilə bilən ictimai ssh açarınızla fayla gedən yol ubuntu veb serverləri olan virtual maşınlara

Provayder ayarı

İndi Terraform provayderini konfiqurasiya etməlisiniz - bizim vəziyyətimizdə Yandex:

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

Görə bilərsiniz ki, burada yuxarıda müəyyən edilmiş dəyişənlərdən istifadə edirik.

Şəbəkə və klasterlər

İndi gəlin infrastrukturumuzun elementlərinin əlaqə saxlayacağı bir şəbəkə yaradaq, üç alt şəbəkə (hər bölgədə bir) və CH və MySQL klasterlərini yüksəldək.


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

Gördüyünüz kimi, iki klasterin hər biri üç Əlçatımlılıq Zonasında yerləşdirilməklə kifayət qədər nasazlığa dözümlü olmaq üçün qurulmuşdur.

Veb serverləri

Deyəsən, eyni ruhda davam edə bilərsiniz, amma çətinliklə üzləşdim. Bundan əvvəl mən əvvəlcə MySQL klasterini qaldırdım və yalnız bundan sonra onun identifikatorunu bilə-bilə istədiyim konfiqurasiyaya malik disk şəklini topladım, burada hostu klasterə təyin etdim. Ancaq indi biz Terraformun işə salınmasından əvvəl, o cümlədən təsvirin qurulması zamanı klaster ID-sini bilmirik. Buna görə də aşağıdakılara müraciət etməli oldum hiylə.

Amazon-un metadata xidmətindən istifadə edərək, bəzi parametrləri virtual maşına ötürəcəyik, o, qəbul edib emal edəcəkdir. Klasterin MySQL hostunun metadatasına və istifadəçinin başladıqdan sonra Terraform faylında göstərdiyi istifadəçi adı-paroluna keçmək üçün maşın lazımdır. Faylın məzmununu bir az dəyişdirin setup.sh, virtual maşın işə salındıqda işləyir.

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 qrupu və balanslaşdırıcı

Yeni disk şəklini yenidən qurduqdan sonra nəhayət Terraform üçün faylımızı əlavə edə bilərik.

Mövcud disk şəklini istifadə etmək istədiyimizi bildiririk:

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

İndi nümunə qrupu yaradaq:

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

Metadataya necə keçdiyimizə diqqət yetirməyə dəyər cluster_uri, username и password. Başlanğıcda onu əldə edəcək və Grafana konfiqurasiyasına qoyacaq onların virtual maşınıdır.

Söhbət balanslaşdırıcıdan gedir.

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 az şəkər

Çox az qaldı. İnfrastruktur yerləşdirildikdən sonra siz Grafana UI-yə keçməli və Data Mənbəsi kimi CH klasterini (identifikatorunu hələ də əldə etməlisiniz) əl ilə əlavə etməli olacaqsınız. Lakin Terraform klaster identifikatorunu bilir. Gəlin onu işi bitirməyə vadar edək.

Gəlin yeni bir provayder əlavə edək - Grafana və balanslaşdırıcı IP-ni host kimi keçirək. Terraformun balanslaşdırıcısının təyin etdiyi maşında etdiyi bütün dəyişikliklər MySQL-də və buna görə də bütün digər maşınlarda artacaq.

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

Gəlin daraqlayaq

Balanslaşdırıcı IP və ClickHouse klaster hostunu göstərin

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

Qaçmaq olar

Hamısı! Konfiqurasiya faylımız hazırdır və biz dəyişənləri təyin etməklə Terraform-a yuxarıda təsvir etdiyimiz hər şeyi qaldırmasını söyləyə bilərik. Bütün proses mənə təxminən 15 dəqiqə çəkdi.
Sonda gözəl bir mesaj görə bilərsiniz:

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

Buludda isə yüksəldilmiş infrastrukturun elementləri görünəcək:

Misal olaraq Grafana-dan istifadə edərək, Yandex.Cloud-da paylanmış xidmətlərin yerləşdirilməsi

Yekunlaşdırmaq

İndi Grafana nümunəsindən istifadə edərək, hər biriniz Yandex.Cloud platformasında geniş bulud arxitekturasına malik proqramları yerləşdirə bilərsiniz. HashiCorp-dan Packer və Terraform kimi faydalı alətlər bu işdə sizə kömək edə bilər. Ümid edirəm ki, bu məqalə kimsə üçün faydalı olacaq 🙂

PS Aşağıda mən bu məqalədə qeyd etdiyim fraqmentləri olan Packer və Terraform üçün hazır reseptləri tapa biləcəyiniz depoya bir keçid əlavə edəcəyəm.

anbar

Mənbə: www.habr.com

Добавить комментарий