Vendosja e shërbimeve të shpërndara në Yandex.Cloud duke përdorur Grafana si shembull

Pershendetje te gjitheve! Si pjesë e punës sime të kursit, unë hulumtova aftësitë e një platforme të tillë vendase cloud si Yandex.Cloud. Platforma ofron shërbime të ndryshme për zgjidhjen e problemeve praktike. Sidoqoftë, ndonjëherë ju duhet të konfiguroni aplikacionin tuaj cloud me një infrastrukturë mjaft të gjerë të bazuar në këto shërbime. Në këtë artikull dua të ndaj përvojën time në vendosjen e një aplikacioni të tillë.

Vendosja e shërbimeve të shpërndara në Yandex.Cloud duke përdorur Grafana si shembull

Çfarë dëshironi të merrni?

grafana — një mjet i fuqishëm për zgjidhjen e problemeve analitike ose monitorimin e problemeve të çdo sistemi. Në konfigurimin e saj bazë, kjo është një makinë virtuale me një server në internet Grafana, si dhe një bazë të dhënash (ClickHouse, InfluxDB, etj.) me një grup të dhënash mbi të cilin do të bazohet analitika.

Pas nisjes së një makine virtuale me një server në internet, mund të shkoni te hosti i saj dhe të merrni një ndërfaqe të bukur, të specifikoni bazat e të dhënave si burime për punë të mëtejshme, të krijoni tabela dhe grafikë.

Vendosja e shërbimeve të shpërndara në Yandex.Cloud duke përdorur Grafana si shembull

Versioni bazë ka një pengesë të rëndësishme - nuk është aspak tolerant ndaj gabimeve. Kjo do të thotë, i gjithë funksionaliteti i aplikacionit varet nga qëndrueshmëria e një makine virtuale. Nëse refuzon ose 10 persona hapin UI në të njëjtën kohë, atëherë do të shfaqen probleme.

Ato mund të zgjidhen thjesht: ju vetëm duhet... të vendosni shumë makina virtuale identike me një server në internet dhe t'i vendosni ato nën një balancues L3. Por jo gjithçka është kaq e thjeshtë këtu. Grafana ruan cilësimet e përdoruesit (rrugët drejt bazave të të dhënave, panelet e informacionit, grafikët, etj.) direkt në diskun e makinës së saj virtuale. Kështu, nëse ndryshojmë disa cilësime në UI, këto ndryshime do të pasqyrohen vetëm në makinën virtuale ku na ka dërguar balancuesi. Kjo do të çojë në cilësime jokonsistente për aplikacionin tonë, duke shkaktuar probleme me nisjen dhe përdorimin.

Këtu do të vijë në shpëtim një bazë tjetër e të dhënave, për shembull, MySQL ose ekuivalenti i tij. Ne i themi Grafanës se ajo duhet të ruajë cilësimet e përdoruesit në këtë bazë të dhënash "këmbë". Më pas, do të mjaftojë të specifikoni shtegun për në këtë bazë të dhënash një herë në secilën makinë dhe të redaktoni të gjitha cilësimet e tjera të përdoruesit në cilëndo nga makinat virtuale; ato do të shtrihen në të tjerat.

Këtu është një diagram i infrastrukturës përfundimtare të aplikimit:

Vendosja e shërbimeve të shpërndara në Yandex.Cloud duke përdorur Grafana si shembull

Le të mësojmë të ngremë me duart tona

MySQL dhe ClickHouse

Përpara se të vendosnim një aplikacion të tillë me klikimin e një butoni, ishte e nevojshme të mësohej se si të trajtohej secili prej përbërësve të tij dhe t'i integronte ato me njëri-tjetrin.

Këtu do të na ndihmojë Yandex.Cloud, i cili ofron balancues L3, ClickHouse dhe MySQL si shërbime të menaxhuara. Përdoruesi duhet vetëm të specifikojë parametrat dhe të presë derisa platforma të sjellë gjithçka në gjendje pune.

U regjistrova, krijova një re dhe një llogari pagese. Pas kësaj, shkova në cloud dhe konfigurova grupet MySQL dhe ClickHouse me cilësime minimale. Prita derisa të aktivizoheshin.

Vendosja e shërbimeve të shpërndara në Yandex.Cloud duke përdorur Grafana si shembullVendosja e shërbimeve të shpërndara në Yandex.Cloud duke përdorur Grafana si shembull

Ju gjithashtu duhet të mbani mend të krijoni një bazë të dhënash në çdo grup dhe të konfiguroni aksesin në të duke përdorur një hyrje dhe fjalëkalim. Nuk do të hyj në detaje këtu - gjithçka është mjaft e qartë në ndërfaqe.

Detaji jo i dukshëm ishte se këto baza të të dhënave kanë shumë host, të cilët sigurojnë tolerancën e tyre ndaj gabimeve. Sidoqoftë, Grafana kërkon saktësisht një host për secilën bazë të dhënash me të cilën punon. Lexim i gjatë dokumentacionin Retë më sollën në një vendim. Rezulton se pritësi i specieve c-<cluster_id>.rw.mdb.yandexcloud.net hartuar në hostin aktual kryesor aktiv të grupit me ID-në përkatëse. Këtë do t'i japim Grafanës.

ueb server

Tani i takon serverit të internetit. Le të krijojmë një makinë virtuale të rregullt me ​​Linux dhe të konfigurojmë manualisht Grafana në të.

Vendosja e shërbimeve të shpërndara në Yandex.Cloud duke përdorur Grafana si shembull

Vendosja e shërbimeve të shpërndara në Yandex.Cloud duke përdorur Grafana si shembull

Le të lidhemi përmes ssh dhe të instalojmë paketat e nevojshme.

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 

Pas kësaj, le të ekzekutojmë Grafana nën systemctl dhe të instalojmë shtojcën për të punuar me ClickHouse (po, nuk është dhënë në paketën bazë).

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

Kjo është ajo, pas kësaj me një komandë të thjeshtë

sudo service grafana-server start

do të nisim web serverin. Tani mund të futni adresën IP të jashtme të makinës virtuale në shfletues, të specifikoni portin 3000 dhe të shihni ndërfaqen e bukur të Grafana.
Vendosja e shërbimeve të shpërndara në Yandex.Cloud duke përdorur Grafana si shembull

Por mos nxitoni, përpara se të konfiguroni Grafana, duhet të mbani mend t'i tregoni asaj rrugën drejt MySQL në mënyrë që të ruani cilësimet atje.

I gjithë konfigurimi i ueb serverit Grafana është në skedar /etc/grafana/grafana.ini. Linja e kërkuar duket si kjo:

;url =

Ne e vendosëm hostin në grupin MySQL. I njëjti skedar përmban hyrjen dhe fjalëkalimin për të hyrë në Grafana në foton e mësipërme, të cilat si parazgjedhje janë të dyja të barabarta admin.

Ju mund të përdorni komandat 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

Është koha për të rifilluar ueb serverin!

sudo service grafana-server restart

Tani në ndërfaqen e ndërfaqes së Grafana do të specifikojmë ClickHouse si burim të dhënash.

Unë arrita të arrij një konfigurim pune me cilësimet e mëposhtme:

Vendosja e shërbimeve të shpërndara në Yandex.Cloud duke përdorur Grafana si shembull

Unë specifikova si URL https://c-<cluster_id>.rw.mdb.yandexcloud.net:8443

Të gjitha! Ne kemi një makinë virtuale që funksionon me një server në internet të lidhur me CH dhe MySQL. Tashmë mund të ngarkoni grupin e të dhënave në ClickHouse dhe të ndërtoni panele kontrolli. Megjithatë, ne ende nuk e kemi arritur qëllimin tonë dhe nuk kemi vendosur një infrastrukturë të plotë.

Paketues

Yandex.Cloud ju lejon të krijoni një imazh të diskut të një makine virtuale ekzistuese, dhe mbi bazën e saj - çdo numër makinash identike me njëra-tjetrën. Kjo është pikërisht ajo që ne do të përdorim. Për të montuar me lehtësi imazhin, merrni mjetin Paketues nga HashiCorp. Merr si hyrje një skedar json me udhëzime për montimin e imazhit.

Skedari ynë json do të përbëhet nga dy blloqe: ndërtuesit dhe ofruesit. Blloku i parë përshkruan parametrat e vetë imazhit si një entitet, dhe blloku i dytë përshkruan udhëzimet për plotësimin e tij me përmbajtjen e nevojshme.

ndërtuesit

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

Në këtë shabllon, duhet të vendosni identifikuesin e seksionit në renë kompjuterike ku dëshironi të krijoni imazhin, si dhe shtegun drejt skedarit me çelësat nga llogaria e shërbimit të krijuar më parë në këtë seksion. Mund të lexoni më shumë rreth krijimit të llogarive dhe çelësave të shërbimit në formën e një skedari në seksionin përkatës dokumentacionin.

Ky konfigurim thotë se imazhi i diskut do të ndërtohet në bazë të platformës ubuntu-1804-lts, vendosur në seksionin e duhur të përdoruesit në familjen e imazheve GRAFANA nën emrin grafana-{{timestamp}}.

Ofruesit

Tani vjen pjesa më interesante e konfigurimit. Ai do të përshkruajë sekuencën e veprimeve që do të duhet të kryhen në makinën virtuale përpara se të ngrijë gjendjen e saj në një imazh të diskut.

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

Këtu të gjitha veprimet ndahen në 3 faza. Në fazën e parë, ekzekutohet një skript i thjeshtë që krijon një direktori ndihmëse.

përgatit-ctg.sh:

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

Në fazën tjetër, ne vendosim një skript në këtë direktori, i cili do të duhet të lansohet menjëherë pas fillimit të makinës virtuale. Ky skript do të vendosë variablat e përdoruesit që duhet të regjistrohen në konfigurimin e Grafana dhe do të rifillojë serverin në internet.

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

Pas kësaj mbeten 3 gjëra për të bërë:
1) instaloni paketat
2) ekzekutoni Grafana nën systemctl dhe instaloni shtojcën ClickHouse
3) vendosni skriptin setup.sh në radhën e nisjes menjëherë pas ndezjes së makinës virtuale.

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;

Tani gjithçka që mbetet është të ekzekutoni Packer dhe të vendosni imazhin e daljes në seksionin e specifikuar. Kur krijoni një makinë virtuale, mund ta zgjidhni atë si një disk boot dhe pas nisjes do të merrni një server të gatshëm të internetit Grafana.

Vendosja e shërbimeve të shpërndara në Yandex.Cloud duke përdorur Grafana si shembull
Vendosja e shërbimeve të shpërndara në Yandex.Cloud duke përdorur Grafana si shembull

Grupi i shembullit dhe balancuesi

Pasi të kemi një imazh të diskut që na lejon të krijojmë shumë serverë identikë të internetit Grafana, ne mund të krijojmë një grup shembulli. Në platformën Yandex.Cloud, ky term i referohet bashkimit të makinave virtuale që kanë të njëjtat karakteristika. Kur krijoni një grup shembulli, konfigurohet prototipi i të gjitha makinave në këtë grup, dhe më pas karakteristikat e vetë grupit (për shembull, numri minimal dhe maksimal i makinave aktive). Nëse numri aktual nuk i plotëson këto kritere, atëherë vetë grupi i shembullit do të heqë makinat e panevojshme ose do të krijojë të reja sipas imazhit të tij.

Si pjesë e detyrës sonë, ne do të krijojmë një grup shembulli të serverëve në internet që do të gjenerohen nga imazhi i diskut i krijuar më parë.

Vendosja e shërbimeve të shpërndara në Yandex.Cloud duke përdorur Grafana si shembull

Vendosja e shërbimeve të shpërndara në Yandex.Cloud duke përdorur Grafana si shembull

Ajo që është vërtet e jashtëzakonshme është konfigurimi i grupit të shembullit të fundit. Grupi i synuar në integrim me Load Balancer do t'ju ndihmojë të konfiguroni një balancues L3 në krye të makinave virtuale të këtij grupi duke klikuar disa butona.

Vendosja e shërbimeve të shpërndara në Yandex.Cloud duke përdorur Grafana si shembull

Kur konfigurova balancuesin, zbatova dy pika të rëndësishme:

  1. E bëra balancuesin të pranonte trafikun e përdoruesve në portin 80 dhe ta ridrejtoja në portin 3000 të makinave virtuale, pikërisht aty ku jeton Grafana.
  2. Kam vendosur të kontrolloj qëndrueshmërinë e makinerive duke i futur ato në portin 3000.

Vendosja e shërbimeve të shpërndara në Yandex.Cloud duke përdorur Grafana si shembull

Mini përmbledhje

Më në fund, ne ishim në gjendje të vendosnim manualisht infrastrukturën e dëshiruar të aplikacionit dhe tani kemi një shërbim shumë elastik Grafana. Ju vetëm duhet të dini adresën IP të balancuesit si pika hyrëse në aplikacion dhe hosti i grupit ClickHouse në mënyrë që të ngarkoni grupin e të dhënave në të.

Do të duket si një fitore? Po, fitore. Por diçka ende më ngatërron. I gjithë procesi i mësipërm kërkon shumë hapa manualë dhe nuk është aspak i shkallëzueshëm; unë do të doja ta automatizoja nëse është e mundur. Kjo është ajo që pjesa tjetër do t'i kushtohet.

Integrimi Terraform

Ne do të përdorim përsëri një mjet nga HashiCorp të quajtur Terraform. Do t'ju ndihmojë të vendosni të gjithë infrastrukturën e aplikacionit me klikimin e një butoni, bazuar në disa variabla të kaluar nga përdoruesi. Le të shkruajmë një recetë që mund të ekzekutohet disa herë në seksione të ndryshme të përdoruesve të ndryshëm.

E gjithë puna me Terraform zbret në shkrimin e një skedari konfigurimi (*.tf) dhe krijimin e infrastrukturës në bazë të saj.

variabla

Në fillim të skedarit, ne do të përfshijmë variabla që përcaktojnë se ku dhe si do të vendoset infrastruktura e ardhshme.

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

I gjithë procesi i vendosjes së aplikacionit do të zbresë në ndërtimin e një imazhi të diskut dhe vendosjen e këtyre variablave. Më lejoni të shpjegoj se për çfarë ata janë përgjegjës:

oauth_token — një shenjë për të hyrë në re. Mund të merret nga lidhje.
re_id — identifikuesi i cloud ku do të vendosim aplikacionin
folder_id — identifikuesi i seksionit ku do të vendosim aplikacionin
shërbimi_llogaria_id — identifikuesi i llogarisë së shërbimit në seksionin përkatës të resë kompjuterike.
image_id — identifikuesi i imazhit të diskut të marrë duke përdorur Packer
Emri i përdoruesit и Fjalëkalimi — emri i përdoruesit dhe fjalëkalimi për të hyrë në të dyja bazat e të dhënave dhe në serverin e internetit Grafana
dbname — emri i bazës së të dhënave brenda grupimeve CH dhe MySQL
shtegu_çelës_publik — shtegu i skedarit me çelësin tuaj publik ssh, të cilin mund ta përdorni për t'u lidhur nën emrin ubuntu te makinat virtuale me serverë ueb

Konfigurimi i ofruesit

Tani ju duhet të konfiguroni ofruesin Terraform - në rastin tonë, Yandex:

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

Do të vini re se këtu po përdorim variablat e përcaktuar më sipër.

Rrjeti dhe grupimet

Tani do të krijojmë një rrjet në të cilin elementët e infrastrukturës sonë do të komunikojnë, tre nënrrjeta (një në çdo rajon) dhe do të ngrenë grupet CH dhe 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
  }
}

Siç mund ta shihni, secila prej dy grupeve është krijuar mjaft tolerante ndaj gabimeve duke u vendosur në tre zona disponueshmërie.

Web serverët

Dukej se mund të vazhdonim në të njëjtën frymë, por hasa në vështirësi. Para kësaj, unë fillimisht ngrita një grup MySQL dhe vetëm pas kësaj, duke ditur ID-në e tij, mblodha një imazh të diskut me konfigurimin e kërkuar, ku specifikova hostin në grup. Por tani ne nuk e dimë ID-në e grupit përpara se të lëshojmë Terraform, duke përfshirë edhe kohën e ndërtimit të imazhit. Prandaj, më duhej të drejtohesha në sa vijon mashtrim.

Duke përdorur shërbimin e meta të dhënave të Amazon, ne do t'i kalojmë disa parametra makinës virtuale, të cilat ajo do t'i pranojë dhe përpunojë. Ne kemi nevojë që makina të shkojë te metadata prapa hostit të grupit MySQL dhe fjalëkalimit të emrit të përdoruesit, të cilat përdoruesi i specifikoi në skedarin Terraform, pas fillimit. Le të ndryshojmë pak përmbajtjen e skedarit setup.sh, i cili funksionon kur makina virtuale është e ndezur.

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

Grupi i instancave dhe balancuesi

Pasi të kemi rindërtuar një imazh të ri të diskut, më në fund mund të shtojmë skedarin tonë për Terraform.

Le të tregojmë se duam të përdorim një imazh ekzistues të diskut:

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

Tani le të krijojmë një grup shembulli:

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

Vlen t'i kushtohet vëmendje mënyrës se si e kaluam atë në meta të dhëna cluster_uri, username и password. Janë këto që makina virtuale do t'i nxjerrë në fillim dhe do t'i vendosë në konfigurimin Grafana.

Varet nga balancuesi.

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

Pak sheqer

Ka mbetur vetëm pak. Pasi të vendoset infrastruktura, do t'ju duhet të shkoni në ndërfaqen e përdoruesit të Grafana dhe të shtoni manualisht grupin CH (ID-ja e të cilit duhet ende të merret) si një Burim i të Dhënave. Por Terraform e di ID-në e grupit. Le t'i besojmë atij zbatimin e çështjes.

Le të shtojmë një ofrues të ri - Grafana, dhe t'i japim asaj adresën IP të balancuesit si host. Të gjitha ndryshimet që Terraform bën në makinën ku përcakton balancuesi i saj do të rriten në MySQL, dhe për rrjedhojë në të gjitha makinat e tjera.

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

Le të krehim flokët

Le të shfaqim adresën IP të balancuesit dhe hostin e grupit 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"
}

Mund të vraposh

Të gjitha! Skedari ynë i konfigurimit është gati dhe ne, duke vendosur variablat, mund t'i themi Terraform-it të ngrejë gjithçka që përshkruam më sipër. I gjithë procesi më zgjati rreth 15 minuta.
Në fund mund të shihni një mesazh të bukur:

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

Dhe në re, elementët e infrastrukturës së ngritur do të jenë të dukshme:

Vendosja e shërbimeve të shpërndara në Yandex.Cloud duke përdorur Grafana si shembull

Përmbledh

Tani, duke përdorur Grafana si shembull, secili prej jush mund të vendosë aplikacione me një arkitekturë të madhe cloud në platformën Yandex.Cloud. Mjetet e dobishme nga HashiCorp si Packer dhe Terraform mund t'ju ndihmojnë me këtë. Shpresoj që dikush ta gjejë të dobishëm këtë artikull :)

PS Më poshtë do të bashkangjit një lidhje me depon ku mund të gjeni receta të gatshme për Packer dhe Terraform, fragmente të të cilave kam dhënë në këtë artikull.

depo

Burimi: www.habr.com

Shto një koment