Penerapan layanan terdistribusi di Yandex.Cloud menggunakan Grafana sebagai contoh

Halo semua! Sebagai bagian dari tugas kuliah saya, saya meneliti kemampuan platform cloud domestik seperti Yandex.Cloud. Platform ini menawarkan berbagai layanan untuk memecahkan masalah praktis. Namun, terkadang Anda perlu menyiapkan aplikasi cloud Anda sendiri dengan infrastruktur yang cukup luas berdasarkan layanan tersebut. Pada artikel ini saya ingin berbagi pengalaman saya dalam menerapkan aplikasi semacam itu.

Penerapan layanan terdistribusi di Yandex.Cloud menggunakan Grafana sebagai contoh

Apa yang ingin Anda terima?

grafana — alat yang ampuh untuk memecahkan masalah analitis atau memantau masalah sistem apa pun. Dalam konfigurasi dasarnya, ini adalah mesin virtual dengan server web Grafana, serta database (ClickHouse, InfluxDB, dll.) dengan kumpulan data yang menjadi dasar analisis.

Setelah meluncurkan mesin virtual dengan server web, Anda dapat membuka hostnya dan mendapatkan UI yang indah, menentukan database sebagai sumber untuk pekerjaan lebih lanjut, membuat dasbor dan grafik.

Penerapan layanan terdistribusi di Yandex.Cloud menggunakan Grafana sebagai contoh

Versi dasar memiliki satu kelemahan signifikan - versi ini tidak toleran terhadap kesalahan sama sekali. Artinya, seluruh fungsionalitas aplikasi bergantung pada kelangsungan satu mesin virtual. Jika menolak atau 10 orang membuka UI secara bersamaan, maka akan timbul masalah.

Masalah tersebut dapat diselesaikan secara sederhana: Anda hanya perlu... menggunakan banyak mesin virtual yang identik dengan server web dan menempatkannya di bawah penyeimbang L3. Tapi tidak semuanya begitu jelas di sini. Grafana menyimpan pengaturan pengguna (jalur ke database, dasbor, grafik, dll.) langsung di disk mesin virtualnya. Jadi, jika kami mengubah beberapa pengaturan di UI, perubahan ini hanya akan terlihat di mesin virtual yang dikirimkan penyeimbang kepada kami. Hal ini akan menyebabkan pengaturan aplikasi kita tidak konsisten, menyebabkan masalah saat peluncuran dan penggunaan.

Di sini database lain akan membantu, misalnya MySQL atau yang setara. Kami memberi tahu Grafana bahwa dia harus menyimpan pengaturan pengguna di database “cadangan” ini. Setelah itu, cukup menentukan jalur ke database ini satu kali pada setiap mesin, dan mengedit semua pengaturan pengguna lainnya pada mesin virtual mana pun; pengaturan tersebut akan diperluas ke mesin virtual lainnya.

Berikut adalah diagram infrastruktur aplikasi akhir:

Penerapan layanan terdistribusi di Yandex.Cloud menggunakan Grafana sebagai contoh

Mari belajar mengangkat dengan tangan kita

MySQL dan ClickHouse

Sebelum menerapkan aplikasi semacam itu hanya dengan mengklik sebuah tombol, penting untuk mempelajari cara menangani setiap komponennya dan mengintegrasikannya satu sama lain.

Di sini Yandex.Cloud akan membantu kami, yang menyediakan penyeimbang L3, ClickHouse dan MySQL sebagai layanan terkelola. Pengguna hanya perlu menentukan parameter dan menunggu hingga platform membuat semuanya berfungsi dengan baik.

Saya mendaftar, membuat cloud dan akun pembayaran. Setelah itu, saya pergi ke cloud dan mengatur cluster MySQL dan ClickHouse dengan pengaturan minimal. Saya menunggu sampai mereka menjadi aktif.

Penerapan layanan terdistribusi di Yandex.Cloud menggunakan Grafana sebagai contohPenerapan layanan terdistribusi di Yandex.Cloud menggunakan Grafana sebagai contoh

Anda juga harus ingat untuk membuat database di setiap cluster dan mengkonfigurasi akses ke sana menggunakan login dan kata sandi. Saya tidak akan menjelaskan secara detail di sini - semuanya cukup jelas di antarmuka.

Detail yang tidak jelas adalah bahwa database ini memiliki banyak host, yang memastikan toleransi kesalahannya. Namun, Grafana memerlukan satu host untuk setiap database yang digunakannya. Membaca panjang dokumentasi Awan membawaku pada suatu keputusan. Ternyata itu adalah inang dari spesies tersebut c-<cluster_id>.rw.mdb.yandexcloud.net dipetakan ke host master cluster yang aktif saat ini dengan ID yang sesuai. Hal inilah yang akan kami berikan kepada Grafana.

server web

Sekarang terserah server web. Mari kita tingkatkan mesin virtual biasa dengan Linux dan konfigurasikan Grafana secara manual di dalamnya.

Penerapan layanan terdistribusi di Yandex.Cloud menggunakan Grafana sebagai contoh

Penerapan layanan terdistribusi di Yandex.Cloud menggunakan Grafana sebagai contoh

Mari terhubung melalui ssh dan instal paket yang diperlukan.

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 

Setelah itu, jalankan Grafana di bawah systemctl dan instal plugin untuk bekerja dengan ClickHouse (ya, itu tidak disertakan dalam paket dasar).

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

Itu saja, setelah itu dengan perintah sederhana

sudo service grafana-server start

kita akan memulai server web. Sekarang Anda dapat memasukkan alamat IP eksternal mesin virtual di browser, menentukan port 3000 dan melihat Grafana UI yang indah.
Penerapan layanan terdistribusi di Yandex.Cloud menggunakan Grafana sebagai contoh

Namun jangan terburu-buru, sebelum mengatur Grafana, Anda harus ingat untuk memberitahukan jalur ke MySQL untuk menyimpan pengaturan di sana.

Seluruh konfigurasi web server Grafana ada di dalam file /etc/grafana/grafana.ini. Baris yang diperlukan terlihat seperti ini:

;url =

Kami mengatur host ke cluster MySQL. File yang sama berisi login dan password untuk mengakses Grafana pada gambar di atas, yang secara default keduanya sama admin.

Anda dapat menggunakan perintah 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

Saatnya me-restart server web!

sudo service grafana-server restart

Sekarang di Grafana UI kita akan menentukan ClickHouse sebagai DataSource.

Saya dapat mencapai konfigurasi yang berfungsi dengan pengaturan berikut:

Penerapan layanan terdistribusi di Yandex.Cloud menggunakan Grafana sebagai contoh

Saya tentukan sebagai URL https://c-<cluster_id>.rw.mdb.yandexcloud.net:8443

Semua! Kami memiliki satu mesin virtual yang berfungsi dengan server web yang terhubung ke CH dan MySQL. Anda sudah dapat mengunggah kumpulan data ke ClickHouse dan membuat dasbor. Namun, kami belum mencapai tujuan kami dan belum mengerahkan infrastruktur yang lengkap.

Packer

Yandex.Cloud memungkinkan Anda membuat image disk dari mesin virtual yang ada, dan berdasarkan itu - sejumlah mesin yang identik satu sama lain. Inilah yang akan kami gunakan. Untuk merakit gambar dengan mudah, ambil alatnya Packer dari HashiCorp. Dibutuhkan sebagai masukan file json dengan instruksi untuk merakit gambar.

File json kami akan terdiri dari dua blok: pembangun dan penyedia. Blok pertama menjelaskan parameter gambar itu sendiri sebagai suatu entitas, dan blok kedua menjelaskan instruksi untuk mengisinya dengan konten yang diperlukan.

Pembangun

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

Dalam templat ini, Anda perlu mengatur pengidentifikasi bagian di cloud tempat Anda ingin membuat gambar, serta jalur ke file dengan kunci dari akun layanan yang sebelumnya dibuat di bagian ini. Anda dapat membaca lebih lanjut tentang membuat akun layanan dan kunci dalam bentuk file di bagian terkait dokumentasi.

Konfigurasi ini menyatakan bahwa image disk akan dibuat berdasarkan platform ubuntu-1804-lts, ditempatkan di bagian pengguna yang sesuai dalam keluarga gambar GRAFANA atas nama grafana-{{timestamp}}.

Penyedia

Sekarang sampai pada bagian konfigurasi yang lebih menarik. Ini akan menjelaskan urutan tindakan yang perlu dilakukan pada mesin virtual sebelum membekukan statusnya menjadi image disk.

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

Disini semua tindakan dibagi menjadi 3 tahap. Pada tahap pertama, skrip sederhana dijalankan yang membuat direktori tambahan.

persiapkan-ctg.sh:

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

Pada tahap selanjutnya, kami menempatkan skrip di direktori ini, yang harus diluncurkan segera setelah memulai mesin virtual. Skrip ini akan memasukkan variabel pengguna yang perlu didaftarkan ke konfigurasi Grafana dan memulai ulang server web.

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

Setelah ini ada 3 hal yang harus dilakukan:
1) instal paket
2) jalankan Grafana di bawah systemctl dan instal plugin ClickHouse
3) letakkan skrip setup.sh di antrian peluncuran segera setelah menyalakan mesin virtual.

instal-paket.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

jalankan-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;

Sekarang yang tersisa hanyalah menjalankan Packer dan menempatkan gambar keluaran di bagian yang ditentukan. Saat membuat mesin virtual, Anda dapat memilihnya sebagai disk boot dan setelah peluncuran Anda akan menerima server web Grafana yang sudah jadi.

Penerapan layanan terdistribusi di Yandex.Cloud menggunakan Grafana sebagai contoh
Penerapan layanan terdistribusi di Yandex.Cloud menggunakan Grafana sebagai contoh

Grup instance dan penyeimbang

Setelah kita memiliki image disk yang memungkinkan kita membuat banyak server web Grafana yang identik, kita dapat membuat grup instance. Pada platform Yandex.Cloud, istilah ini mengacu pada gabungan mesin virtual yang memiliki karakteristik yang sama. Saat membuat grup instance, prototipe semua mesin dalam grup ini dikonfigurasi, dan kemudian karakteristik grup itu sendiri (misalnya, jumlah minimum dan maksimum mesin aktif). Jika nomor saat ini tidak memenuhi kriteria ini, maka grup instance akan menghapus mesin yang tidak diperlukan atau membuat mesin baru sesuai gambarnya sendiri.

Sebagai bagian dari tugas kita, kita akan membuat grup instance server web yang akan dihasilkan dari image disk yang dibuat sebelumnya.

Penerapan layanan terdistribusi di Yandex.Cloud menggunakan Grafana sebagai contoh

Penerapan layanan terdistribusi di Yandex.Cloud menggunakan Grafana sebagai contoh

Apa yang benar-benar luar biasa adalah pengaturan grup terakhir. Grup target yang terintegrasi dengan Load Balancer akan membantu Anda mengonfigurasi penyeimbang L3 di atas mesin virtual grup ini dengan mengklik beberapa tombol.

Penerapan layanan terdistribusi di Yandex.Cloud menggunakan Grafana sebagai contoh

Saat menyiapkan penyeimbang, saya menerapkan dua poin penting:

  1. Saya membuat penyeimbang menerima lalu lintas pengguna pada port 80 dan mengarahkannya ke port 3000 mesin virtual, tepatnya tempat tinggal Grafana.
  2. Saya mengatur pemeriksaan kelayakan mesin dengan melakukan ping ke port 3000.

Penerapan layanan terdistribusi di Yandex.Cloud menggunakan Grafana sebagai contoh

Ringkasan kecil

Terakhir, kami dapat menerapkan infrastruktur aplikasi yang diinginkan secara manual, dan kini kami memiliki layanan Grafana yang sangat tangguh. Anda hanya perlu mengetahui alamat IP penyeimbang sebagai titik masuk ke aplikasi dan host cluster ClickHouse untuk memuat dataset ke dalamnya.

Tampaknya seperti sebuah kemenangan? Ya, kemenangan. Tapi ada sesuatu yang masih membuatku bingung. Keseluruhan proses di atas memerlukan banyak langkah manual dan tidak dapat diskalakan sama sekali; Saya ingin mengotomatiskannya jika memungkinkan. Bagian selanjutnya akan membahas hal ini.

Integrasi terraform

Kami akan kembali menggunakan alat dari HashiCorp yang disebut Terraform. Ini akan membantu Anda menerapkan seluruh infrastruktur aplikasi dengan mengklik tombol, berdasarkan beberapa variabel yang diteruskan oleh pengguna. Mari kita menulis resep yang dapat dijalankan berkali-kali di bagian berbeda dari pengguna berbeda.

Semua pekerjaan dengan Terraform dimulai dengan menulis file konfigurasi (*.tf) dan penciptaan infrastruktur berdasarkan itu.

Variabel

Di awal file, kami akan menyertakan variabel yang menentukan di mana dan bagaimana infrastruktur masa depan akan diterapkan.

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

Seluruh proses penerapan aplikasi akan mengarah pada pembuatan image disk dan pengaturan variabel-variabel ini. Izinkan saya menjelaskan apa tanggung jawab mereka:

oauth_token — token untuk mengakses cloud. Dapat diperoleh dengan link.
cloud_id — pengidentifikasi cloud tempat kami akan menyebarkan aplikasi
folder_id — pengidentifikasi bagian tempat kami akan menyebarkan aplikasi
id_akun_layanan — pengidentifikasi akun layanan di bagian cloud yang sesuai.
gambar_id — pengidentifikasi gambar disk yang diperoleh menggunakan Packer
nama pengguna и kata sandi — nama pengguna dan kata sandi untuk mengakses database dan server web Grafana
nama db — nama database di dalam cluster CH dan MySQL
jalur_kunci_publik — jalur ke file dengan kunci ssh publik Anda, yang dapat Anda gunakan untuk terhubung dengan nama tersebut ubuntu ke mesin virtual dengan server web

Pengaturan penyedia

Sekarang Anda perlu mengonfigurasi penyedia Terraform - dalam kasus kami, Yandex:

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

Anda akan melihat bahwa di sini kita menggunakan variabel yang ditentukan di atas.

Jaringan dan cluster

Sekarang kita akan membuat jaringan di mana elemen infrastruktur kita akan berkomunikasi, tiga subnet (satu di setiap wilayah) dan meningkatkan cluster CH dan 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
  }
}

Seperti yang Anda lihat, masing-masing dari dua cluster dibuat cukup toleran terhadap kesalahan dengan ditempatkan di tiga zona ketersediaan.

Server web

Tampaknya kami dapat melanjutkan dengan semangat yang sama, tetapi saya menemui kesulitan. Sebelum ini, saya pertama kali membangun cluster MySQL dan hanya setelah itu, mengetahui ID-nya, saya mengumpulkan image disk dengan konfigurasi yang diperlukan, di mana saya menentukan host untuk cluster tersebut. Namun sekarang kami tidak mengetahui ID cluster sebelum meluncurkan Terraform, termasuk pada saat pembuatan image. Oleh karena itu, saya harus melakukan hal berikut menipu.

Dengan menggunakan layanan metadata Amazon, kami akan meneruskan beberapa parameter ke mesin virtual, yang akan diterima dan diproses. Kami memerlukan mesin untuk membuka metadata di belakang host cluster MySQL dan nama pengguna-kata sandi, yang ditentukan pengguna dalam file Terraform, setelah memulai. Mari kita ubah sedikit isi filenya setup.sh, yang berjalan saat mesin virtual dihidupkan.

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

Grup Intance dan Penyeimbang

Setelah membuat ulang image disk baru, kami akhirnya dapat menambahkan file untuk Terraform.

Mari kita tunjukkan bahwa kita ingin menggunakan image disk yang ada:

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

Sekarang mari kita buat grup instance:

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

Sebaiknya perhatikan cara kami meneruskannya ke metadata cluster_uri, username и password. Ini adalah mesin virtual yang akan dikeluarkan saat startup dan dimasukkan ke dalam konfigurasi Grafana.

Terserah penyeimbang.

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

Sedikit gula

Hanya tersisa sedikit. Setelah infrastruktur diterapkan, Anda harus membuka Grafana UI dan secara manual menambahkan cluster CH (yang ID-nya masih perlu diperoleh) sebagai Sumber Data. Tapi Terraform mengetahui ID cluster. Mari kita percayakan padanya untuk menyelesaikan masalah ini.

Mari tambahkan penyedia baru - Grafana, dan berikan alamat IP penyeimbang sebagai host. Semua perubahan yang dilakukan Terraform pada mesin yang ditentukan oleh penyeimbangnya akan berkembang di MySQL, dan juga di semua mesin lainnya.

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

Ayo sisir rambut kita

Mari kita tampilkan alamat IP penyeimbang dan host cluster 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"
}

Dapat berlari

Semua! File konfigurasi kita sudah siap dan kita dapat, dengan mengatur variabel, memberitahu Terraform untuk memunculkan semua yang kita jelaskan di atas. Seluruh proses memakan waktu sekitar 15 menit.
Pada akhirnya Anda dapat melihat pesan yang indah:

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

Dan di cloud, elemen infrastruktur yang ditingkatkan akan terlihat:

Penerapan layanan terdistribusi di Yandex.Cloud menggunakan Grafana sebagai contoh

Menyimpulkan

Sekarang, dengan menggunakan Grafana sebagai contoh, Anda masing-masing dapat menerapkan aplikasi dengan arsitektur cloud yang luas di platform Yandex.Cloud. Alat bermanfaat dari HashiCorp seperti Packer dan Terraform dapat membantu Anda dalam hal ini. Saya harap seseorang menemukan artikel ini bermanfaat :)

PS Di bawah ini saya akan melampirkan tautan ke repositori tempat Anda dapat menemukan resep siap pakai untuk Packer dan Terraform, potongannya saya sediakan di artikel ini.

gudang

Sumber: www.habr.com

Tambah komentar