Penggunaan perkhidmatan teragih dalam Yandex.Cloud menggunakan Grafana sebagai contoh

Hai semua! Sebagai sebahagian daripada kerja kursus saya, saya menyelidik keupayaan platform awan domestik seperti Yandex.Cloud. Platform ini menawarkan pelbagai perkhidmatan untuk menyelesaikan masalah praktikal. Walau bagaimanapun, kadangkala anda perlu menyediakan aplikasi awan anda sendiri dengan infrastruktur yang agak luas berdasarkan perkhidmatan ini. Dalam artikel ini saya ingin berkongsi pengalaman saya dalam menggunakan aplikasi sedemikian.

Penggunaan perkhidmatan teragih dalam Yandex.Cloud menggunakan Grafana sebagai contoh

Apa yang anda mahu terima?

grafana β€” alat yang berkuasa untuk menyelesaikan masalah analisis atau memantau masalah mana-mana sistem. Dalam konfigurasi asasnya, ini ialah mesin maya dengan pelayan web Grafana, serta pangkalan data (ClickHouse, InfluxDB, dsb.) dengan set data yang mana analitik akan berasaskan.

Selepas melancarkan mesin maya dengan pelayan web, anda boleh pergi ke hosnya dan dapatkan UI yang cantik, tentukan pangkalan data sebagai sumber untuk kerja selanjutnya, buat papan pemuka dan graf.

Penggunaan perkhidmatan teragih dalam Yandex.Cloud menggunakan Grafana sebagai contoh

Versi asas mempunyai satu kelemahan yang ketara - ia tidak toleran terhadap kesalahan sama sekali. Iaitu, keseluruhan fungsi aplikasi bergantung pada daya maju satu mesin maya. Jika ia menolak atau 10 orang membuka UI pada masa yang sama, maka masalah akan timbul.

Ia boleh diselesaikan dengan mudah: anda hanya perlu... menggunakan banyak mesin maya yang serupa dengan pelayan web dan meletakkannya di bawah pengimbang L3. Tetapi tidak semuanya begitu jelas di sini. Grafana menyimpan tetapan pengguna (laluan ke pangkalan data, papan pemuka, graf, dll.) terus pada cakera mesin mayanya. Oleh itu, jika kami menukar beberapa tetapan dalam UI, perubahan ini akan ditunjukkan hanya pada mesin maya tempat pengimbang menghantar kami. Ini akan membawa kepada tetapan yang tidak konsisten untuk aplikasi kami, menyebabkan masalah dengan pelancaran dan penggunaan.

Di sini pangkalan data lain akan datang untuk menyelamatkan, contohnya, MySQL atau yang setaraf dengannya. Kami memberitahu Grafana bahawa dia harus menyimpan tetapan pengguna dalam pangkalan data "ganti" ini. Selepas itu, sudah cukup untuk menentukan laluan ke pangkalan data ini sekali pada setiap mesin, dan mengedit semua tetapan pengguna lain pada mana-mana mesin maya; mereka akan melanjutkan kepada yang lain.

Berikut ialah gambar rajah infrastruktur aplikasi akhir:

Penggunaan perkhidmatan teragih dalam Yandex.Cloud menggunakan Grafana sebagai contoh

Mari belajar mengangkat dengan tangan

MySQL dan ClickHouse

Sebelum menggunakan aplikasi sedemikian dengan mengklik butang, adalah perlu untuk mempelajari cara mengendalikan setiap komponennya dan mengintegrasikannya antara satu sama lain.

Di sini Yandex.Cloud akan membantu kami, yang menyediakan pengimbang L3, ClickHouse dan MySQL sebagai perkhidmatan terurus. Pengguna hanya perlu menentukan parameter dan tunggu sehingga platform membawa semuanya ke dalam susunan yang berfungsi.

Saya mendaftar, mencipta awan dan akaun pembayaran. Selepas itu, saya pergi ke awan dan menyediakan kumpulan MySQL dan ClickHouse dengan tetapan minimum. Saya menunggu sehingga mereka menjadi aktif.

Penggunaan perkhidmatan teragih dalam Yandex.Cloud menggunakan Grafana sebagai contohPenggunaan perkhidmatan teragih dalam Yandex.Cloud menggunakan Grafana sebagai contoh

Anda juga perlu ingat untuk mencipta pangkalan data dalam setiap kelompok dan mengkonfigurasi akses kepadanya menggunakan log masuk dan kata laluan. Saya tidak akan menerangkan butiran di sini - semuanya agak jelas dalam antara muka.

Perincian yang tidak jelas ialah pangkalan data ini mempunyai banyak hos, yang memastikan toleransi kesalahan mereka. Walau bagaimanapun, Grafana memerlukan tepat satu hos untuk setiap pangkalan data yang berfungsi dengannya. Bacaan panjang dokumentasi Awan membawa saya kepada satu keputusan. Ia ternyata bahawa tuan rumah spesies c-<cluster_id>.rw.mdb.yandexcloud.net dipetakan ke hos induk aktif semasa kluster dengan ID yang sepadan. Inilah yang akan kami berikan kepada Grafana.

Pelayan web

Kini terpulang kepada pelayan web. Mari tingkatkan mesin maya biasa dengan Linux dan konfigurasikan Grafana secara manual padanya.

Penggunaan perkhidmatan teragih dalam Yandex.Cloud menggunakan Grafana sebagai contoh

Penggunaan perkhidmatan teragih dalam Yandex.Cloud menggunakan Grafana sebagai contoh

Mari sambung melalui ssh dan pasang pakej 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 

Selepas itu, mari jalankan Grafana di bawah systemctl dan pasang pemalam untuk bekerja dengan ClickHouse (ya, ia tidak dibekalkan dalam pakej asas).

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

Itu sahaja, selepas itu dengan arahan mudah

sudo service grafana-server start

kami akan memulakan pelayan web. Kini anda boleh memasukkan alamat IP luaran mesin maya dalam penyemak imbas, nyatakan port 3000 dan lihat UI Grafana yang cantik.
Penggunaan perkhidmatan teragih dalam Yandex.Cloud menggunakan Grafana sebagai contoh

Tetapi jangan tergesa-gesa, sebelum menyediakan Grafana, anda mesti ingat untuk memberitahu laluan ke MySQL untuk menyimpan tetapan di sana.

Keseluruhan konfigurasi pelayan web Grafana ada dalam fail /etc/grafana/grafana.ini. Baris yang diperlukan kelihatan seperti ini:

;url =

Kami menetapkan hos kepada kluster MySQL. Fail yang sama mengandungi log masuk dan kata laluan untuk mengakses Grafana dalam gambar di atas, yang secara lalai kedua-duanya adalah sama admin.

Anda boleh menggunakan arahan 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

Sudah tiba masanya untuk memulakan semula pelayan web!

sudo service grafana-server restart

Sekarang dalam UI Grafana kami akan menentukan ClickHouse sebagai Sumber Data.

Saya dapat mencapai konfigurasi yang berfungsi dengan tetapan berikut:

Penggunaan perkhidmatan teragih dalam Yandex.Cloud menggunakan Grafana sebagai contoh

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

Semua! Kami mempunyai satu mesin maya yang berfungsi dengan pelayan web yang disambungkan ke CH dan MySQL. Anda sudah boleh memuat naik set data ke ClickHouse dan membina papan pemuka. Walau bagaimanapun, kami masih belum mencapai matlamat kami dan belum menggunakan infrastruktur yang lengkap.

Packer

Yandex.Cloud membolehkan anda mencipta imej cakera mesin maya sedia ada, dan berdasarkannya - sebarang bilangan mesin yang sama antara satu sama lain. Inilah yang akan kami gunakan. Untuk memasang imej dengan mudah, ambil alat Packer daripada HashiCorp. Ia mengambil sebagai input fail json dengan arahan untuk memasang imej.

Fail json kami akan terdiri daripada dua blok: pembina dan pembekal. Blok pertama menerangkan parameter imej itu sendiri sebagai entiti, dan blok kedua menerangkan arahan untuk mengisinya dengan kandungan yang diperlukan.

Pembina

{
"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 menetapkan pengecam bahagian dalam awan tempat anda ingin mencipta imej, serta laluan ke fail dengan kunci daripada akaun perkhidmatan yang dibuat sebelum ini dalam bahagian ini. Anda boleh membaca lebih lanjut tentang membuat akaun perkhidmatan dan kunci dalam bentuk fail dalam bahagian yang sepadan dokumentasi.

Konfigurasi ini mengatakan bahawa imej cakera akan dibina berdasarkan platform ubuntu-1804-lts, diletakkan di bahagian pengguna yang sesuai dalam keluarga imej GRAFANA di bawah nama grafana-{{timestamp}}.

Pemberi rezeki

Kini datang bahagian konfigurasi yang lebih menarik. Ia akan menerangkan urutan tindakan yang perlu dilakukan pada mesin maya sebelum membekukan keadaannya ke dalam imej cakera.

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

Di sini semua tindakan dibahagikan kepada 3 peringkat. Pada peringkat pertama, skrip mudah dilaksanakan yang mencipta direktori tambahan.

prepare-ctg.sh:

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

Pada peringkat seterusnya, kami meletakkan skrip dalam direktori ini, yang perlu dilancarkan serta-merta selepas memulakan mesin maya. Skrip ini akan meletakkan pembolehubah pengguna yang perlu didaftarkan dalam konfigurasi Grafana dan memulakan semula pelayan 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

Selepas ini ada 3 perkara yang perlu dilakukan:
1) pasang pakej
2) jalankan Grafana di bawah systemctl dan pasang pemalam ClickHouse
3) letakkan skrip setup.sh dalam baris gilir pelancaran sejurus selepas menghidupkan mesin maya.

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;

Sekarang yang tinggal hanyalah menjalankan Packer dan mendapatkan imej output diletakkan di bahagian yang ditentukan. Apabila mencipta mesin maya, anda boleh memilihnya sebagai cakera but dan selepas pelancaran anda akan menerima pelayan web Grafana siap sedia.

Penggunaan perkhidmatan teragih dalam Yandex.Cloud menggunakan Grafana sebagai contoh
Penggunaan perkhidmatan teragih dalam Yandex.Cloud menggunakan Grafana sebagai contoh

Kumpulan contoh dan pengimbang

Sebaik sahaja kami mempunyai imej cakera yang membolehkan kami mencipta banyak pelayan web Grafana yang serupa, kami boleh mencipta kumpulan contoh. Pada platform Yandex.Cloud, istilah ini merujuk kepada penyatuan mesin maya yang mempunyai ciri yang sama. Apabila membuat kumpulan contoh, prototaip semua mesin dalam kumpulan ini dikonfigurasikan, dan kemudian ciri-ciri kumpulan itu sendiri (contohnya, bilangan minimum dan maksimum mesin aktif). Jika nombor semasa tidak memenuhi kriteria ini, maka kumpulan contoh itu sendiri akan mengalih keluar mesin yang tidak diperlukan atau mencipta yang baharu dalam imejnya sendiri.

Sebagai sebahagian daripada tugas kami, kami akan mencipta kumpulan contoh pelayan web yang akan dijana daripada imej cakera yang dibuat sebelum ini.

Penggunaan perkhidmatan teragih dalam Yandex.Cloud menggunakan Grafana sebagai contoh

Penggunaan perkhidmatan teragih dalam Yandex.Cloud menggunakan Grafana sebagai contoh

Apa yang benar-benar luar biasa ialah persediaan kumpulan contoh terakhir. Kumpulan sasaran dalam penyepaduan dengan Pengimbang Beban akan membantu anda mengkonfigurasi pengimbang L3 di atas mesin maya kumpulan ini dengan mengklik beberapa butang.

Penggunaan perkhidmatan teragih dalam Yandex.Cloud menggunakan Grafana sebagai contoh

Semasa menyediakan pengimbang, saya melaksanakan dua perkara penting:

  1. Saya membuat pengimbang menerima trafik pengguna pada port 80 dan mengalihkannya ke port 3000 mesin maya, tepat di mana Grafana tinggal.
  2. Saya menyediakan menyemak daya maju mesin dengan pingnya ke port 3000.

Penggunaan perkhidmatan teragih dalam Yandex.Cloud menggunakan Grafana sebagai contoh

Ringkasan mini

Akhirnya, kami dapat menggunakan infrastruktur aplikasi yang diingini secara manual, dan kini kami mempunyai perkhidmatan Grafana yang sangat berdaya tahan. Anda hanya perlu mengetahui alamat IP pengimbang sebagai titik masuk ke aplikasi dan hos kluster ClickHouse untuk memuatkan set data ke dalamnya.

Ia kelihatan seperti kemenangan? Ya, kemenangan. Tetapi sesuatu masih mengelirukan saya. Keseluruhan proses di atas memerlukan banyak langkah manual dan tidak boleh skala sama sekali; Saya ingin mengautomasikannya jika boleh. Inilah bahagian seterusnya yang akan dikhaskan.

Penyepaduan terraform

Kami sekali lagi akan menggunakan alat daripada HashiCorp yang dipanggil Terraform. Ia akan membantu anda menggunakan keseluruhan infrastruktur aplikasi dengan klik butang, berdasarkan beberapa pembolehubah yang diluluskan oleh pengguna. Mari tulis resipi yang boleh dijalankan berbilang kali dalam bahagian berbeza pengguna yang berbeza.

Semua kerja dengan Terraform adalah untuk menulis fail konfigurasi (*.tf) dan penciptaan infrastruktur berdasarkannya.

Pembolehubah

Pada permulaan fail, kami akan memasukkan pembolehubah yang menentukan tempat dan cara infrastruktur masa depan akan digunakan.

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

Keseluruhan proses penggunaan aplikasi akan turun untuk membina imej cakera dan menetapkan pembolehubah ini. Biar saya terangkan apa yang mereka bertanggungjawab:

oauth_token β€” tanda untuk mengakses awan. Boleh diperolehi oleh pautan.
cloud_id β€” pengecam awan tempat kami akan menggunakan aplikasi
folder_id β€” pengecam bahagian tempat kami akan menggunakan aplikasi
id_akaun perkhidmatan β€” pengecam akaun perkhidmatan dalam bahagian awan yang sepadan.
id_gambar β€” pengecam imej cakera yang diperoleh menggunakan Packer
nama pengguna ΠΈ kata laluan β€” nama pengguna dan kata laluan untuk mengakses kedua-dua pangkalan data dan pelayan web Grafana
dbname β€” nama pangkalan data dalam kelompok CH dan MySQL
public_key_path β€” laluan ke fail dengan kunci ssh awam anda, yang boleh anda gunakan untuk menyambung di bawah nama ubuntu kepada mesin maya dengan pelayan web

Persediaan pembekal

Kini anda perlu mengkonfigurasi penyedia Terraform - dalam kes kami, Yandex:

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

Anda akan perasan bahawa di sini kami menggunakan pembolehubah yang ditakrifkan di atas.

Rangkaian dan kelompok

Sekarang kami akan mencipta rangkaian di mana unsur-unsur infrastruktur kami akan berkomunikasi, tiga subnet (satu di setiap rantau) dan meningkatkan gugusan 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, setiap satu daripada dua kluster dicipta agak tahan terhadap kesalahan dengan terletak di tiga zon ketersediaan.

Pelayan web

Nampaknya kami boleh meneruskan dengan semangat yang sama, tetapi saya menghadapi kesukaran. Sebelum ini, saya mula-mula menaikkan kluster MySQL dan hanya selepas itu, mengetahui IDnya, saya mengumpul imej cakera dengan konfigurasi yang diperlukan, di mana saya menentukan hos kepada kluster. Tetapi kini kami tidak mengetahui ID kluster sebelum melancarkan Terraform, termasuk pada masa membina imej. Oleh itu, saya terpaksa menggunakan perkara berikut tipu helah.

Menggunakan perkhidmatan metadata Amazon, kami akan menghantar beberapa parameter kepada mesin maya, yang akan diterima dan diproses. Kami memerlukan mesin untuk pergi ke metadata di belakang hos kluster MySQL dan kata laluan nama pengguna, yang pengguna tentukan dalam fail Terraform, selepas bermula. Mari kita ubah sedikit kandungan fail setup.sh, yang berjalan apabila mesin maya 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

Kumpulan instance dan pengimbang

Setelah membina semula imej cakera baharu, kami akhirnya boleh menambah fail kami untuk Terraform.

Mari kita nyatakan bahawa kita mahu menggunakan imej cakera sedia ada:

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

Sekarang mari kita buat kumpulan contoh:

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

Perlu diberi perhatian tentang cara kami menyampaikannya ke dalam metadata cluster_uri, username ΠΈ password. Inilah yang akan dikeluarkan oleh mesin maya pada permulaan dan dimasukkan ke dalam konfigurasi Grafana.

Terpulang kepada pengimbang.

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 tinggal sedikit. Selepas infrastruktur digunakan, anda perlu pergi ke UI Grafana dan menambah gugusan CH secara manual (ID yang masih perlu diperoleh) sebagai Sumber Data. Tetapi Terraform mengetahui ID kluster. Mari kita amanahkan dia untuk membawa perkara itu menjadi kenyataan.

Mari tambah penyedia baharu - Grafana, dan berikan alamat IP pengimbang sebagai hos. Semua perubahan yang dibuat oleh Terraform pada mesin yang ditentukan oleh pengimbangnya akan berkembang dalam MySQL, dan oleh itu pada semua mesin lain.

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

Jom sikat rambut

Mari paparkan alamat IP pengimbang dan hos kluster 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"
}

Boleh berlari

Semua! Fail konfigurasi kami sedia dan kami boleh, dengan menetapkan pembolehubah, memberitahu Terraform untuk menaikkan semua yang kami terangkan di atas. Keseluruhan proses mengambil masa kira-kira 15 minit.
Pada akhirnya anda dapat melihat mesej 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 dalam awan, unsur-unsur infrastruktur yang dinaikkan akan kelihatan:

Penggunaan perkhidmatan teragih dalam Yandex.Cloud menggunakan Grafana sebagai contoh

Meringkaskannya

Kini, menggunakan Grafana sebagai contoh, setiap daripada anda boleh menggunakan aplikasi dengan seni bina awan yang luas pada platform Yandex.Cloud. Alat berguna daripada HashiCorp seperti Packer dan Terraform boleh membantu anda dengan perkara ini. Saya harap seseorang mendapati artikel ini berguna :)

PS Di bawah saya akan melampirkan pautan ke repositori di mana anda boleh mencari resipi siap sedia untuk Packer dan Terraform, serpihan yang saya sediakan dalam artikel ini.

repositori

Sumber: www.habr.com

Tambah komen