سلام به همه! به عنوان بخشی از کار دوره ای خود، در مورد قابلیت های چنین پلتفرم ابری داخلی تحقیق کردم
چه چیزی را می خواهید دریافت کنید؟
پس از راهاندازی یک ماشین مجازی با وب سرور، میتوانید به میزبان آن بروید و یک رابط کاربری زیبا دریافت کنید، پایگاههای داده را به عنوان منابع برای کار بیشتر مشخص کنید، داشبورد و نمودار ایجاد کنید.
نسخه اصلی یک اشکال قابل توجه دارد - به هیچ وجه قابل تحمل نیست. به این معنی که کل عملکرد برنامه به قابلیت زیست یک ماشین مجازی بستگی دارد. اگر رد کند یا 10 نفر همزمان UI را باز کنند، مشکلاتی پیش خواهد آمد.
آنها را می توان به سادگی حل کرد: شما فقط باید ... بسیاری از ماشین های مجازی یکسان را با یک وب سرور مستقر کنید و آنها را در زیر یک متعادل کننده L3 قرار دهید. اما اینجا همه چیز چندان واضح نیست. Grafana تنظیمات کاربر (مسیرهای پایگاه داده، داشبورد، نمودارها و غیره) را مستقیماً روی دیسک ماشین مجازی خود ذخیره می کند. بنابراین، اگر برخی از تنظیمات را در UI تغییر دهیم، این تغییرات فقط در ماشین مجازی که متعادل کننده ما را ارسال کرده است، منعکس خواهد شد. این منجر به تنظیمات ناسازگار برای برنامه ما می شود و باعث ایجاد مشکلاتی در راه اندازی و استفاده می شود.
در اینجا پایگاه داده دیگری به کمک می آید، به عنوان مثال MySQL یا معادل آن. ما به Grafana می گوییم که او باید تنظیمات کاربر را در این پایگاه داده "یدکی" ذخیره کند. پس از آن، کافی است یک بار مسیر این پایگاه داده را در هر ماشین مشخص کنید و تمام تنظیمات دیگر کاربر را در هر یک از ماشین های مجازی ویرایش کنید؛ آنها به سایرین گسترش خواهند یافت.
در اینجا یک نمودار از زیرساخت برنامه نهایی آمده است:
یاد بگیریم با دست بلند کنیم
MySQL و ClickHouse
قبل از استقرار چنین برنامه ای با کلیک یک دکمه، لازم بود یاد بگیریم که چگونه هر یک از اجزای آن را مدیریت کرده و آنها را با یکدیگر ادغام کنیم.
در اینجا Yandex.Cloud به ما کمک می کند، که متعادل کننده های L3، ClickHouse و MySQL را به عنوان خدمات مدیریت شده ارائه می دهد. کاربر فقط باید پارامترها را مشخص کند و منتظر بماند تا پلتفرم همه چیز را به حالت کار درآورد.
من ثبت نام کردم، یک ابر و یک حساب پرداخت ایجاد کردم. پس از آن، به ابر رفتم و خوشه های MySQL و ClickHouse را با حداقل تنظیمات راه اندازی کردم. صبر کردم تا فعال شدند.
همچنین باید به خاطر داشته باشید که در هر کلاستر یک پایگاه داده ایجاد کنید و دسترسی به آن را با استفاده از لاگین و رمز عبور پیکربندی کنید. من در اینجا وارد جزئیات نمی شوم - همه چیز در رابط کاملاً واضح است.
جزئیات غیر واضح این بود که این پایگاههای داده میزبانهای زیادی دارند که تحمل خطای آنها را تضمین میکند. با این حال، Grafana برای هر پایگاه داده ای که با آن کار می کند دقیقاً به یک هاست نیاز دارد. طولانی خواندن c-<cluster_id>.rw.mdb.yandexcloud.net
به میزبان اصلی فعال فعلی خوشه با شناسه مربوطه نگاشت شده است. این چیزی است که ما به گرافانا خواهیم داد.
وب سرور
حالا نوبت به وب سرور است. بیایید یک ماشین مجازی معمولی با لینوکس ایجاد کنیم و Grafana را به صورت دستی روی آن پیکربندی کنیم.
بیایید از طریق 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
پس از آن، اجازه دهید Grafana را تحت systemctl اجرا کنیم و افزونه کار با ClickHouse را نصب کنیم (بله، در بسته اصلی ارائه نشده است).
sudo systemctl start grafana-server
sudo systemctl enable grafana-server
sudo grafana-cli plugins install vertamedia-clickhouse-datasource
همین، بعد از آن با یک دستور ساده
sudo service grafana-server start
ما وب سرور را راه اندازی خواهیم کرد. اکنون می توانید آدرس IP خارجی ماشین مجازی را در مرورگر وارد کنید، پورت 3000 را مشخص کنید و رابط کاربری زیبای Grafana را مشاهده کنید.
اما عجله نکنید، قبل از راه اندازی Grafana، باید به خاطر داشته باشید که مسیر MySQL را به آن بگویید تا تنظیمات را در آنجا ذخیره کنید.
کل پیکربندی وب سرور گرافانا در فایل موجود است /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 ما ClickHouse را به عنوان DataSource مشخص می کنیم.
من توانستم با تنظیمات زیر به یک پیکربندی کاری دست یابم:
من به عنوان URL مشخص کردم https://c-<cluster_id>.rw.mdb.yandexcloud.net:8443
همه! ما یک ماشین مجازی داریم که یک وب سرور متصل به CH و MySQL دارد. از قبل می توانید مجموعه داده را در ClickHouse آپلود کنید و داشبورد بسازید. با این حال، ما هنوز به هدف خود نرسیده ایم و زیرساخت کاملی را مستقر نکرده ایم.
بستهبند
Yandex.Cloud به شما امکان می دهد یک تصویر دیسک از یک ماشین مجازی موجود ایجاد کنید، و بر اساس آن - هر تعداد ماشین یکسان با یکدیگر. این دقیقاً همان چیزی است که ما استفاده خواهیم کرد. برای مونتاژ راحت تصویر، ابزار را بردارید
فایل json ما از دو بلوک تشکیل شده است: سازنده و تامین کننده. بلوک اول پارامترهای خود تصویر را به عنوان یک موجود توصیف می کند و بلوک دوم دستورالعمل هایی را برای پر کردن آن با محتوای لازم توصیف می کند.
سازندگان
{
"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 قرار داده و وب سرور را مجددا راه اندازی می کند.
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
بعد از این 3 کار باقی مانده است:
1) بسته ها را نصب کنید
2) Grafana را تحت systemctl اجرا کنید و افزونه ClickHouse را نصب کنید
3) اسکریپت setup.sh را بلافاصله پس از روشن کردن ماشین مجازی در صف راه اندازی قرار دهید.
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;
اکنون تنها چیزی که باقی می ماند این است که Packer را اجرا کنید و تصویر خروجی را در قسمت مشخص شده قرار دهید. هنگام ایجاد یک ماشین مجازی، می توانید آن را به عنوان یک دیسک بوت انتخاب کنید و پس از راه اندازی یک وب سرور آماده Grafana دریافت خواهید کرد.
گروه نمونه و متعادل کننده
هنگامی که یک تصویر دیسک داریم که به ما امکان می دهد بسیاری از وب سرورهای یکسان Grafana را ایجاد کنیم، می توانیم یک گروه نمونه ایجاد کنیم. در پلتفرم Yandex.Cloud، این اصطلاح به اتحادیه ماشینهای مجازی اشاره دارد که ویژگیهای یکسانی دارند. هنگام ایجاد یک گروه نمونه، نمونه اولیه همه ماشینهای این گروه و سپس ویژگیهای خود گروه (به عنوان مثال، حداقل و حداکثر تعداد ماشینهای فعال) پیکربندی میشود. اگر شماره فعلی با این معیارها مطابقت نداشته باشد، خود گروه نمونه ماشینهای غیر ضروری را حذف میکند یا ماشینهای جدیدی را در تصویر خود ایجاد میکند.
به عنوان بخشی از وظیفه خود، ما یک گروه نمونه از سرورهای وب ایجاد خواهیم کرد که از تصویر دیسک ایجاد شده قبلی تولید می شوند.
آنچه واقعاً قابل توجه است، آخرین نمونه راه اندازی گروه است. گروه هدف در ادغام با Load Balancer به شما کمک می کند تا با کلیک بر روی چند دکمه، تعادل L3 را در بالای ماشین های مجازی این گروه پیکربندی کنید.
هنگام راه اندازی متعادل کننده، دو نکته مهم را اجرا کردم:
- متعادل کننده را مجبور کردم که ترافیک کاربر در پورت 80 را بپذیرد و آن را به پورت 3000 ماشین های مجازی هدایت کند، دقیقاً جایی که گرافانا زندگی می کند.
- من با پینگ کردن ماشینها به پورت 3000، قابلیت بررسی زنده بودن ماشینها را تنظیم کردم.
خلاصه کوتاه
در نهایت، ما توانستیم زیرساخت برنامه مورد نظر را به صورت دستی مستقر کنیم و اکنون یک سرویس 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 - نشانه ای برای دسترسی به ابر. می توان به دست آورد
cloud_id - شناسه ابری که در آن برنامه را مستقر خواهیم کرد
folder_id - شناسه بخش که در آن برنامه را مستقر خواهیم کرد
service_account_id - شناسه حساب سرویس در بخش مربوطه ابر.
image_id - شناسه تصویر دیسک به دست آمده با استفاده از Packer
نام کاربری и کلمه عبور - نام کاربری و رمز عبور برای دسترسی به هر دو پایگاه داده و وب سرور Grafana
dbname - نام پایگاه داده در کلاسترهای 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"
}
متوجه خواهید شد که در اینجا ما از متغیرهای تعریف شده در بالا استفاده می کنیم.
شبکه و خوشه ها
اکنون شبکه ای ایجاد خواهیم کرد که در آن عناصر زیرساخت ما، سه زیر شبکه (یکی در هر منطقه) با هم ارتباط برقرار می کنند و خوشه های 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
}
}
همانطور که می بینید، هر یک از دو خوشه با قرار گرفتن در سه منطقه در دسترس، کاملاً مقاوم به خطا ایجاد می شوند.
وب سرورها
به نظر می رسید می توانستیم با همین روحیه ادامه دهیم، اما من به مشکل برخوردم. قبل از این، ابتدا یک کلاستر MySQL را مطرح کردم و تنها پس از آن با دانستن شناسه آن، یک تصویر دیسک با پیکربندی مورد نیاز جمع آوری کردم و در آنجا میزبان خوشه را مشخص کردم. اما اکنون ما شناسه خوشه را قبل از راه اندازی Terraform، از جمله در زمان ساخت تصویر، نمی دانیم. بنابراین مجبور شدم به موارد زیر متوسل شوم
با استفاده از سرویس ابرداده آمازون، برخی از پارامترها را به ماشین مجازی منتقل می کنیم که آنها را می پذیرد و پردازش می کند. ما به ماشین نیاز داریم تا پس از راه اندازی به ابرداده پشت میزبان خوشه MySQL و نام کاربری-گذرواژه که کاربر در فایل Terraform مشخص کرده است، برود. بیایید محتویات فایل را کمی تغییر دهیم setup.sh
، که با روشن شدن ماشین مجازی اجرا می شود.
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
گروه نمونه و متعادل کننده
پس از بازسازی یک تصویر دیسک جدید، در نهایت می توانیم فایل خود را برای 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 رفته و به صورت دستی خوشه CH (که شناسه آن هنوز باید دریافت شود) را به عنوان منبع داده اضافه کنید. اما Terraform شناسه خوشه را می داند. بیایید به او واگذار کنیم تا کار را به سرانجام برساند.
بیایید یک ارائه دهنده جدید اضافه کنیم - 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 اجرا کنید. ابزارهای مفید HashiCorp مانند Packer و Terraform می توانند در این زمینه به شما کمک کنند. امیدوارم کسی این مقاله را مفید بیابد :)
PS در زیر پیوندی را به مخزن ضمیمه می کنم که در آن می توانید دستور العمل های آماده برای Packer و Terraform را پیدا کنید که بخش هایی از آنها را در این مقاله ارائه کردم.
منبع: www.habr.com