استقرار خدمات توزیع شده در Yandex.Cloud با استفاده از Grafana به عنوان مثال

سلام به همه! به عنوان بخشی از کار دوره ای خود، در مورد قابلیت های چنین پلتفرم ابری داخلی تحقیق کردم Yandex.Cloud. این پلتفرم خدمات مختلفی را برای حل مشکلات عملی ارائه می دهد. با این حال، گاهی اوقات لازم است برنامه ابری خود را با زیرساخت نسبتاً گسترده بر اساس این خدمات راه اندازی کنید. در این مقاله می‌خواهم تجربه خود را در استفاده از چنین برنامه‌ای به اشتراک بگذارم.

استقرار خدمات توزیع شده در Yandex.Cloud با استفاده از Grafana به عنوان مثال

چه چیزی را می خواهید دریافت کنید؟

گرافانا - یک ابزار قدرتمند برای حل مسائل تحلیلی یا نظارت بر مشکلات هر سیستم. در پیکربندی اولیه خود، این یک ماشین مجازی با یک وب سرور Grafana و همچنین یک پایگاه داده (ClickHouse، InfluxDB، و غیره) با مجموعه داده ای است که تجزیه و تحلیل بر اساس آن خواهد بود.

پس از راه‌اندازی یک ماشین مجازی با وب سرور، می‌توانید به میزبان آن بروید و یک رابط کاربری زیبا دریافت کنید، پایگاه‌های داده را به عنوان منابع برای کار بیشتر مشخص کنید، داشبورد و نمودار ایجاد کنید.

استقرار خدمات توزیع شده در Yandex.Cloud با استفاده از Grafana به عنوان مثال

نسخه اصلی یک اشکال قابل توجه دارد - به هیچ وجه قابل تحمل نیست. به این معنی که کل عملکرد برنامه به قابلیت زیست یک ماشین مجازی بستگی دارد. اگر رد کند یا 10 نفر همزمان UI را باز کنند، مشکلاتی پیش خواهد آمد.

آنها را می توان به سادگی حل کرد: شما فقط باید ... بسیاری از ماشین های مجازی یکسان را با یک وب سرور مستقر کنید و آنها را در زیر یک متعادل کننده L3 قرار دهید. اما اینجا همه چیز چندان واضح نیست. Grafana تنظیمات کاربر (مسیرهای پایگاه داده، داشبورد، نمودارها و غیره) را مستقیماً روی دیسک ماشین مجازی خود ذخیره می کند. بنابراین، اگر برخی از تنظیمات را در UI تغییر دهیم، این تغییرات فقط در ماشین مجازی که متعادل کننده ما را ارسال کرده است، منعکس خواهد شد. این منجر به تنظیمات ناسازگار برای برنامه ما می شود و باعث ایجاد مشکلاتی در راه اندازی و استفاده می شود.

در اینجا پایگاه داده دیگری به کمک می آید، به عنوان مثال MySQL یا معادل آن. ما به Grafana می گوییم که او باید تنظیمات کاربر را در این پایگاه داده "یدکی" ذخیره کند. پس از آن، کافی است یک بار مسیر این پایگاه داده را در هر ماشین مشخص کنید و تمام تنظیمات دیگر کاربر را در هر یک از ماشین های مجازی ویرایش کنید؛ آنها به سایرین گسترش خواهند یافت.

در اینجا یک نمودار از زیرساخت برنامه نهایی آمده است:

استقرار خدمات توزیع شده در Yandex.Cloud با استفاده از Grafana به عنوان مثال

یاد بگیریم با دست بلند کنیم

MySQL و ClickHouse

قبل از استقرار چنین برنامه ای با کلیک یک دکمه، لازم بود یاد بگیریم که چگونه هر یک از اجزای آن را مدیریت کرده و آنها را با یکدیگر ادغام کنیم.

در اینجا Yandex.Cloud به ما کمک می کند، که متعادل کننده های L3، ClickHouse و MySQL را به عنوان خدمات مدیریت شده ارائه می دهد. کاربر فقط باید پارامترها را مشخص کند و منتظر بماند تا پلتفرم همه چیز را به حالت کار درآورد.

من ثبت نام کردم، یک ابر و یک حساب پرداخت ایجاد کردم. پس از آن، به ابر رفتم و خوشه های MySQL و ClickHouse را با حداقل تنظیمات راه اندازی کردم. صبر کردم تا فعال شدند.

استقرار خدمات توزیع شده در Yandex.Cloud با استفاده از Grafana به عنوان مثالاستقرار خدمات توزیع شده در Yandex.Cloud با استفاده از Grafana به عنوان مثال

همچنین باید به خاطر داشته باشید که در هر کلاستر یک پایگاه داده ایجاد کنید و دسترسی به آن را با استفاده از لاگین و رمز عبور پیکربندی کنید. من در اینجا وارد جزئیات نمی شوم - همه چیز در رابط کاملاً واضح است.

جزئیات غیر واضح این بود که این پایگاه‌های داده میزبان‌های زیادی دارند که تحمل خطای آنها را تضمین می‌کند. با این حال، Grafana برای هر پایگاه داده ای که با آن کار می کند دقیقاً به یک هاست نیاز دارد. طولانی خواندن مستندات ابرها مرا به تصمیمی رساندند. معلوم می شود که میزبان گونه c-<cluster_id>.rw.mdb.yandexcloud.net به میزبان اصلی فعال فعلی خوشه با شناسه مربوطه نگاشت شده است. این چیزی است که ما به گرافانا خواهیم داد.

وب سرور

حالا نوبت به وب سرور است. بیایید یک ماشین مجازی معمولی با لینوکس ایجاد کنیم و Grafana را به صورت دستی روی آن پیکربندی کنیم.

استقرار خدمات توزیع شده در Yandex.Cloud با استفاده از Grafana به عنوان مثال

استقرار خدمات توزیع شده در Yandex.Cloud با استفاده از 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 را مشاهده کنید.
استقرار خدمات توزیع شده در Yandex.Cloud با استفاده از 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 مشخص می کنیم.

من توانستم با تنظیمات زیر به یک پیکربندی کاری دست یابم:

استقرار خدمات توزیع شده در Yandex.Cloud با استفاده از Grafana به عنوان مثال

من به عنوان URL مشخص کردم https://c-<cluster_id>.rw.mdb.yandexcloud.net:8443

همه! ما یک ماشین مجازی داریم که یک وب سرور متصل به CH و MySQL دارد. از قبل می توانید مجموعه داده را در ClickHouse آپلود کنید و داشبورد بسازید. با این حال، ما هنوز به هدف خود نرسیده ایم و زیرساخت کاملی را مستقر نکرده ایم.

بستهبند

Yandex.Cloud به شما امکان می دهد یک تصویر دیسک از یک ماشین مجازی موجود ایجاد کنید، و بر اساس آن - هر تعداد ماشین یکسان با یکدیگر. این دقیقاً همان چیزی است که ما استفاده خواهیم کرد. برای مونتاژ راحت تصویر، ابزار را بردارید بستهبند از HashiCorp. یک فایل json با دستورالعمل مونتاژ تصویر را به عنوان ورودی می گیرد.

فایل 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 دریافت خواهید کرد.

استقرار خدمات توزیع شده در Yandex.Cloud با استفاده از Grafana به عنوان مثال
استقرار خدمات توزیع شده در Yandex.Cloud با استفاده از Grafana به عنوان مثال

گروه نمونه و متعادل کننده

هنگامی که یک تصویر دیسک داریم که به ما امکان می دهد بسیاری از وب سرورهای یکسان Grafana را ایجاد کنیم، می توانیم یک گروه نمونه ایجاد کنیم. در پلتفرم Yandex.Cloud، این اصطلاح به اتحادیه ماشین‌های مجازی اشاره دارد که ویژگی‌های یکسانی دارند. هنگام ایجاد یک گروه نمونه، نمونه اولیه همه ماشین‌های این گروه و سپس ویژگی‌های خود گروه (به عنوان مثال، حداقل و حداکثر تعداد ماشین‌های فعال) پیکربندی می‌شود. اگر شماره فعلی با این معیارها مطابقت نداشته باشد، خود گروه نمونه ماشین‌های غیر ضروری را حذف می‌کند یا ماشین‌های جدیدی را در تصویر خود ایجاد می‌کند.

به عنوان بخشی از وظیفه خود، ما یک گروه نمونه از سرورهای وب ایجاد خواهیم کرد که از تصویر دیسک ایجاد شده قبلی تولید می شوند.

استقرار خدمات توزیع شده در Yandex.Cloud با استفاده از Grafana به عنوان مثال

استقرار خدمات توزیع شده در Yandex.Cloud با استفاده از Grafana به عنوان مثال

آنچه واقعاً قابل توجه است، آخرین نمونه راه اندازی گروه است. گروه هدف در ادغام با Load Balancer به شما کمک می کند تا با کلیک بر روی چند دکمه، تعادل L3 را در بالای ماشین های مجازی این گروه پیکربندی کنید.

استقرار خدمات توزیع شده در Yandex.Cloud با استفاده از Grafana به عنوان مثال

هنگام راه اندازی متعادل کننده، دو نکته مهم را اجرا کردم:

  1. متعادل کننده را مجبور کردم که ترافیک کاربر در پورت 80 را بپذیرد و آن را به پورت 3000 ماشین های مجازی هدایت کند، دقیقاً جایی که گرافانا زندگی می کند.
  2. من با پینگ کردن ماشین‌ها به پورت 3000، قابلیت بررسی زنده بودن ماشین‌ها را تنظیم کردم.

استقرار خدمات توزیع شده در Yandex.Cloud با استفاده از Grafana به عنوان مثال

خلاصه کوتاه

در نهایت، ما توانستیم زیرساخت برنامه مورد نظر را به صورت دستی مستقر کنیم و اکنون یک سرویس Grafana بسیار انعطاف پذیر داریم. شما فقط باید آدرس IP متعادل کننده را به عنوان نقطه ورود به برنامه و میزبان خوشه ClickHouse بدانید تا مجموعه داده را در آن بارگیری کنید.

به نظر می رسد یک پیروزی است؟ بله پیروزی اما هنوز چیزی من را گیج می کند. کل فرآیند فوق به مراحل دستی زیادی نیاز دارد و اصلاً مقیاس پذیر نیست؛ در صورت امکان می خواهم آن را خودکار کنم. این همان چیزی است که بخش بعدی به آن اختصاص خواهد یافت.

ادغام Terraform

ما دوباره از ابزار HashiCorp به نام استفاده خواهیم کرد Terraform. این به شما کمک می کند تا کل زیرساخت برنامه را با کلیک یک دکمه، بر اساس چندین متغیر ارسال شده توسط کاربر، مستقر کنید. بیایید دستوری بنویسیم که می تواند چندین بار در بخش های مختلف کاربران مختلف اجرا شود.

تمام کار با 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

و در ابر، عناصر زیرساخت برجسته قابل مشاهده خواهد بود:

استقرار خدمات توزیع شده در Yandex.Cloud با استفاده از Grafana به عنوان مثال

خلاصه کردن

اکنون، با استفاده از Grafana به عنوان مثال، هر یک از شما می‌توانید برنامه‌هایی را با معماری ابری گسترده در پلتفرم Yandex.Cloud اجرا کنید. ابزارهای مفید HashiCorp مانند Packer و Terraform می توانند در این زمینه به شما کمک کنند. امیدوارم کسی این مقاله را مفید بیابد :)

PS در زیر پیوندی را به مخزن ضمیمه می کنم که در آن می توانید دستور العمل های آماده برای Packer و Terraform را پیدا کنید که بخش هایی از آنها را در این مقاله ارائه کردم.

مخزن

منبع: www.habr.com

اضافه کردن نظر