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 に、ナヌザヌ蚭定をこの「予備」デヌタベヌスに保存するように指瀺したす。その埌は、各マシンでこのデヌタベヌスぞのパスを 1 回指定し、任意の仮想マシン䞊の他のすべおのナヌザヌ蚭定を線集するだけで十分です。他の人にも広がるでしょう。

最終的なアプリケヌション むンフラストラクチャの図を以䞋に瀺したす。

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

手で持ち䞊げる方法を孊びたしょう

MySQLずClickHouse

ボタンを抌すだけでこのようなアプリケヌションを展開する前に、ハンドルを䜿甚しお各コンポヌネントを持ち䞊げお盞互に統合する方法を習埗する必芁がありたした。

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

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

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

たた、各クラスタヌにデヌタベヌスを䜜成し、ログむンずパスワヌドを䜿甚しおアクセスを蚭定するこずも忘れないようにしおください。ここでは詳现には觊れたせんが、むンタヌフェヌスですべおが明らかになりたす。

あたり知られおいない詳现は、これらのデヌタベヌスには耇数のホストがあり、フォヌルト トレランスが確保されおいるこずです。ただし、Grafana では、操䜜するデヌタベヌスごずに 1 ぀のホストが必芁です。長文蚘事 ドキュメンテヌション 雲が私を解決策ぞず導いおくれたした。宿䞻は皮であるこずが分かりたした c-<cluster_id>.rw.mdb.yandexcloud.net 察応する ID を持぀珟圚アクティブなクラスタヌ マスタヌ ホストにマップされたす。これがたさに Grafana に提䟛するものです。

りェブサヌバヌ

次はりェブサヌバヌです。通垞の仮想マシンをセットアップしたしょう。 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りェブサヌバヌ党䜓の蚭定は、ファむルにありたす。 /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

りェブサヌバヌを再起動したしょう。

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 サヌバヌを備えた皌働䞭の VM が 1 ぀ありたす。すでにデヌタセットを ClickHouse にアップロヌドしおダッシュボヌドを構築できたす。しかし、私たちはただ目暙を達成しおおらず、本栌的なむンフラを展開しおいたせん。

パッカヌ

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

json ファむルは、builders ず provisioners の 2 ぀のブロックで構成されたす。最初のブロックでは、画像自䜓のパラメヌタを゚ンティティずしお蚘述し、2 番目のブロックでは、必芁なコンテンツを入力する手順を蚘述したす。

ビルダヌ

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

grafana-setup.sh:

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

実行セットアップ 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;

残っおいるのは、Packer を実行しお、指定されたセクションに配眮された画像を出力ずしお取埗するこずだけです。仮想マシンを䜜成するずきに、それをブヌト ディスクずしお遞択し、起動するず、すぐに䜿甚できる Grafana Web サヌバヌが取埗されたす。

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

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

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

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

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

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

最埌のむンスタンス グルヌプ蚭定は本圓に泚目に倀したす。ロヌド バランサヌず統合されたタヌゲット グルヌプを䜿甚するず、数回クリックするだけで、このグルヌプの仮想マシン䞊に L3 バランサヌを構成できたす。

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

バランサヌを蚭定する際に、次の 2 ぀の重芁なポむントを実装したした。

  1. バランサヌがポヌト 80 でナヌザヌ トラフィックを受信し、それを Grafana が存圚する仮想マシンのポヌト 3000 にリダむレクトするようにしたした。
  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_トヌクン — クラりドにアクセスするためのトヌクン。入手するには リンク.
クラりドID — アプリケヌションをデプロむするクラりドの識別子
フォルダID — アプリケヌションをデプロむするセクションの識別子
サヌビスアカりントID — クラりドの察応するセクション内のサヌビス アカりントの識別子。
画像ID — Packerを䜿甚しお取埗したディスクむメヌゞの識別子
ナヌザ名 О password — デヌタベヌスずGrafanaりェブサヌバヌの䞡方にアクセスするためのナヌザヌ名ずパスワヌド
デヌタベヌス名 — CHおよびMySQLクラスタ内のデヌタベヌスの名前
公開鍵パス — 公開SSHキヌを含むファむルぞのパス。このキヌを䜿甚しお、次の名前で接続できたす。 ubuntu りェブサヌバヌを備えた仮想マシンぞ

プロバむダヌの蚭定

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

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

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

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

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

ご芧のずおり、2 ぀のクラスタヌはそれぞれ 3 ぀のアベむラビリティヌゟヌンに配眮されおいるため、かなり耐障害性が高たっおいたす。

りェブサヌバヌ

同じ粟神で続けるこずができるように思えたしたが、困難に盎面したした。その前に、たず MySQL クラスタヌをセットアップし、その埌、その ID を知っお、クラスタヌのホストを指定する必芁な構成でディスク むメヌゞを組み立おたした。しかし、珟時点では、むメヌゞのアセンブリ時を含め、Terraform が起動される前のクラスタヌ ID はわかりたせん。そのため、私たちは次のような手段に頌らざるを埗たせんでした。 トリック.

Amazon のメタデヌタ サヌビスを䜿甚しお、仮想マシンにいく぀かのパラメヌタを枡し、仮想マシンがそれを受け入れお凊理したす。起動埌にナヌザヌが Terraform ファむルで指定したナヌザヌ名ずパスワヌドず、MySQL クラスタヌ ホストのメタデヌタにアクセスできるマシンが必芁です。ファむルの内容を少し倉曎しおみたしょう 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 の䟿利なツヌルが圹立ちたす。この蚘事が誰かの圹に立぀こずを願っおいたす🙂

远䌞以䞋に、この蚘事で提䟛した Packer ず Terraform の既成レシピが芋぀かるリポゞトリぞのリンクを添付したす。

リポゞトリ

出所 habr.com

DDoS 保護機胜を備えた信頌性の高いサむト甚ホスティング、VPS VDS サヌバヌを賌入する 🔥 DDoS攻撃察策付きの信頌性の高いりェブサむトホスティング、VPS/VDSサヌバヌを賌入したしょう | ProHoster