نشر الخدمات الموزعة في Yandex.Cloud باستخدام Grafana كمثال

أهلاً بكم! كجزء من عملي في الدورة التدريبية ، كنت أبحث عن إمكانيات منصة سحابية محلية مثل ياندكس كلاود. تقدم المنصة خدمات متنوعة لحل المشكلات العملية. ومع ذلك ، في بعض الأحيان يكون من الضروري تكوين التطبيق السحابي الخاص بك ببنية تحتية واسعة النطاق تعتمد على هذه الخدمات. في هذه المقالة ، أرغب في مشاركة تجربة نشر مثل هذا التطبيق.

نشر الخدمات الموزعة في Yandex.Cloud باستخدام Grafana كمثال

ماذا تريد ان تحصل؟

جرافانا - أداة قوية لحل المشاكل التحليلية أو مراقبة مشاكل أي أنظمة. في تكوينه الأساسي ، يعد هذا جهازًا افتراضيًا مزودًا بخادم الويب Grafana ، بالإضافة إلى قاعدة بيانات (ClickHouse ، InfluxDB ، إلخ) مع مجموعة بيانات سيتم استخدامها لبناء التحليلات.

بعد بدء تشغيل جهاز افتراضي بخادم ويب ، يمكنك الانتقال إلى مضيفه والحصول على واجهة مستخدم جميلة ، وتحديد قواعد البيانات كمصادر لمزيد من العمل ، وإنشاء لوحات معلومات ورسوم بيانية.

نشر الخدمات الموزعة في Yandex.Cloud باستخدام Grafana كمثال

يحتوي الإصدار الأساسي على عيب كبير - فهو لا يتحمل الأخطاء على الإطلاق. أي أن الأداء الكامل للتطبيق يعتمد على صلاحية جهاز افتراضي واحد. إذا رفضت أو إذا فتح 10 أشخاص واجهة المستخدم في نفس الوقت ، فستظهر مشاكل.

يتم حلها ببساطة: تحتاج فقط إلى نشر العديد من الأجهزة الافتراضية المتطابقة مع خادم ويب ووضعها تحت موازن L3. لكن ليس كل شيء واضح المعالم هنا. يقوم Grafana بتخزين إعدادات المستخدم (المسارات إلى قواعد البيانات ، ولوحات المعلومات ، والرسومات ، وما إلى ذلك) مباشرةً على قرص الجهاز الظاهري الخاص به. وبالتالي ، إذا قمت بتغيير بعض الإعدادات في واجهة المستخدم ، فسيتم عرض هذه التغييرات فقط على الجهاز الظاهري الذي أرسلنا إليه الموازن. سيؤدي هذا إلى إعدادات غير متسقة لتطبيقنا ، ومشاكل في التشغيل والاستخدام.

هنا ستأتي قاعدة بيانات أخرى للإنقاذ ، على سبيل المثال ، MySQL أو ما يعادلها. أخبرنا جرافانا أنه يجب عليها تخزين إعدادات المستخدم في قاعدة البيانات "الاحتياطية" هذه. بعد ذلك ، يكفي تحديد المسار إلى قاعدة البيانات هذه على كل جهاز مرة واحدة ، وتعديل جميع إعدادات المستخدم الأخرى على أي من الأجهزة الظاهرية ، وسوف تنمو على الباقي.

فيما يلي رسم تخطيطي للبنية التحتية للتطبيق النهائي:

نشر الخدمات الموزعة في 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 تعيين إلى مضيف الكتلة الرئيسي النشط الحالي بالمعرف المقابل. هذا ما سنعطيه لغرافانا.

قاعدة بيانات للانترنت

الآن الأمر متروك لخادم الويب. لنقم بإنشاء آلة افتراضية عادية مع Linux ونقوم بإعداد 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 لتخزين الإعدادات هناك.

التكوين الكامل لخادم الويب 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 باعتباره مصدر البيانات.

تمكنت من تحقيق تكوين عمل بالإعدادات التالية:

نشر الخدمات الموزعة في 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 وإعادة تشغيل خادم الويب.

الإعداد.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 في قائمة الانتظار ليتم تشغيله فورًا بعد تشغيل الجهاز الظاهري.

تثبيت الحزم.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 

جرافانا-setup.sh:

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

تشغيل الإعداد في 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 من الأجهزة الافتراضية ، حيث تعيش Grafana فقط.
  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 - معرف حساب الخدمة في القسم المقابل من السحابة.
معرّف_صورة - معرّف صورة القرص التي تم الحصول عليها باستخدام Packer
اسم المستخدم и كلمه السر - اسم المستخدم وكلمة المرور للوصول إلى كل من قواعد البيانات وخادم الويب Grafana
com.dbname - اسم قاعدة البيانات داخل مجموعات CH و MySQL
public_key_path - المسار إلى الملف باستخدام مفتاح 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 ، بما في ذلك وقت إنشاء الصورة. لذلك اضطررت إلى اللجوء إلى ما يلي حيلة.

باستخدام خدمة البيانات الوصفية من 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

مجموعة Intance وموازن

بعد إعادة بناء صورة القرص الجديدة ، يمكننا أخيرًا إضافة ملفنا لـ 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 في ذلك. آمل أن يجد شخص ما هذه المقالة مفيدة 🙂

ملاحظة أدناه ، سأرفق رابطًا للمستودع ، حيث يمكنك العثور على وصفات جاهزة لـ Packer و Terraform ، والتي أشرت إلى أجزاء منها في هذه المقالة.

مخزن

المصدر: www.habr.com

إضافة تعليق