Panyebaran jasa anu disebarkeun dina Yandex.Cloud nganggo Grafana sabagé conto

Halo sadayana! Salaku bagian tina karya kursus kuring, kuring nalungtik kamampuan platform awan domestik sapertos Yandex.Cloud. Platform na nawiskeun sababaraha jasa pikeun ngarengsekeun masalah praktis. Nanging, sakapeung anjeun kedah nyetél aplikasi awan anjeun nyalira kalayan infrastruktur anu cukup éksténsif dumasar kana jasa ieu. Dina tulisan ieu kuring hoyong bagikeun pangalaman kuring dina nyebarkeun aplikasi sapertos kitu.

Panyebaran jasa anu disebarkeun dina Yandex.Cloud nganggo Grafana sabagé conto

Naon anu anjeun hoyong nampi?

grafana - alat anu kuat pikeun ngarengsekeun masalah analitis atanapi ngawaskeun masalah sistem naon waé. Dina konfigurasi dasarna, ieu mangrupikeun mesin virtual sareng pangladén wéb Grafana, ogé pangkalan data (ClickHouse, InfluxDB, jsb.) kalayan susunan data anu dumasar kana analitik.

Saatos ngaluncurkeun mesin virtual sareng pangladén wéb, anjeun tiasa angkat ka host na sareng kéngingkeun UI anu saé, nangtukeun pangkalan data salaku sumber pikeun padamelan salajengna, nyiptakeun dasbor sareng grafik.

Panyebaran jasa anu disebarkeun dina Yandex.Cloud nganggo Grafana sabagé conto

Versi dasarna ngagaduhan hiji kalemahan anu signifikan - éta henteu toleran kana kasalahan. Hartina, sakabéh pungsionalitas aplikasi gumantung kana viability hiji mesin virtual. Upami nampik atanapi 10 urang muka UI dina waktos anu sami, maka masalah bakal timbul.

Éta bisa direngsekeun saukur: Anjeun ngan perlu ... nyebarkeun loba mesin virtual idéntik jeung web server na nempatkeun aranjeunna dina hiji balancer L3. Tapi henteu sadayana jelas di dieu. Grafana nyimpen setélan pamaké (jalur ka database, dashboards, grafik, jsb) langsung dina disk tina mesin virtual na. Ku kituna, lamun urang ngarobah sababaraha setelan dina UI, parobahan ieu bakal reflected ngan dina mesin virtual dimana balancer dikirim kami. Ieu bakal ngakibatkeun setelan inconsistent pikeun aplikasi urang, ngabalukarkeun masalah sareng peluncuran sarta pamakéan.

Di dieu database sejen bakal datang ka nyalametkeun teh, contona, MySQL atawa sarimbag na. Kami nyarioskeun ka Grafana yén anjeunna kedah nyimpen setélan pangguna dina database "cadangan" ieu. Saatos éta, éta bakal cekap pikeun netepkeun jalur ka pangkalan data ieu sakali dina unggal mesin, sareng ngédit sadaya setélan pangguna anu sanés dina mesin virtual mana waé; aranjeunna bakal manjangkeun ka anu sanés.

Ieu diagram tina infrastruktur aplikasi ahir:

Panyebaran jasa anu disebarkeun dina Yandex.Cloud nganggo Grafana sabagé conto

Hayu urang diajar angkat ku leungeun

MySQL sareng ClickHouse

Sateuacan nyebarkeun aplikasi sapertos kitu ku ngaklik tombol, anjeun kedah diajar kumaha nanganan masing-masing komponénna sareng ngahijikeunana.

Di dieu Yandex.Cloud bakal ngabantosan kami, anu nyayogikeun kasaimbangan L3, ClickHouse sareng MySQL salaku jasa anu diurus. Pangguna ngan ukur kedah netepkeun parameter sareng antosan dugi ka platformna nyayogikeun sadayana kana urutan kerja.

Kuring ngadaptar, nyiptakeun awan sareng akun pamayaran. Saatos éta, kuring angkat ka méga sareng nyetél klaster MySQL sareng ClickHouse kalayan setélan minimal. Kuring antosan dugi aranjeunna janten aktip.

Panyebaran jasa anu disebarkeun dina Yandex.Cloud nganggo Grafana sabagé contoPanyebaran jasa anu disebarkeun dina Yandex.Cloud nganggo Grafana sabagé conto

Anjeun ogé kedah émut pikeun nyiptakeun pangkalan data dina unggal klaster sareng ngonpigurasikeun aksés ka éta nganggo login sareng kecap akses. Kuring moal asup kana detil di dieu - sagalana geus cukup atra dina panganteur.

Detil anu teu jelas nyaéta yén pangkalan data ieu ngagaduhan seueur host, anu mastikeun kasabaran kasalahanana. Nanging, Grafana meryogikeun hiji host pikeun unggal pangkalan data anu dianggo. Bacaan panjang dokuméntasi Méga mawa kuring kana kaputusan. Tétéla éta host tina spésiés c-<cluster_id>.rw.mdb.yandexcloud.net dipetakeun ka master host aktif ayeuna tina kluster jeung ID pakait. Ieu naon urang bakal masihan ka Grafana.

pangladén wéb

Ayeuna terserah kana pangladén wéb. Hayu urang ngangkat mesin virtual biasa sareng Linux sareng ngonpigurasikeun Grafana sacara manual.

Panyebaran jasa anu disebarkeun dina Yandex.Cloud nganggo Grafana sabagé conto

Panyebaran jasa anu disebarkeun dina Yandex.Cloud nganggo Grafana sabagé conto

Hayu urang sambungkeun via ssh sareng pasang bungkusan anu diperyogikeun.

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 

Saatos éta, hayu urang ngajalankeun Grafana handapeun systemctl sareng pasang plugin pikeun damel sareng ClickHouse (enya, éta henteu disayogikeun dina pakét dasar).

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

Éta éta, saatos éta kalayan paréntah anu sederhana

sudo service grafana-server start

urang bakal ngamimitian web server. Ayeuna anjeun tiasa ngalebetkeun alamat IP éksternal tina mesin virtual dina browser, tangtukeun port 3000 sareng ningali UI Grafana anu éndah.
Panyebaran jasa anu disebarkeun dina Yandex.Cloud nganggo Grafana sabagé conto

Tapi entong rurusuhan, sateuacan nyetél Grafana, anjeun kedah émut nyarioskeun éta jalur ka MySQL pikeun nyimpen setélan di dinya.

Sakabéh konfigurasi pangladén wéb Grafana aya dina file /etc/grafana/grafana.ini. Garis anu diperyogikeun sapertos kieu:

;url =

Kami nyetél host kana klaster MySQL. Berkas anu sami ngandung login sareng kecap akses pikeun ngakses Grafana dina gambar di luhur, anu sacara standar duanana sami admin.

Anjeun tiasa nganggo paréntah 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

Waktosna pikeun ngamimitian deui pangladén wéb!

sudo service grafana-server restart

Ayeuna di Grafana UI urang bakal nangtukeun ClickHouse salaku DataSource.

Kuring tiasa ngahontal konfigurasi anu tiasa dianggo sareng setélan ieu:

Panyebaran jasa anu disebarkeun dina Yandex.Cloud nganggo Grafana sabagé conto

Kuring dieusian salaku URL https://c-<cluster_id>.rw.mdb.yandexcloud.net:8443

Sadayana! Kami ngagaduhan hiji mesin virtual anu tiasa dianggo sareng pangladén wéb anu nyambung ka CH sareng MySQL. Anjeun parantos tiasa unggah set data ka ClickHouse sareng ngawangun dasbor. Nanging, kami henteu acan ngahontal tujuan kami sareng henteu nyebarkeun infrastruktur anu lengkep.

Packer

Yandex.Cloud ngamungkinkeun anjeun nyiptakeun gambar disk tina mesin virtual anu tos aya, sareng dina dasarna - sajumlah mesin anu sami sareng anu sanés. Ieu persis naon urang bakal ngagunakeun. Pikeun merenah ngumpul gambar, nyandak alat Packer ti HashiCorp. Dibutuhkeun salaku input file json sareng petunjuk pikeun ngarakit gambar.

File json kami bakal diwangun ku dua blok: pembina sareng provisioner. Blok kahiji ngajelaskeun parameter gambar sorangan salaku éntitas, jeung blok kadua ngajelaskeun parentah pikeun ngeusian eta kalawan eusi diperlukeun.

tukang

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

Dina témplat ieu, anjeun kedah nyetél identifier tina bagian dina awan dimana anjeun badé nyiptakeun gambar, ogé jalur ka file kalayan konci tina akun jasa anu sateuacana didamel dina bagian ieu. Anjeun tiasa maca langkung seueur ngeunaan nyiptakeun akun jasa sareng konci dina bentuk file dina bagian anu aya dokuméntasi.

Konfigurasi ieu nyebutkeun yén gambar disk bakal diwangun dumasar kana platform nu ubuntu-1804-lts, disimpen dina bagian pamaké luyu dina kulawarga gambar GRAFANA handapeun nami grafana-{{timestamp}}.

Provisioners

Ayeuna sumping bagian anu langkung narik tina konfigurasi. Bakal ngajelaskeun runtuyan lampah nu bakal perlu dipigawé dina mesin virtual saméméh katirisan kaayaan na kana gambar 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"
        ]
        }
  ]
}

Di dieu sagala lampah dibagi kana 3 tahap. Dina tahap kahiji, skrip basajan dieksekusi anu nyiptakeun diréktori bantu.

prepare-ctg.sh:

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

Dina tahap salajengna, urang nempatkeun skrip dina diréktori ieu, anu kedah diluncurkeun langsung saatos ngamimitian mesin virtual. Skrip ieu bakal nempatkeun variabel pangguna anu kedah didaptarkeun dina konfigurasi Grafana sareng balikan deui pangladén wéb.

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

Saatos ieu, aya 3 hal anu kedah dilakukeun:
1) masang pakét
2) ngajalankeun Grafana handapeun systemctl tur masang plugin ClickHouse
3) nempatkeun skrip setup.sh dina antrian peluncuran langsung saatos ngaktipkeun mesin virtual.

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;

Ayeuna sadayana anu tetep nyaéta ngajalankeun Packer sareng kéngingkeun gambar kaluaran dina bagian anu ditangtukeun. Nalika nyieun mesin virtual, anjeun tiasa milih salaku boot disk sareng saatos peluncuran anjeun bakal nampi server wéb Grafana anu siap-siap.

Panyebaran jasa anu disebarkeun dina Yandex.Cloud nganggo Grafana sabagé conto
Panyebaran jasa anu disebarkeun dina Yandex.Cloud nganggo Grafana sabagé conto

Grup conto sareng pangimbang

Sakali kami ngagaduhan gambar disk anu ngamungkinkeun urang nyiptakeun seueur server wéb Grafana anu sami, urang tiasa nyiptakeun grup conto. Dina platform Yandex.Cloud, istilah ieu nujul kana union mesin virtual anu gaduh ciri anu sami. Nalika nyieun grup conto, prototipe sadaya mesin di grup ieu ngonpigurasi, lajeng ciri grup sorangan (contona, jumlah minimum jeung maksimum mesin aktip). Upami jumlah ayeuna henteu nyumponan kritéria ieu, grup instance nyalira bakal ngahapus mesin anu teu perlu atanapi nyiptakeun anu énggal dina gambarna nyalira.

Salaku bagian tina tugas urang, urang bakal nyieun grup conto tina web server anu bakal dihasilkeun tina gambar disk dijieun saméméhna.

Panyebaran jasa anu disebarkeun dina Yandex.Cloud nganggo Grafana sabagé conto

Panyebaran jasa anu disebarkeun dina Yandex.Cloud nganggo Grafana sabagé conto

Anu paling luar biasa nyaéta pangaturan grup conto terakhir. Grup target dina integrasi sareng Load Balancer bakal ngabantosan anjeun ngonpigurasikeun kasaimbangan L3 di luhur mesin virtual grup ieu ku ngaklik sababaraha tombol.

Panyebaran jasa anu disebarkeun dina Yandex.Cloud nganggo Grafana sabagé conto

Nalika nyetél kasaimbangan, kuring ngalaksanakeun dua poin penting:

  1. Kuring nyieun balancer nu narima lalulintas pamaké on port 80 sarta alihan ka port 3000 tina mesin virtual, persis dimana Grafana hirup.
  2. Kuring nyetél mariksa viability mesin ku ping aranjeunna ka port 3000.

Panyebaran jasa anu disebarkeun dina Yandex.Cloud nganggo Grafana sabagé conto

Ringkesan mini

Tungtungna, kami tiasa sacara manual nyebarkeun infrastruktur aplikasi anu dipikahoyong, sareng ayeuna kami ngagaduhan jasa Grafana anu tahan banting. Anjeun ngan ukur kedah terang alamat IP tina balancer salaku titik éntri kana aplikasi sareng host klaster ClickHouse pikeun ngamuat set data kana éta.

Ieu bakal sigana kawas meunangna? Enya, meunangna. Tapi masih aya anu ngabingungkeun kuring. Sakabéh prosés di luhur merlukeun loba léngkah manual tur teu scalable pisan; Abdi hoyong ngajadikeun otomatis eta lamun mungkin. Ieu naon bagian salajengna bakal devoted ka.

Integrasi Terraform

Urang deui bakal ngagunakeun alat ti HashiCorp disebut Terraform. Éta bakal ngabantosan anjeun nyebarkeun sadaya infrastruktur aplikasi kalayan ngaklik tombol, dumasar kana sababaraha variabel anu disalurkeun ku pangguna. Hayu urang nyerat resep anu tiasa dijalankeun sababaraha kali dina bagian anu béda pikeun pangguna anu béda.

Sadaya karya sareng Terraform asalna pikeun nyerat file konfigurasi (*.tf) jeung kreasi infrastruktur dumasar kana eta.

Variabel

Di awal file, urang bakal ngalebetkeun variabel anu nangtukeun dimana sareng kumaha infrastruktur masa depan bakal disebarkeun.

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

Sakabéh prosés panyebaran aplikasi bakal turun pikeun ngawangun gambar disk sareng netepkeun variabel ieu. Hayu atuh ngajelaskeun naon tanggung jawab aranjeunna:

oauth_token - token pikeun ngakses awan. Bisa diala ku link.
cloud_id - identifier awan dimana urang bakal nyebarkeun aplikasi
folder_id - identifier bagian dimana urang bakal nyebarkeun aplikasi
service_account_id - identifier akun jasa dina bagian pakait tina awan.
id_gambar - identifier tina gambar disk diala maké Packer
ngaran pamaké и password — ngaran pamaké sarta sandi pikeun ngakses duanana database jeung server wéb Grafana
dbname - ngaran database jero CH na MySQL klaster
public_key_path - jalur kana file nganggo konci ssh umum anjeun, anu anjeun tiasa dianggo pikeun nyambungkeun nami ubuntu ka mesin virtual sareng server wéb

Setélan panyadia

Ayeuna anjeun kedah ngonpigurasikeun panyadia Terraform - dina kasus kami, Yandex:

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

Anjeun bakal aya bewara yén di dieu kami nganggo variabel anu didefinisikeun di luhur.

Jaringan sareng klaster

Ayeuna urang bakal nyiptakeun jaringan dimana unsur-unsur infrastruktur urang bakal komunikasi, tilu subnet (hiji di unggal daérah) sareng ningkatkeun klaster CH sareng 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
  }
}

Sakumaha anjeun tiasa tingali, unggal dua klaster dijieun rada lepat-toleran ku ayana dina tilu zona kasadiaan.

Pangladén wéb

Ieu bakal sigana nu urang bisa neruskeun dina sumanget sarua, tapi kuring lumpat kana kasusah. Sateuacan ieu, kuring mimiti ngangkat klaster MySQL sareng ngan saatos éta, terang ID na, kuring ngumpulkeun gambar disk sareng konfigurasi anu diperyogikeun, dimana kuring netepkeun host kana kluster. Tapi ayeuna urang henteu terang ID klaster sateuacan ngaluncurkeun Terraform, kalebet dina waktos ngawangun gambar. Ku alatan éta, kuring kungsi Resort ka handap trik.

Ngagunakeun jasa metadata Amazon urang, urang bakal lulus sababaraha parameter ka mesin virtual, nu eta bakal nampa tur prosés. Urang peryogi mesin pikeun muka metadata tukangeun host kluster MySQL sareng sandi-sandi, anu ditunjuk ku pangguna dina file Terraform, saatos ngamimitian. Hayu urang ngarobah eusi file rada setup.sh, anu dijalankeun nalika mesin virtual dihurungkeun.

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 na balancer

Sanggeus ngawangun deui gambar disk anyar, tungtungna urang tiasa nambihan file kami pikeun Terraform.

Hayu urang nunjukkeun yén urang hoyong nganggo gambar disk anu tos aya:

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

Ayeuna hayu urang ngadamel grup conto:

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

Éta patut nengetan kumaha urang ngalebetkeun kana metadata cluster_uri, username и password. Ieu mangrupikeun mesin virtual anu bakal kaluar nalika ngamimitian sareng nempatkeun dina konfigurasi Grafana.

Terserah panimbang.

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

Gula saeutik

Tinggal saeutik. Saatos prasarana disebarkeun, anjeun kedah angkat ka UI Grafana sareng nambihan klaster CH sacara manual (ID anu masih kedah dicandak) salaku Sumber Data. Tapi Terraform terang ID klaster. Hayu urang mercayakeun anjeunna mawa masalah ka fruition.

Hayu urang tambahkeun panyadia anyar - Grafana, sareng masihan alamat IP pangimbangna salaku host. Sadaya parobihan anu dilakukeun ku Terraform dina mesin dimana pangimbangna ditangtukeun bakal tumbuh dina MySQL, sareng ku kituna dina sadaya mesin anu sanés.

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

Hayu urang nyisiran rambut urang

Hayu urang mintonkeun alamat IP balancer jeung host tina klaster 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"
}

Bisa lumpat

Sadayana! Berkas konfigurasi kami parantos siap sareng urang tiasa, ku netepkeun variabel, nyarioskeun Terraform pikeun ngangkat sadayana anu dijelaskeun di luhur. Sakabeh proses nyandak kuring ngeunaan 15 menit.
Dina tungtungna anjeun tiasa ningali pesen anu saé:

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

Sareng dina awan, unsur-unsur infrastruktur anu diangkat bakal katingali:

Panyebaran jasa anu disebarkeun dina Yandex.Cloud nganggo Grafana sabagé conto

pikeun nyimpulkeun

Ayeuna, nganggo Grafana sabagé conto, masing-masing anjeun tiasa nyebarkeun aplikasi sareng arsitéktur awan anu lega dina platform Yandex.Cloud. Alat anu mantuan ti HashiCorp sapertos Packer sareng Terraform tiasa ngabantosan anjeun dina ieu. Abdi ngarepkeun aya anu mendakan tulisan ieu mangpaat :)

PS Di handap ieu kuring bakal ngagantelkeun tautan kana gudang dimana anjeun tiasa mendakan resep anu siap-siap pikeun Packer sareng Terraform, fragmen anu kuring nyayogikeun dina tulisan ieu.

gudang

sumber: www.habr.com

Tambahkeun komentar