Usambazaji wa huduma zilizosambazwa katika Yandex.Cloud kwa kutumia Grafana kama mfano

Salaam wote! Kama sehemu ya kazi yangu ya kozi, nilitafiti uwezo wa jukwaa la ndani la wingu kama Yandex.Cloud. Jukwaa hutoa huduma mbalimbali kwa ajili ya kutatua matatizo ya vitendo. Walakini, wakati mwingine unahitaji kusanidi programu yako ya wingu na miundombinu ya kina kulingana na huduma hizi. Katika nakala hii nataka kushiriki uzoefu wangu katika kupeleka programu kama hiyo.

Usambazaji wa huduma zilizosambazwa katika Yandex.Cloud kwa kutumia Grafana kama mfano

Unataka kupokea nini?

grafana - chombo chenye nguvu cha kutatua matatizo ya uchanganuzi au matatizo ya ufuatiliaji wa mifumo yoyote. Katika usanidi wake wa kimsingi, hii ni mashine pepe iliyo na seva ya wavuti ya Grafana, pamoja na hifadhidata (ClickHouse, InfluxDB, n.k.) iliyo na seti ya data ambayo uchanganuzi utategemea.

Baada ya kuzindua mashine pepe yenye seva ya wavuti, unaweza kwenda kwa mwenyeji wake na kupata UI nzuri, taja hifadhidata kama vyanzo vya kazi zaidi, unda dashibodi na grafu.

Usambazaji wa huduma zilizosambazwa katika Yandex.Cloud kwa kutumia Grafana kama mfano

Toleo la msingi lina shida moja muhimu - sio uvumilivu wa makosa hata kidogo. Hiyo ni, utendaji mzima wa programu inategemea uwezekano wa mashine moja ya kawaida. Ikiwa inakataa au watu 10 kufungua UI kwa wakati mmoja, basi matatizo yatatokea.

Zinaweza kutatuliwa kwa urahisi: unahitaji tu... kupeleka mashine nyingi za mtandaoni zinazofanana na seva ya wavuti na kuziweka chini ya mizani ya L3. Lakini sio kila kitu kiko wazi sana hapa. Grafana huhifadhi mipangilio ya mtumiaji (njia za hifadhidata, dashibodi, grafu, n.k.) moja kwa moja kwenye diski ya mashine yake pepe. Kwa hivyo, ikiwa tutabadilisha baadhi ya mipangilio katika Kiolesura, mabadiliko haya yataonyeshwa kwenye mashine pepe pekee ambapo kiweka sawazishaji kilitutumia. Hii itasababisha mipangilio kutofautiana kwa programu yetu, na kusababisha matatizo na uzinduzi na matumizi.

Hapa database nyingine itakuja kuwaokoa, kwa mfano, MySQL au sawa. Tunamwambia Grafana kwamba anapaswa kuhifadhi mipangilio ya mtumiaji katika hifadhidata hii ya "ziada". Baadaye, itatosha kutaja njia ya hifadhidata hii mara moja kwenye kila mashine, na kuhariri mipangilio mingine yote ya mtumiaji kwenye mashine yoyote ile ya mtandaoni; itaenea hadi kwa zingine.

Hapa kuna mchoro wa miundombinu ya mwisho ya programu:

Usambazaji wa huduma zilizosambazwa katika Yandex.Cloud kwa kutumia Grafana kama mfano

Hebu tujifunze kuinua kwa mikono yetu

MySQL na ClickHouse

Kabla ya kupeleka programu hiyo kwa kubofya kifungo, ilikuwa ni lazima kujifunza jinsi ya kushughulikia kila vipengele vyake na kuunganisha kwa kila mmoja.

Hapa Yandex.Cloud itatusaidia, ambayo hutoa mizani ya L3, ClickHouse na MySQL kama huduma zinazodhibitiwa. Mtumiaji anahitaji tu kutaja vigezo na kusubiri hadi jukwaa lilete kila kitu katika utaratibu wa kufanya kazi.

Nilijiandikisha, nikaunda wingu na akaunti ya malipo. Baada ya hapo, nilienda kwenye wingu na kusanidi nguzo za MySQL na ClickHouse na mipangilio ndogo. Nilisubiri hadi wakawa wanafanya kazi.

Usambazaji wa huduma zilizosambazwa katika Yandex.Cloud kwa kutumia Grafana kama mfanoUsambazaji wa huduma zilizosambazwa katika Yandex.Cloud kwa kutumia Grafana kama mfano

Pia unahitaji kukumbuka kuunda hifadhidata katika kila nguzo na usanidi ufikiaji wake kwa kutumia kuingia na nywila. Sitaingia katika maelezo hapa - kila kitu ni dhahiri kabisa kwenye kiolesura.

Maelezo yasiyo dhahiri ni kwamba hifadhidata hizi zina wapangishaji wengi, ambao huhakikisha uvumilivu wao wa makosa. Walakini, Grafana inahitaji mwenyeji mmoja haswa kwa kila hifadhidata inayofanya kazi nayo. Kusoma kwa muda mrefu nyaraka Mawingu yalinileta kwenye uamuzi. Inageuka kuwa mwenyeji wa aina c-<cluster_id>.rw.mdb.yandexcloud.net imechorwa kwa mwenyeji mkuu amilifu wa sasa wa nguzo na kitambulisho kinacholingana. Hii ndio tutampa Grafana.

Seva ya wavuti

Sasa ni juu ya seva ya wavuti. Wacha tuinue mashine ya kawaida ya kawaida na Linux na tusanidi Grafana juu yake.

Usambazaji wa huduma zilizosambazwa katika Yandex.Cloud kwa kutumia Grafana kama mfano

Usambazaji wa huduma zilizosambazwa katika Yandex.Cloud kwa kutumia Grafana kama mfano

Wacha tuunganishe kupitia ssh na tusakinishe vifurushi muhimu.

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 

Baada ya hapo, wacha tuendeshe Grafana chini ya systemctl na tusakinishe programu-jalizi ya kufanya kazi na ClickHouse (ndio, haijatolewa kwenye kifurushi cha msingi).

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

Hiyo ndiyo yote, baada ya hapo na amri rahisi

sudo service grafana-server start

tutaanza seva ya wavuti. Sasa unaweza kuingiza anwani ya IP ya nje ya mashine ya kawaida kwenye kivinjari, taja bandari 3000 na uone UI nzuri ya Grafana.
Usambazaji wa huduma zilizosambazwa katika Yandex.Cloud kwa kutumia Grafana kama mfano

Lakini usikimbilie, kabla ya kusanidi Grafana, lazima ukumbuke kuiambia njia ya MySQL ili kuhifadhi mipangilio hapo.

Usanidi mzima wa seva ya wavuti ya Grafana iko kwenye faili /etc/grafana/grafana.ini. Mstari unaohitajika unaonekana kama hii:

;url =

Tunaweka mwenyeji kwenye nguzo ya MySQL. Faili sawa ina kuingia na nenosiri la kufikia Grafana kwenye picha iliyo hapo juu, ambayo kwa default ni sawa admin.

Unaweza kutumia sed amri:

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

Ni wakati wa kuanzisha upya seva ya wavuti!

sudo service grafana-server restart

Sasa katika Grafana UI tutabainisha ClickHouse kama DataSource.

Niliweza kufikia usanidi wa kufanya kazi na mipangilio ifuatayo:

Usambazaji wa huduma zilizosambazwa katika Yandex.Cloud kwa kutumia Grafana kama mfano

Nilitaja kama URL https://c-<cluster_id>.rw.mdb.yandexcloud.net:8443

Wote! Tuna mashine moja ya mtandaoni inayofanya kazi iliyo na seva ya wavuti iliyounganishwa kwa CH na MySQL. Tayari unaweza kupakia mkusanyiko wa data kwenye ClickHouse na uunde dashibodi. Hata hivyo, bado hatujafikia lengo letu na hatujaweka miundombinu kamili.

Packer

Yandex.Cloud inakuwezesha kuunda picha ya disk ya mashine iliyopo ya virtual, na kwa misingi yake - idadi yoyote ya mashine zinazofanana na kila mmoja. Hii ndiyo hasa tutakayotumia. Ili kukusanya picha kwa urahisi, chukua chombo Packer kutoka HashiCorp. Inachukua kama kuingiza faili ya json na maagizo ya kukusanya picha.

Faili yetu ya json itakuwa na vizuizi viwili: wajenzi na watoa huduma. Kizuizi cha kwanza kinaelezea vigezo vya picha yenyewe kama chombo, na kizuizi cha pili kinaelezea maagizo ya kuijaza na yaliyomo muhimu.

Wajenzi

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

Katika template hii, unahitaji kuweka kitambulisho cha sehemu katika wingu ambapo unataka kuunda picha, pamoja na njia ya faili na funguo kutoka kwa akaunti ya huduma iliyoundwa hapo awali katika sehemu hii. Unaweza kusoma zaidi kuhusu kuunda akaunti za huduma na funguo kwa namna ya faili katika sehemu inayofanana nyaraka.

Usanidi huu unasema kuwa picha ya diski itajengwa kulingana na jukwaa ubuntu-1804-lts, iliyowekwa katika sehemu inayofaa ya mtumiaji katika familia ya picha GRAFANA chini ya jina grafana-{{timestamp}}.

Watoa huduma

Sasa inakuja sehemu ya kuvutia zaidi ya usanidi. Itaelezea mlolongo wa vitendo ambavyo vitahitajika kufanywa kwenye mashine ya kawaida kabla ya kufungia hali yake kwenye picha ya diski.

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

Hapa vitendo vyote vimegawanywa katika hatua 3. Katika hatua ya kwanza, hati rahisi inatekelezwa ambayo inaunda saraka ya msaidizi.

kuandaa-ctg.sh:

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

Katika hatua inayofuata, tunaweka hati katika saraka hii, ambayo itahitaji kuzinduliwa mara baada ya kuanza mashine ya kawaida. Hati hii itaweka vigezo vya mtumiaji vinavyohitaji kusajiliwa katika usanidi wa Grafana na kuanzisha upya seva ya wavuti.

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

Baada ya hayo, kuna mambo 3 yaliyobaki kufanya:
1) kufunga vifurushi
2) endesha Grafana chini ya systemctl na usakinishe programu-jalizi ya ClickHouse
3) weka hati ya setup.sh kwenye foleni ya uzinduzi mara baada ya kuwasha mashine pepe.

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;

Sasa kilichobaki ni kuendesha Packer na kupata picha ya pato kuwekwa katika sehemu maalum. Wakati wa kuunda mashine ya kawaida, unaweza kuichagua kama diski ya boot na baada ya uzinduzi utapokea seva ya wavuti ya Grafana iliyo tayari.

Usambazaji wa huduma zilizosambazwa katika Yandex.Cloud kwa kutumia Grafana kama mfano
Usambazaji wa huduma zilizosambazwa katika Yandex.Cloud kwa kutumia Grafana kama mfano

Kikundi cha mfano na usawazishaji

Mara tu tukiwa na picha ya diski inayoturuhusu kuunda seva nyingi za wavuti za Grafana, tunaweza kuunda kikundi cha mfano. Kwenye jukwaa la Yandex.Cloud, neno hili linamaanisha umoja wa mashine za kawaida ambazo zina sifa sawa. Wakati wa kuunda kikundi cha mfano, mfano wa mashine zote kwenye kikundi hiki husanidiwa, na kisha sifa za kikundi yenyewe (kwa mfano, kiwango cha chini na cha juu cha mashine zinazofanya kazi). Ikiwa nambari ya sasa haifikii vigezo hivi, basi kikundi cha mfano yenyewe kitaondoa mashine zisizo za lazima au kuunda mpya katika picha yake.

Kama sehemu ya kazi yetu, tutaunda kikundi cha mfano cha seva za wavuti ambazo zitatolewa kutoka kwa picha ya diski iliyoundwa hapo awali.

Usambazaji wa huduma zilizosambazwa katika Yandex.Cloud kwa kutumia Grafana kama mfano

Usambazaji wa huduma zilizosambazwa katika Yandex.Cloud kwa kutumia Grafana kama mfano

Kinachoshangaza sana ni usanidi wa kikundi wa mfano wa mwisho. Kikundi lengwa kwa kuunganishwa na Kisawazisha cha Mzigo kitakusaidia kusanidi kusawazisha L3 juu ya mashine pepe za kikundi hiki kwa kubofya vitufe kadhaa.

Usambazaji wa huduma zilizosambazwa katika Yandex.Cloud kwa kutumia Grafana kama mfano

Wakati wa kusanidi kusawazisha, nilitekeleza mambo mawili muhimu:

  1. Nilifanya msawazishaji akubali trafiki ya watumiaji kwenye bandari 80 na kuielekeza kwenye bandari 3000 ya mashine pepe, mahali ambapo Grafana anaishi.
  2. Nilianzisha kuangalia uwezekano wa mashine kwa kuziweka kwenye bandari 3000.

Usambazaji wa huduma zilizosambazwa katika Yandex.Cloud kwa kutumia Grafana kama mfano

Muhtasari mdogo

Hatimaye, tuliweza kupeleka sisi wenyewe miundombinu ya programu inayotakikana, na sasa tuna huduma ya Grafana inayostahimili hali ya juu. Unahitaji tu kujua anwani ya IP ya kisawazisha kama mahali pa kuingilia programu na mwenyeji wa nguzo ya ClickHouse ili kupakia mkusanyiko wa data ndani yake.

Inaweza kuonekana kama ushindi? Ndiyo, ushindi. Lakini bado kuna kitu kinanichanganya. Mchakato mzima hapo juu unahitaji hatua nyingi za mwongozo na sio hatari hata kidogo; ningependa kuibadilisha ikiwa inawezekana. Hivi ndivyo sehemu inayofuata itatolewa.

Ujumuishaji wa Terraform

Tutatumia tena zana kutoka HashiCorp inayoitwa Terraform. Itakusaidia kupeleka miundombinu yote ya programu kwa kubofya kitufe, kulingana na vigezo kadhaa vilivyopitishwa na mtumiaji. Wacha tuandike kichocheo ambacho kinaweza kuendeshwa mara nyingi katika sehemu tofauti za watumiaji tofauti.

Kazi yote na Terraform inakuja chini ili kuandika faili ya usanidi (*.tf) na uundaji wa miundombinu kwa kuzingatia hilo.

Vighairi

Mwanzoni kabisa mwa faili, tutajumuisha vigezo vinavyoamua wapi na jinsi miundombinu ya baadaye itatumwa.

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

Mchakato mzima wa kupeleka maombi utashuka ili kujenga taswira ya diski na kuweka vigezo hivi. Acha nieleze wanawajibika kwa nini:

kiapo_token - ishara ya kufikia wingu. Inaweza kupatikana kwa kiungo.
cloud_id - kitambulisho cha wingu ambapo tutapeleka programu
kitambulisho_cha_folda - kitambulisho cha sehemu ambapo tutapeleka programu
kitambulisho_cha_akaunti_cha_huduma - kitambulisho cha akaunti ya huduma katika sehemu inayolingana ya wingu.
kitambulisho_cha_picha - kitambulisho cha picha ya diski iliyopatikana kwa kutumia Packer
username ΠΈ nywila β€” jina la mtumiaji na nenosiri ili kufikia hifadhidata zote mbili na seva ya wavuti ya Grafana
db jina - Jina la hifadhidata ndani ya nguzo za CH na MySQL
ufunguo_wa_njia - njia ya faili na ufunguo wako wa ssh wa umma, ambao unaweza kutumia kuunganisha chini ya jina ubuntu kwa mashine pepe zilizo na seva za wavuti

Mpangilio wa mtoaji

Sasa unahitaji kusanidi mtoaji wa Terraform - kwa upande wetu, Yandex:

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

Utagundua kuwa hapa tunatumia vigeu vilivyofafanuliwa hapo juu.

Mtandao na makundi

Sasa tutaunda mtandao ambao vipengele vya miundombinu yetu vitawasiliana, subnets tatu (moja katika kila mkoa) na kuongeza makundi ya CH na 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
  }
}

Kama unavyoona, kila moja ya vikundi viwili vimeundwa kustahimili makosa kabisa kwa kuwekwa katika maeneo matatu ya upatikanaji.

Seva za wavuti

Ingeonekana kwamba tunaweza kuendelea katika roho ileile, lakini niliingia kwenye matatizo. Kabla ya hili, kwanza niliinua nguzo ya MySQL na tu baada ya hayo, nikijua kitambulisho chake, nilikusanya picha ya diski na usanidi unaohitajika, ambapo nilielezea mwenyeji kwenye nguzo. Lakini sasa hatujui kitambulisho cha nguzo kabla ya kuzindua Terraform, ikiwa ni pamoja na wakati wa kujenga picha. Kwa hivyo, ilinibidi kuamua yafuatayo hila.

Kwa kutumia huduma ya metadata ya Amazon, tutapitisha baadhi ya vigezo kwa mashine pepe, ambayo itakubali na kuchakata. Tunahitaji mashine kwenda kwenye metadata nyuma ya seva pangishi ya nguzo ya MySQL na nenosiri la mtumiaji, ambalo mtumiaji alibainisha kwenye faili ya Terraform, baada ya kuanza. Wacha tubadilishe yaliyomo kwenye faili kidogo setup.sh, ambayo hutumika wakati mashine ya mtandaoni imewashwa.

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

Kikundi cha intance na usawazishaji

Baada ya kujenga upya picha mpya ya diski, hatimaye tunaweza kuongeza faili yetu ya Terraform.

Wacha tuonyeshe kuwa tunataka kutumia picha iliyopo ya diski:

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

Sasa wacha tuunde kikundi cha mfano:

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

Inafaa kuzingatia jinsi tulivyoipitisha kwenye metadata cluster_uri, username ΠΈ password. Ni hizi ambazo mashine ya kawaida itachukua wakati wa kuanza na kuweka usanidi wa Grafana.

Ni juu ya msawazishaji.

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

Sukari kidogo

Imebaki kidogo tu. Baada ya miundombinu kutumwa, itabidi uende kwa Grafana UI na uongeze mwenyewe nguzo ya CH (kitambulisho chake bado kinahitaji kupatikana) kama Chanzo cha Data. Lakini Terraform anajua kitambulisho cha nguzo. Hebu tumkabidhi ili kulifanikisha jambo hilo.

Hebu tuongeze mtoa huduma mpya - Grafana, na tumpe anwani ya IP ya msawazishaji kama mwenyeji. Mabadiliko yote ambayo Terraform hufanya kwenye mashine ambapo kisawazisha chake huamua yatakua katika MySQL, na kwa hivyo kwenye mashine zingine zote.

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

Hebu tuchane nywele zetu

Wacha tuonyeshe anwani ya IP ya usawazishaji na mwenyeji wa nguzo ya 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"
}

Inaweza kukimbia

Wote! Faili yetu ya usanidi iko tayari na tunaweza, kwa kuweka vigezo, kumwambia Terraform kuinua kila kitu tulichoelezea hapo juu. Mchakato wote ulinichukua kama dakika 15.
Mwishoni unaweza kuona ujumbe mzuri:

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

Na katika wingu, vipengele vya miundombinu iliyoinuliwa vitaonekana:

Usambazaji wa huduma zilizosambazwa katika Yandex.Cloud kwa kutumia Grafana kama mfano

Jumla juu

Sasa, kwa kutumia Grafana kama mfano, kila mmoja wenu anaweza kupeleka programu na usanifu wa wingu unaoenea kwenye jukwaa la Yandex.Cloud. Zana muhimu kutoka HashiCorp kama vile Packer na Terraform zinaweza kukusaidia kwa hili. Natumai mtu atapata nakala hii kuwa muhimu :)

PS Hapo chini nitaambatisha kiunga cha hazina ambapo unaweza kupata mapishi yaliyotengenezwa tayari kwa Packer na Terraform, vipande ambavyo nilitoa katika nakala hii.

hazina

Chanzo: mapenzi.com

Kuongeza maoni