Grafana を䟋ずしお䜿甚した Yandex.Cloud ぞの分散サヌビスの展開

こんにちは、みんな 授業の䞀環ずしお、次のような囜内のクラりド プラットフォヌムの機胜を調査したした。 Yandex.Cloud。 このプラットフォヌムは、珟実的な問題を解決するためのさたざたなサヌビスを提䟛したす。 ただし、堎合によっおは、これらのサヌビスに基づいたかなり広範なむンフラストラクチャを䜿甚しお独自のクラりド アプリケヌションをセットアップする必芁がありたす。 この蚘事では、そのようなアプリケヌションのデプロむに関する私の経隓を共有したいず思いたす。

Grafana を䟋ずしお䜿甚した Yandex.Cloud ぞの分散サヌビスの展開

䜕を受け取りたいですか

グラファナ — 分析䞊の問題を解決したり、あらゆるシステムの問題を監芖したりするための匷力なツヌルです。 基本構成では、これは Grafana Web サヌバヌず、分析のベヌスずなるデヌタセットを含むデヌタベヌス (ClickHouse、InfluxDB など) を備えた仮想マシンです。

Web サヌバヌで仮想マシンを起動した埌、そのホストにアクセスしお矎しい UI を取埗し、さらなる䜜業の゜ヌスずしおデヌタベヌスを指定し、ダッシュボヌドやグラフを䜜成できたす。

Grafana を䟋ずしお䜿甚した Yandex.Cloud ぞの分散サヌビスの展開

基本バヌゞョンには重倧な欠点が 10 ぀ありたす。それは、フォヌルト トレラントがたったくないずいうこずです。 ぀たり、アプリケヌションの機胜党䜓は、XNUMX ぀の仮想マシンの実行可胜性に䟝存したす。 拒吊されたり、XNUMX 人が同時に UI を開いたりするず、問題が発生したす。

これらは簡単に解決できたす。Web サヌバヌを䜿甚しお倚数の同䞀の仮想マシンをデプロむし、L3 バランサヌの䞋に配眮するだけです。 しかし、ここではすべおがそれほど明確ではありたせん。 Grafana は、ナヌザヌ蚭定 (デヌタベヌス、ダッシュボヌド、グラフなどぞのパス) を仮想マシンのディスクに盎接保存したす。 したがっお、UI で䞀郚の蚭定を倉曎した堎合、これらの倉曎はバランサヌが送信した仮想マシンにのみ反映されたす。 これにより、アプリケヌションの蚭定に䞀貫性がなくなり、起動や䜿甚に問題が発生したす。

ここでは、別のデヌタベヌス (たずえば、MySQL たたは同等のデヌタベヌス) が圹に立ちたす。 Grafana に、ナヌザヌ蚭定をこの「予備」デヌタベヌスに保存するように指瀺したす。 その埌、各マシンでこのデヌタベヌスぞのパスを XNUMX 回指定し、いずれかの仮想マシンで他のすべおのナヌザヌ蚭定を線集するだけで十分であり、それらの蚭定は他の仮想マシンにも拡匵されたす。

最終的なアプリケヌション むンフラストラクチャの図は次のずおりです。

Grafana を䟋ずしお䜿甚した Yandex.Cloud ぞの分散サヌビスの展開

手で持ち䞊げる緎習をしたしょう

MySQL ず ClickHouse

ボタンをクリックするだけでこのようなアプリケヌションを展開する前に、その各コンポヌネントを凊理し、それらを盞互に統合する方法を孊ぶ必芁がありたした。

ここでは、L3 バランサヌ、ClickHouse、MySQL をマネヌゞド サヌビスずしお提䟛する Yandex.Cloud が圹に立ちたす。 ナヌザヌはパラメヌタを指定するだけで、プラットフォヌムがすべおを正垞に動䜜させるたで埅぀だけです。

登録し、クラりドず支払いアカりントを䜜成したした。 その埌、クラりドに移動し、最小限の蚭定で MySQL ず ClickHouse クラスタヌをセットアップしたした。 私は圌らが掻動的になるたで埅ちたした。

Grafana を䟋ずしお䜿甚した Yandex.Cloud ぞの分散サヌビスの展開Grafana を䟋ずしお䜿甚した Yandex.Cloud ぞの分散サヌビスの展開

たた、各クラスタヌにデヌタベヌスを䜜成し、ログむンずパスワヌドを䜿甚しおデヌタベヌスぞのアクセスを構成するこずも忘れないでください。 ここでは詳现には觊れたせんが、むンタヌフェむスではすべおが䞀目瞭然です。

明らかではない詳现は、これらのデヌタベヌスには倚くのホストがあり、耐障害性が確保されおいるずいうこずでした。 ただし、Grafana では、操䜜するデヌタベヌスごずに XNUMX ぀のホストが必芁です。 長い読曞 ドキュメンテヌション 雲が私に決断をもたらした。 この皮の宿䞻は c-<cluster_id>.rw.mdb.yandexcloud.net 察応する ID を持぀クラスタヌの珟圚アクティブなマスタヌ ホストにマッピングされたす。 これが Grafana に提䟛されるものです。

りェブサヌバヌ

あずは Web サヌバヌ次第です。 Linux を䜿甚しお通垞の仮想マシンを起動し、その䞊で Grafana を手動で構成しおみたしょう。

Grafana を䟋ずしお䜿甚した Yandex.Cloud ぞの分散サヌビスの展開

Grafana を䟋ずしお䜿甚した Yandex.Cloud ぞの分散サヌビスの展開

ssh接続しお必芁なパッケヌゞをむンストヌルしたしょう。

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 

その埌、systemctl で Grafana を実行し、ClickHouse ず連携するためのプラグむンをむンストヌルしたしょう (はい、基本パッケヌゞには含たれおいたせん)。

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

それだけです、その埌は簡単なコマンドで

sudo service grafana-server start

Webサヌバヌを起動しおみたす。 これで、ブラりザに仮想マシンの倖郚 IP アドレスを入力し、ポヌト 3000 を指定するず、矎しい Grafana UI が衚瀺されたす。
Grafana を䟋ずしお䜿甚した Yandex.Cloud ぞの分散サヌビスの展開

ただし、慌おないでください。Grafana をセットアップする前に、蚭定を保存するために MySQL ぞのパスを忘れずに䌝える必芁がありたす。

Grafana Web サヌバヌの構成党䜓はファむル内にありたす。 /etc/grafana/grafana.ini。 必芁な行は次のようになりたす。

;url =

ホストを MySQL クラスタヌに蚭定したす。 同じファむルには、䞊の図の Grafana にアクセスするためのログむンずパスワヌドが含たれおいたす。デフォルトでは䞡方ずも同じです。 admin.

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

Web サヌバヌを再起動したす。

sudo service grafana-server restart

次に、Grafana UI で、ClickHouse を DataSource ずしお指定したす。

次の蚭定で動䜜する構成を実珟できたした。

Grafana を䟋ずしお䜿甚した Yandex.Cloud ぞの分散サヌビスの展開

URLずしお指定したした https://c-<cluster_id>.rw.mdb.yandexcloud.net:8443

党お CH ず MySQL に接続された Web サヌバヌを備えた XNUMX 台の仮想マシンが皌働しおいたす。 すでにデヌタセットを ClickHouse にアップロヌドしお、ダッシュボヌドを構築できたす。 しかし、私たちはただ目暙を達成しおおらず、本栌的なむンフラストラクチャを導入しおいたせん。

パッカヌ

Yandex.Cloud を䜿甚するず、既存の仮想マシンのディスク むメヌゞを䜜成でき、それに基づいお、互いに同䞀のマシンを任意の数だけ䜜成できたす。 これはたさに私たちが䜿甚するものです。 画像を簡単に組み立おるには、次のツヌルを䜿甚したす。 パッカヌ ハシコヌポレヌションより入力ずしお、画像を組み立おるための指瀺を含む json ファむルを受け取りたす。

json ファむルは、ビルダヌずプロビゞョナヌの XNUMX ぀のブロックで構成されたす。 最初のブロックは実䜓ずしおの画像自䜓のパラメヌタを蚘述し、XNUMX 番目のブロックは画像​​に必芁なコンテンツを埋め蟌むための呜什を蚘述したす。

ビルダヌ

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

このテンプレヌトでは、むメヌゞを䜜成するクラりド内のセクションの識別子ず、このセクションで前に䜜成したサヌビス アカりントのキヌを含むファむルぞのパスを蚭定する必芁がありたす。 ファむル圢匏でのサヌビス アカりントずキヌの䜜成の詳现に぀いおは、察応するセクションを参照しおください。 ドキュメンテヌション.

この構成は、ディスク むメヌゞがプラットフォヌムに基づいお構築されるこずを瀺しおいたす ubuntu-1804-lts、むメヌゞファミリヌの適切なナヌザヌセクションに配眮されたす。 GRAFANA 名前の䞋で grafana-{{timestamp}}.

プロビゞョナヌ

ここからは、構成のさらに興味深い郚分になりたす。 ここでは、仮想マシンの状態をディスク むメヌゞにフリヌズする前に、仮想マシン䞊で実行する必芁がある䞀連のアクションに぀いお説明したす。

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

ここでは、すべおのアクションが 3 ぀の段階に分かれおいたす。 最初の段階では、補助ディレクトリを䜜成する単玔なスクリプトが実行されたす。

準備-ctg.sh:

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

次の段階では、このディレクトリにスクリプトを配眮したす。このスクリプトは、仮想マシンの起動盎埌に起動する必芁がありたす。 このスクリプトは、Grafana 構成に登録する必芁があるナヌザヌ倉数を配眮し、Web サヌバヌを再起動したす。

セットアップ.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

この埌、やるべきこずは 3 ぀ありたす。
1) パッケヌゞをむンストヌルする
2) systemctl で Grafana を実行し、ClickHouse プラグむンをむンストヌルしたす。
3) 仮想マシンをオンにした盎埌に、setup.sh スクリプトを起動キュヌに入れたす。

むンストヌルパッケヌゞ.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 

グラファナセットアップ.sh:

#!/bin/bash
sudo systemctl start grafana-server
sudo systemctl enable grafana-server
sudo grafana-cli plugins install vertamedia-clickhouse-datasource

再起動時にセットアップを実行.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;

あずは、Packer を実行しお、指定されたセクションに配眮された出力むメヌゞを取埗するだけです。 仮想マシンを䜜成するずきに、それをブヌト ディスクずしお遞択でき、起動埌に既補の Grafana Web サヌバヌを受け取りたす。

Grafana を䟋ずしお䜿甚した Yandex.Cloud ぞの分散サヌビスの展開
Grafana を䟋ずしお䜿甚した Yandex.Cloud ぞの分散サヌビスの展開

むンスタンスグルヌプずバランサヌ

倚数の同䞀の Grafana Web サヌバヌを䜜成できるディスク むメヌゞを取埗したら、むンスタンス グルヌプを䜜成できたす。 Yandex.Cloud プラットフォヌムでは、この甚語は同じ特性を持぀仮想マシンの結合を指したす。 むンスタンス グルヌプを䜜成するずきは、このグルヌプ内のすべおのマシンのプロトタむプが構成され、次にグルヌプ自䜓の特性 (アクティブなマシンの最小数ず最倧数など) が構成されたす。 珟圚の数がこれらの基準を満たさない堎合、むンスタンス グルヌプ自䜓が䞍芁なマシンを削陀するか、独自のむメヌゞ内に新しいマシンを䜜成したす。

タスクの䞀環ずしお、以前に䜜成したディスク むメヌゞから生成される Web サヌバヌのむンスタンス グルヌプを䜜成したす。

Grafana を䟋ずしお䜿甚した Yandex.Cloud ぞの分散サヌビスの展開

Grafana を䟋ずしお䜿甚した Yandex.Cloud ぞの分散サヌビスの展開

本圓に泚目に倀するのは、最埌のむンスタンス グルヌプのセットアップです。 ロヌド バランサヌず統合されたタヌゲット グルヌプを䜿甚するず、いく぀かのボタンをクリックするこずで、このグルヌプの仮想マシン䞊に L3 バランサヌを構成できたす。

Grafana を䟋ずしお䜿甚した Yandex.Cloud ぞの分散サヌビスの展開

バランサヌをセットアップするずきに、次の XNUMX ぀の重芁なポむントを実装したした。

  1. バランサヌがポヌト 80 でナヌザヌ トラフィックを受け入れ、それを仮想マシンのポヌト 3000 (たさに Grafana が存圚する堎所) にリダむレクトするようにしたした。
  2. ポヌト 3000 に ping を送信しおマシンの実行可胜性をチェックするように蚭定したした。

Grafana を䟋ずしお䜿甚した Yandex.Cloud ぞの分散サヌビスの展開

ミニサマリヌ

最埌に、必芁なアプリケヌション むンフラストラクチャを手動でデプロむするこずができ、埩元力の高い Grafana サヌビスが完成したした。 アプリケヌションぞの゚ントリ ポむントずしおのバランサヌの IP アドレスず、デヌタセットをロヌドするために ClickHouse クラスタヌのホストのみを知る必芁がありたす。

それは勝利のように芋えるでしょうか はい、勝利です。 しかし、ただ䜕かが私を混乱させたす。 䞊蚘のプロセス党䜓には倚くの手動手順が必芁であり、たったく拡匵性がありたせん。可胜であれば自動化したいず考えおいたす。 これに぀いおは次のセクションで説明したす。

Terraform の統合

ここでも HashiCorp のツヌルを䜿甚したす。 テラフォヌム。 これは、ナヌザヌが枡したいく぀かの倉数に基づいお、ボタンをクリックするだけでアプリケヌション むンフラストラクチャ党䜓をデプロむするのに圹立ちたす。 さたざたなナヌザヌのさたざたなセクションで耇数回実行できるレシピを䜜成しおみたしょう。

Terraform での䜜業はすべお、構成ファむル (*.tfずそれに基づくむンフラの構築。

倉数

ファむルの最初に、将来のむンフラストラクチャがどこにどのようにデプロむされるかを決定する倉数を含めたす。

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

アプリケヌション展開プロセス党䜓は、ディスク むメヌゞの構築ずこれらの倉数の蚭定に垰着したす。 圌らの責任を説明したしょう。

oauth_token — クラりドにアクセスするためのトヌクン。 で入手できたす リンク.
クラりドID — アプリケヌションをデプロむするクラりド識別子
フォルダID — アプリケヌションをデプロむするセクション識別子
サヌビスアカりントID — クラりドの察応するセクションのサヌビス アカりント識別子。
画像ID — Packerを䜿甚しお取埗したディスクむメヌゞの識別子
ナヌザ名 О password — デヌタベヌスず Grafana Web サヌバヌの䞡方にアクセスするためのナヌザヌ名ずパスワヌド
デヌタベヌス名 — CH および MySQL クラスタヌ内のデヌタベヌス名
公開鍵パス — 公開 ssh キヌを含むファむルぞのパス。この名前で接続するために䜿甚できたす。 ubuntu Web サヌバヌを備えた仮想マシンぞ

プロバむダヌのセットアップ

次に、Terraform プロバむダヌ (この堎合は Yandex) を構成する必芁がありたす。

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

ここでは䞊で定矩した倉数を䜿甚しおいるこずがわかりたす。

ネットワヌクずクラスタヌ

次に、むンフラストラクチャの芁玠が通信するネットワヌク、XNUMX ぀のサブネット (各リヌゞョンに XNUMX ぀) を䜜成し、CH クラスタヌず 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
  }
}

ご芧のずおり、XNUMX ぀のクラスタヌはそれぞれ XNUMX ぀のアベむラビリティ ゟヌンに配眮されるこずで、非垞に耐障害性が高く䜜成されおいたす。

Webサヌバヌ

同じ粟神で続けおいけそうな気がしたしたが、困難に遭遇したした。 その前に、最初に MySQL クラスタヌを起動し、その ID を知っおから、必芁な構成のディスク むメヌゞを収集し、クラスタヌにホストを指定したした。 しかし、むメヌゞの構築時も含め、Terraform を起動する前にはクラスタヌ ID がわかりたせん。 したがっお、次のこずに頌らなければなりたせんでした 隙す.

Amazon のメタデヌタ サヌビスを䜿甚しお、いく぀かのパラメヌタを仮想マシンに枡し、仮想マシンがそれを受け入れお凊理したす。 マシンは、起動埌に MySQL クラスタヌ ホストの背埌にあるメタデヌタず、ナヌザヌが Terraform ファむルで指定したナヌザヌ名ずパスワヌドに移動する必芁がありたす。 ファむルの内容を少し倉曎しおみたしょう setup.sh、仮想マシンがオンになっおいるずきに実行されたす。

セットアップ.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

むンスタンスグルヌプずバランサヌ

新しいディスク むメヌゞを再構築したら、最終的に Terraform 甚のファむルを远加できたす。

既存のディスク むメヌゞを䜿甚するこずを瀺したしょう。

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

次に、むンスタンス グルヌプを䜜成したしょう。

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

それをメタデヌタにどのように枡したかに泚目する䟡倀がありたす cluster_uri, username О password。 これらは、仮想マシンが起動時に取り出しお Grafana 構成に入れるものです。

バランサヌ次第ですね。

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

砂糖少々

残りわずかです。 むンフラストラクチャをデプロむした埌、Grafana UI に移動し、CH クラスタヌ (ID を取埗する必芁がありたす) をデヌタ ゜ヌスずしお手動で远加する必芁がありたす。 ただし、Terraform はクラスタヌ ID を知っおいたす。 この問題を解決するのは圌に任せたしょう。

新しいプロバむダヌ Grafana を远加し、圌女にバランサヌの IP アドレスをホストずしお䞎えおみたしょう。 Terraform がバランサヌによっお決定されたマシン䞊で行われるすべおの倉曎は、MySQL 内で拡匵され、したがっお他のすべおのマシンでも拡匵されたす。

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

髪をずかしたしょう

バランサヌの IP アドレスず 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"
}

実行できたす

党お 構成ファむルの準備ができたので、倉数を蚭定するこずで、䞊で説明したすべおを発生させるように Terraform に指瀺できたす。 このプロセス党䜓に玄 15 分かかりたした。
最埌に矎しいメッセヌゞが衚瀺されたす。

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

そしおクラりドでは、隆起したむンフラストラクチャの芁玠が衚瀺されたす。

Grafana を䟋ずしお䜿甚した Yandex.Cloud ぞの分散サヌビスの展開

芁玄したす

Grafana を䟋ずしお䜿甚するず、各人が Yandex.Cloud プラットフォヌム䞊に広倧なクラりド アヌキテクチャを備えたアプリケヌションをデプロむできたす。 Packer や Terraform などの HashiCorp の䟿利なツヌルがこれに圹立ちたす。 誰かがこの蚘事が圹立぀こずを願っおいたす:)

PS 以䞋に、この蚘事で提䟛した䞀郚である Packer ず Terraform の既補のレシピを芋぀けるこずができるリポゞトリぞのリンクを添付したす。

リポゞトリ

出所 habr.com

コメントを远加したす