Implementatie van gedistribueerde services in Yandex.Cloud met Grafana als voorbeeld

Hallo allemaal! Als onderdeel van mijn studie deed ik onderzoek naar de mogelijkheden van een binnenlands cloudplatform als Yandex.Cloud. Het platform biedt verschillende diensten aan om praktische problemen op te lossen. Soms is het echter noodzakelijk om op basis van deze diensten een eigen cloudapplicatie op te zetten met een vrij uitgebreide infrastructuur. In dit artikel wil ik mijn ervaringen delen met het implementeren van een dergelijke applicatie.

Implementatie van gedistribueerde services in Yandex.Cloud met Grafana als voorbeeld

Wat wil je krijgen?

grafana — een krachtig hulpmiddel voor het oplossen van analytische problemen of het monitoren van problemen van welk systeem dan ook. In de basisconfiguratie is dit een virtuele machine met een Grafana-webserver en een database (ClickHouse, InfluxDB, enz.) met een dataset op basis waarvan analyses worden opgebouwd.

Nadat u een virtuele machine met een webserver hebt opgestart, kunt u naar de host gaan en een mooie gebruikersinterface krijgen, databases opgeven als bronnen voor verdere werkzaamheden en dashboards en grafieken maken.

Implementatie van gedistribueerde services in Yandex.Cloud met Grafana als voorbeeld

De basisversie heeft één belangrijk nadeel: deze is helemaal niet fouttolerant. Dat wil zeggen dat de volledige functionaliteit van de applicatie afhankelijk is van de levensvatbaarheid van één virtuele machine. Als dit mislukt of als 10 mensen tegelijkertijd de gebruikersinterface openen, ontstaan ​​er problemen.

Ze worden eenvoudig opgelost: u hoeft alleen maar… veel identieke virtuele machines met een webserver te implementeren en deze onder een L3-balancer te plaatsen. Maar hier is niet alles zo eenduidig. Grafana slaat gebruikersinstellingen (paden naar databases, dashboards, grafieken, enz.) rechtstreeks op de schijf van de virtuele machine op. Wanneer u dus instellingen in de gebruikersinterface wijzigt, worden deze wijzigingen alleen weergegeven op de virtuele machine waar de balancer ons naartoe heeft gestuurd. Dit leidt tot inconsistente instellingen van onze applicatie en er kunnen problemen optreden bij het opstarten en gebruiken ervan.

In dit geval kan een andere database uitkomst bieden, bijvoorbeeld MySQL of een equivalent daarvan. We vertellen Grafana dat het de gebruikersinstellingen in deze 'reserve'-database moet opslaan. Hierna is het voldoende om op elke machine eenmalig het pad naar deze database op te geven en alle andere gebruikersinstellingen op alle virtuele machines te bewerken; Ze zullen zich naar de anderen verspreiden.

Hier is een diagram van de uiteindelijke applicatie-infrastructuur:

Implementatie van gedistribueerde services in Yandex.Cloud met Grafana als voorbeeld

Laten we leren tillen met onze handen

MySQL en ClickHouse

Voordat je een dergelijke applicatie met één druk op de knop kon implementeren, moest je eerst leren hoe je elk onderdeel aan de handgrepen kon optillen en met elkaar kon integreren.

Hierbij krijgen we hulp van Yandex.Cloud, dat L3 balancers, ClickHouse en MySQL als managed services aanbiedt. De gebruiker hoeft alleen de parameters op te geven en te wachten tot het platform alles werkend krijgt.

Ik heb mij geregistreerd, een cloud en een betaalaccount aangemaakt. Daarna ben ik naar de cloud gegaan en heb ik MySQL- en ClickHouse-clusters ingesteld met minimale instellingen. Wachtte tot ze actief werden.

Implementatie van gedistribueerde services in Yandex.Cloud met Grafana als voorbeeldImplementatie van gedistribueerde services in Yandex.Cloud met Grafana als voorbeeld

Vergeet niet om in elk cluster een database aan te maken en de toegang daartoe in te stellen met behulp van een gebruikersnaam en wachtwoord. Ik ga hier niet in op details: alles is vrij duidelijk in de interface.

Een minder voor de hand liggend detail is dat deze databases meerdere hosts hebben, die hun fouttolerantie garanderen. Grafana vereist echter precies één host per database waarmee het werkt. Lang lezen documentatie De wolken leidden mij naar een oplossing. Het blijkt dat de gastheer tot de soort behoort c-<cluster_id>.rw.mdb.yandexcloud.net toegewezen aan de huidige actieve clustermasterhost met de bijbehorende ID. Dit is precies wat wij Grafana zullen geven.

web Server

Nu is het tijd voor de webserver. Laten we een gewone virtuele machine instellen met Linux En we zullen Grafana er handmatig op installeren.

Implementatie van gedistribueerde services in Yandex.Cloud met Grafana als voorbeeld

Implementatie van gedistribueerde services in Yandex.Cloud met Grafana als voorbeeld

Laten we verbinding maken via ssh en de benodigde pakketten installeren.

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 

Daarna starten we Grafana onder systemctl en installeren we een plugin voor het werken met ClickHouse (ja, deze is niet inbegrepen in het basispakket).

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

Dat is alles, na dit eenvoudige commando

sudo service grafana-server start

We gaan een webserver lanceren. Nu kunt u het externe IP-adres van de virtuele machine in de browser invoeren, poort 3000 opgeven en de prachtige Grafana-gebruikersinterface bekijken.
Implementatie van gedistribueerde services in Yandex.Cloud met Grafana als voorbeeld

Maar wees niet te haastig; voordat u Grafana instelt, moet u het pad naar MySQL opgeven waar de instellingen daar worden opgeslagen.

De volledige configuratie van de Grafana-webserver bevindt zich in het bestand /etc/grafana/grafana.ini. De regel die u nodig hebt, ziet er als volgt uit:

;url =

We maken de host toegankelijk voor het MySQL-cluster. Hetzelfde bestand bevat de inloggegevens en het wachtwoord voor toegang tot Grafana in de afbeelding hierboven. Deze zijn standaard hetzelfde. admin.

U kunt de volgende sed-opdrachten gebruiken:

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

Het is tijd om de webserver opnieuw te starten!

sudo service grafana-server restart

In de Grafana-gebruikersinterface specificeren we ClickHouse als de gegevensbron.

Ik heb een werkende configuratie kunnen realiseren met de volgende instellingen:

Implementatie van gedistribueerde services in Yandex.Cloud met Grafana als voorbeeld

Als URL heb ik opgegeven https://c-<cluster_id>.rw.mdb.yandexcloud.net:8443

Alle! We hebben één werkende VM met een webserver verbonden met CH en MySQL. U kunt de dataset nu al uploaden naar ClickHouse en dashboards bouwen. We hebben ons doel echter nog niet bereikt en beschikken nog niet over een volwaardige infrastructuur.

Packer

Met Yandex.Cloud kunt u een schijfkopie maken van een bestaande virtuele machine en op basis daarvan een willekeurig aantal identieke machines. Dit is precies waar wij gebruik van gaan maken. Om de afbeelding gemakkelijk samen te stellen, nemen we de tool Packer van HashiCorp. Als invoer wordt een JSON-bestand gebruikt met instructies voor het samenstellen van de afbeelding.

Ons JSON-bestand bestaat uit twee blokken: builders en provisioners. Het eerste blok beschrijft de parameters van de afbeelding zelf als entiteit, en het tweede beschrijft de instructies voor het vullen ervan met de benodigde inhoud.

Builders

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

In deze sjabloon moet u de identificatie van de sectie in de cloud instellen waar u de afbeelding wilt maken, evenals het pad naar het bestand met de sleutels van het serviceaccount dat eerder in deze sectie is gemaakt. Meer over het aanmaken van serviceaccounts en sleutels in de vorm van een bestand kunt u lezen in de betreffende sectie documentatie.

Deze configuratie geeft aan dat het schijfkopiebestand wordt gebouwd op basis van het platform ubuntu-1804-lts, geplaatst in de overeenkomstige gebruikerssectie in de afbeeldingenfamilie GRAFANA onder de naam grafana-{{timestamp}}.

Bevoorraders

Nu komt het interessantere deel van de configuratie. Het beschrijft de reeks acties die op de virtuele machine moeten worden uitgevoerd voordat de status ervan in een schijfkopie wordt vastgelegd.

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

Hier worden alle acties in 3 fasen verdeeld. De eerste stap is het uitvoeren van een eenvoudig script dat een hulpdirectory aanmaakt.

prepare-ctg.sh:

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

In de volgende stap plaatsen we een script in deze directory dat direct na het starten van de virtuele machine moet worden uitgevoerd. Dit script plaatst de gebruikersvariabelen die in de Grafana-configuratie moeten worden geschreven en start de webserver opnieuw op.

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

Hierna moeten er nog 3 dingen gedaan worden:
1) pakketten installeren
2) Voer Grafana uit onder systemctl en installeer de ClickHouse-plug-in
3) Plaats het script setup.sh direct in de run queue nadat u de virtuele machine hebt ingeschakeld.

install-pakketten.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;

Het enige wat nu nog rest is Packer uit te voeren en de afbeelding in de opgegeven sectie als uitvoer te plaatsen. Bij het aanmaken van een virtuele machine kunt u deze selecteren als opstartschijf. Na het opstarten krijgt u een kant-en-klare Grafana-webserver.

Implementatie van gedistribueerde services in Yandex.Cloud met Grafana als voorbeeld
Implementatie van gedistribueerde services in Yandex.Cloud met Grafana als voorbeeld

Instantiegroep en balancer

Zodra we een schijfkopie hebben waarmee we meerdere identieke Grafana-webservers kunnen maken, kunnen we een instantiegroep maken. Op het Yandex.Cloud-platform verwijst deze term naar een combinatie van virtuele machines met dezelfde kenmerken. Wanneer een instantiegroep wordt gemaakt, wordt een prototype van alle machines in de groep geconfigureerd en vervolgens de kenmerken van de groep zelf (bijvoorbeeld het minimale en maximale aantal actieve machines). Als het huidige aantal niet aan deze criteria voldoet, verwijdert de instantiegroep onnodige machines of maakt nieuwe machines aan met dezelfde image en gelijkenis.

Als onderdeel van onze taak zullen we een instantiegroep van webservers creëren die wordt gestart vanuit de eerder gemaakte schijfkopie.

Implementatie van gedistribueerde services in Yandex.Cloud met Grafana als voorbeeld

Implementatie van gedistribueerde services in Yandex.Cloud met Grafana als voorbeeld

De laatste instelling voor de instantiegroep is echt opmerkelijk. De doelgroep die geïntegreerd is met Load Balancer helpt u met een paar klikken de L3-balancer te configureren op de virtuele machines van deze groep.

Implementatie van gedistribueerde services in Yandex.Cloud met Grafana als voorbeeld

Bij het instellen van de balancer heb ik twee belangrijke punten geïmplementeerd:

  1. Ik heb het zo ingesteld dat de balancer het gebruikersverkeer op poort 80 ontvangt en dit omleidt naar poort 3000 van de virtuele machines, precies waar Grafana zich bevindt.
  2. Er is een gezondheidscontrole voor machines geconfigureerd door ze te pingen op poort 3000.

Implementatie van gedistribueerde services in Yandex.Cloud met Grafana als voorbeeld

Mini-samenvatting

Uiteindelijk konden we de gewenste applicatie-infrastructuur handmatig implementeren en nu beschikken we over een uiterst stabiele Grafana-service. U hoeft alleen het IP-adres van de balancer te weten als toegangspunt tot de toepassing en de ClickHouse-clusterhost om de dataset daarin te laden.

Lijkt het een overwinning? Ja, overwinning. Maar er is nog steeds iets dat mij dwarszit. Het hele proces hierboven vereist veel handmatige handelingen en is absoluut niet schaalbaar. Indien mogelijk wil ik het graag automatiseren. Daarover gaat het volgende gedeelte.

Terraform-integratie

We zullen opnieuw een tool van HashiCorp gebruiken genaamd Terraform. Hiermee kunt u met één druk op de knop de volledige applicatie-infrastructuur implementeren, op basis van een aantal variabelen die door de gebruiker worden doorgegeven. Laten we een recept schrijven dat meerdere keren in verschillende secties voor verschillende gebruikers kan worden uitgevoerd.

Al het werk met Terraform komt neer op het schrijven van een configuratiebestand (*.tf) en het creëren van infrastructuur op basis daarvan.

variabelen

Helemaal aan het begin van het bestand plaatsen we de variabelen waarvan het afhankelijk is waar en hoe de toekomstige infrastructuur wordt geïmplementeerd.

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

Het hele proces voor het implementeren van een applicatie komt neer op het samenstellen van een schijfkopie en het instellen van de variabelen. Laat me uitleggen waar ze verantwoordelijk voor zijn:

oauth_token — een token voor toegang tot de cloud. Je kunt het krijgen door link.
cloud_id — de identificatie van de cloud waar we de applicatie zullen implementeren
map_id — de identificatie van de sectie waar we de applicatie zullen implementeren
service_account_id — identificatie van het serviceaccount in het overeenkomstige gedeelte van de cloud.
afbeelding_id — identificatie van de schijfkopie verkregen met Packer
gebruikersnaam и wachtwoord — gebruikersnaam en wachtwoord voor toegang tot beide databases en de Grafana-webserver
dbnaam — de naam van de database binnen de CH- en MySQL-clusters
openbaar_sleutel_pad — pad naar het bestand met uw openbare ssh-sleutel, die u kunt gebruiken om verbinding te maken onder de naam ubuntu naar virtuele machines met webservers

Uw provider instellen

Nu moet u de Terraform-provider configureren - in ons geval Yandex:

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

Zoals u kunt zien, gebruiken we hier de hierboven gedefinieerde variabelen.

Netwerk en clusters

Nu gaan we een netwerk creëren waarin de elementen van onze infrastructuur met elkaar communiceren, drie subnetten (één in elke regio) en CH- en MySQL-clusters oprichten.


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

Zoals u kunt zien, zijn beide clusters redelijk fouttolerant gemaakt doordat ze in drie beschikbaarheidszones zijn geplaatst.

Webservers

Het leek erop dat ik in dezelfde geest verder kon gaan, maar ik stuitte op een moeilijkheid. Hiervoor heb ik eerst een MySQL-cluster opgezet en pas daarna, met de ID van dat cluster in gedachten, heb ik een schijfkopie samengesteld met de vereiste configuratie. Hierbij heb ik de host voor het cluster opgegeven. Maar nu kennen we de cluster-ID niet voordat Terraform wordt gestart, ook niet op het moment dat de afbeelding wordt samengesteld. Daarom moesten we onze toevlucht nemen tot het volgende truc.

Met behulp van de metadatagegevensservice van Amazon geven we een aantal parameters door aan de virtuele machine. Deze worden vervolgens geaccepteerd en verwerkt. We hebben de machine nodig om naar de metagegevens voor de MySQL-clusterhost te gaan en de gebruikersnaam en het wachtwoord die de gebruiker na het opstarten in het Terraform-bestand heeft opgegeven, te raadplegen. Laten we de inhoud van het bestand enigszins wijzigen setup.sh, die start zodra de virtuele machine wordt ingeschakeld.

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

Ingangsgroep en balancer

Nadat we de nieuwe schijfkopie hebben herbouwd, kunnen we eindelijk het schrijven van ons bestand voor Terraform afronden.

Laten we specificeren dat we een bestaande schijfkopie willen gebruiken:

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

Laten we nu een instantiegroep maken:

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

Het is de moeite waard om aandacht te besteden aan hoe we de metadata hebben overgedragen cluster_uri, username и password. Dit zijn de bestanden die de virtuele machine bij het opstarten extraheert en in de Grafana-configuratie plaatst.

Het hangt af van de balancer.

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

Een beetje suiker

Er is nog maar een klein beetje over. Nadat de infrastructuur is geïmplementeerd, moet u naar de Grafana-gebruikersinterface gaan en handmatig het CH-cluster (waarvan de ID nog moet worden verkregen) toevoegen als een gegevensbron. Maar Terraform kent de cluster-ID. Laten we hem de taak toevertrouwen om de klus te klaren.

Laten we een nieuwe provider toevoegen: Grafana, en deze het IP-adres van de balancer als host geven. Alle wijzigingen die Terraform aanbrengt op de machine waaraan de balancer de wijzigingen toewijst, worden doorgevoerd in MySQL en dus ook op alle andere machines.

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

Laten we het kammen

We zullen het IP-adres van de balancer en de host van het ClickHouse-cluster uitgeven

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

Je kunt het lanceren

Alle! Ons configuratiebestand is klaar en we kunnen de variabelen instellen om Terraform te vertellen alles wat we hierboven hebben beschreven, op te roepen. Het hele proces duurde ongeveer 15 minuten.
Aan het eind zie je een mooie boodschap:

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

En in de cloud zullen elementen van de verhoogde infrastructuur zichtbaar zijn:

Implementatie van gedistribueerde services in Yandex.Cloud met Grafana als voorbeeld

Opsommen

Als we Grafana als voorbeeld nemen, kunnen jullie allebei applicaties implementeren met een uitgebreide cloudarchitectuur op het Yandex.Cloud-platform. Handige tools van HashiCorp zoals Packer en Terraform kunnen u hierbij helpen. Ik hoop dat dit artikel nuttig zal zijn voor iemand 🙂

P.S. Hieronder voeg ik een link toe naar een repository waar je kant-en-klare recepten voor Packer en Terraform kunt vinden. Fragmenten daarvan heb ik in dit artikel opgenomen.

opslagplaats

Bron: www.habr.com

Koop betrouwbare hosting voor sites met DDoS-bescherming, VPS VDS-servers 🔥 Koop betrouwbare websitehosting met DDoS-bescherming, VPS- en VDS-servers | ProHoster