Triển khai các dịch vụ phân tán trong Yandex.Cloud bằng Grafana làm ví dụ

Chào mọi người! Là một phần của khóa học, tôi đã nghiên cứu khả năng của nền tảng đám mây trong nước như Yandex.Cloud. Nền tảng này cung cấp nhiều dịch vụ khác nhau để giải quyết các vấn đề thực tế. Tuy nhiên, đôi khi bạn cần thiết lập ứng dụng đám mây của riêng mình với cơ sở hạ tầng khá rộng rãi dựa trên các dịch vụ này. Trong bài viết này tôi muốn chia sẻ kinh nghiệm của mình trong việc triển khai một ứng dụng như vậy.

Triển khai các dịch vụ phân tán trong Yandex.Cloud bằng Grafana làm ví dụ

Bạn muốn nhận được gì?

grafana — một công cụ mạnh mẽ để giải quyết các vấn đề phân tích hoặc giám sát các vấn đề của bất kỳ hệ thống nào. Trong cấu hình cơ bản, đây là một máy ảo có máy chủ web Grafana, cũng như cơ sở dữ liệu (ClickHouse, InfluxDB, v.v.) với tập dữ liệu sẽ dựa trên phân tích.

Sau khi khởi chạy máy ảo bằng máy chủ web, bạn có thể truy cập máy chủ của nó và nhận giao diện người dùng đẹp mắt, chỉ định cơ sở dữ liệu làm nguồn để làm việc tiếp, tạo bảng điều khiển và biểu đồ.

Triển khai các dịch vụ phân tán trong Yandex.Cloud bằng Grafana làm ví dụ

Phiên bản cơ bản có một nhược điểm đáng kể - nó hoàn toàn không có khả năng chịu lỗi. Nghĩa là, toàn bộ chức năng của ứng dụng phụ thuộc vào khả năng tồn tại của một máy ảo. Nếu nó từ chối hoặc 10 người mở UI cùng lúc thì vấn đề sẽ phát sinh.

Chúng có thể được giải quyết một cách đơn giản: bạn chỉ cần... triển khai nhiều máy ảo giống hệt nhau với một máy chủ web và đặt chúng dưới bộ cân bằng L3. Nhưng không phải mọi thứ đều rõ ràng ở đây. Grafana lưu trữ cài đặt người dùng (đường dẫn đến cơ sở dữ liệu, trang tổng quan, đồ thị, v.v.) trực tiếp trên đĩa của máy ảo. Do đó, nếu chúng tôi thay đổi một số cài đặt trong giao diện người dùng, những thay đổi này sẽ chỉ được phản ánh trên máy ảo mà bộ cân bằng đã gửi cho chúng tôi. Điều này sẽ dẫn đến cài đặt ứng dụng của chúng ta không nhất quán, gây ra sự cố khi khởi chạy và sử dụng.

Ở đây, một cơ sở dữ liệu khác sẽ được giải cứu, chẳng hạn như MySQL hoặc tương đương. Chúng tôi nói với Grafana rằng cô ấy nên lưu trữ cài đặt người dùng trong cơ sở dữ liệu “dự phòng” này. Sau đó, chỉ cần chỉ định đường dẫn đến cơ sở dữ liệu này một lần trên mỗi máy và chỉnh sửa tất cả các cài đặt người dùng khác trên bất kỳ máy ảo nào là đủ; chúng sẽ mở rộng sang các máy khác.

Dưới đây là sơ đồ cơ sở hạ tầng ứng dụng cuối cùng:

Triển khai các dịch vụ phân tán trong Yandex.Cloud bằng Grafana làm ví dụ

Hãy học cách nâng bằng tay

MySQL và ClickHouse

Trước khi triển khai một ứng dụng như vậy chỉ bằng một nút bấm, cần phải học cách xử lý từng thành phần của nó và tích hợp chúng với nhau.

Ở đây Yandex.Cloud sẽ giúp chúng tôi, nơi cung cấp bộ cân bằng L3, ClickHouse và MySQL dưới dạng dịch vụ được quản lý. Người dùng chỉ cần chỉ định các tham số và đợi cho đến khi nền tảng đưa mọi thứ vào hoạt động.

Tôi đã đăng ký, tạo đám mây và tài khoản thanh toán. Sau đó, tôi truy cập đám mây và thiết lập các cụm MySQL và ClickHouse với cài đặt tối thiểu. Tôi đợi cho đến khi họ hoạt động.

Triển khai các dịch vụ phân tán trong Yandex.Cloud bằng Grafana làm ví dụTriển khai các dịch vụ phân tán trong Yandex.Cloud bằng Grafana làm ví dụ

Bạn cũng cần nhớ tạo cơ sở dữ liệu trong mỗi cụm và định cấu hình quyền truy cập vào cơ sở dữ liệu đó bằng thông tin đăng nhập và mật khẩu. Tôi sẽ không đi vào chi tiết ở đây - mọi thứ đều khá rõ ràng trong giao diện.

Chi tiết không rõ ràng là các cơ sở dữ liệu này có nhiều máy chủ, đảm bảo khả năng chịu lỗi của chúng. Tuy nhiên, Grafana yêu cầu chính xác một máy chủ cho mỗi cơ sở dữ liệu mà nó hoạt động. đọc dài tài liệu Những đám mây đưa tôi đến một quyết định. Hóa ra là vật chủ của loài c-<cluster_id>.rw.mdb.yandexcloud.net được ánh xạ tới máy chủ chính đang hoạt động hiện tại của cụm với ID tương ứng. Đây là những gì chúng tôi sẽ cung cấp cho Grafana.

máy chủ web

Bây giờ nó phụ thuộc vào máy chủ web. Hãy tạo một máy ảo thông thường chạy Linux và cấu hình Grafana trên đó theo cách thủ công.

Triển khai các dịch vụ phân tán trong Yandex.Cloud bằng Grafana làm ví dụ

Triển khai các dịch vụ phân tán trong Yandex.Cloud bằng Grafana làm ví dụ

Hãy kết nối qua ssh và cài đặt các gói cần thiết.

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 

Sau đó, hãy chạy Grafana trong systemctl và cài đặt plugin để làm việc với ClickHouse (vâng, nó không được cung cấp trong gói cơ bản).

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

Thế là xong, sau đó bằng một lệnh đơn giản

sudo service grafana-server start

chúng ta sẽ khởi động máy chủ web. Bây giờ bạn có thể nhập địa chỉ IP bên ngoài của máy ảo vào trình duyệt, chỉ định cổng 3000 và xem giao diện người dùng Grafana đẹp mắt.
Triển khai các dịch vụ phân tán trong Yandex.Cloud bằng Grafana làm ví dụ

Nhưng đừng vội, trước khi thiết lập Grafana, bạn phải nhớ chỉ cho nó đường dẫn đến MySQL để lưu trữ các cài đặt ở đó.

Toàn bộ cấu hình của web server Grafana nằm trong file /etc/grafana/grafana.ini. Dòng yêu cầu trông như thế này:

;url =

Chúng tôi đặt máy chủ vào cụm MySQL. Cùng một tệp chứa thông tin đăng nhập và mật khẩu để truy cập Grafana trong hình trên, theo mặc định, cả hai đều bằng nhau admin.

Bạn có thể sử dụng lệnh 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

Đã đến lúc khởi động lại máy chủ web!

sudo service grafana-server restart

Bây giờ trong Giao diện người dùng Grafana, chúng tôi sẽ chỉ định ClickHouse làm Nguồn dữ liệu.

Tôi đã có thể đạt được cấu hình hoạt động với các cài đặt sau:

Triển khai các dịch vụ phân tán trong Yandex.Cloud bằng Grafana làm ví dụ

Tôi đã chỉ định làm URL https://c-<cluster_id>.rw.mdb.yandexcloud.net:8443

Tất cả! Chúng tôi có một máy ảo đang hoạt động với máy chủ web được kết nối với CH và MySQL. Bạn đã có thể tải tập dữ liệu lên ClickHouse và xây dựng trang tổng quan. Tuy nhiên, chúng tôi vẫn chưa đạt được mục tiêu và chưa triển khai cơ sở hạ tầng đầy đủ.

Người đóng gói

Yandex.Cloud cho phép bạn tạo ảnh đĩa của một máy ảo hiện có và trên cơ sở đó - bất kỳ số lượng máy nào giống hệt nhau. Đây chính xác là những gì chúng ta sẽ sử dụng. Để lắp ráp hình ảnh một cách thuận tiện, hãy sử dụng công cụ Người đóng gói từ HashiCorp. Nó lấy đầu vào là một tệp json với các hướng dẫn để lắp ráp hình ảnh.

Tệp json của chúng tôi sẽ bao gồm hai khối: trình xây dựng và trình cung cấp. Khối đầu tiên mô tả các tham số của chính hình ảnh như một thực thể và khối thứ hai mô tả các hướng dẫn để điền nội dung cần thiết vào hình ảnh đó.

Xây Dựng

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

Trong mẫu này, bạn cần đặt mã nhận dạng của phần trên đám mây nơi bạn muốn tạo hình ảnh, cũng như đường dẫn đến tệp bằng các khóa từ tài khoản dịch vụ đã tạo trước đó trong phần này. Bạn có thể đọc thêm về cách tạo tài khoản dịch vụ và khóa dưới dạng tệp trong phần tương ứng tài liệu.

Cấu hình này cho biết disk image sẽ được xây dựng dựa trên nền tảng ubuntu-1804-lts, được đặt trong phần người dùng thích hợp trong họ hình ảnh GRAFANA dưới tên grafana-{{timestamp}}.

cung cấp

Bây giờ đến phần thú vị hơn của cấu hình. Nó sẽ mô tả chuỗi hành động cần được thực hiện trên máy ảo trước khi đóng băng trạng thái của nó thành ảnh đĩa.

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

Ở đây tất cả các hành động được chia thành 3 giai đoạn. Ở giai đoạn đầu tiên, một tập lệnh đơn giản được thực thi để tạo một thư mục phụ trợ.

chuẩn bị-ctg.sh:

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

Ở giai đoạn tiếp theo, chúng tôi đặt một tập lệnh trong thư mục này, tập lệnh này sẽ cần được khởi chạy ngay sau khi khởi động máy ảo. Tập lệnh này sẽ đặt các biến người dùng cần được đăng ký trong cấu hình Grafana và khởi động lại máy chủ web.

thiết lập.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

Sau này còn 3 việc phải làm:
1) cài đặt gói
2) chạy Grafana trong systemctl và cài đặt plugin ClickHouse
3) đặt tập lệnh setup.sh vào hàng đợi khởi chạy ngay sau khi bật máy ảo.

cài đặt-gói.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;

Bây giờ tất cả những gì còn lại là chạy Packer và đặt hình ảnh đầu ra vào phần đã chỉ định. Khi tạo một máy ảo, bạn có thể chọn nó làm đĩa khởi động và sau khi khởi chạy, bạn sẽ nhận được một máy chủ web Grafana được tạo sẵn.

Triển khai các dịch vụ phân tán trong Yandex.Cloud bằng Grafana làm ví dụ
Triển khai các dịch vụ phân tán trong Yandex.Cloud bằng Grafana làm ví dụ

Nhóm sơ thẩm và bộ cân bằng

Sau khi có hình ảnh đĩa cho phép tạo nhiều máy chủ web Grafana giống hệt nhau, chúng ta có thể tạo một nhóm phiên bản. Trên nền tảng Yandex.Cloud, thuật ngữ này đề cập đến sự kết hợp của các máy ảo có cùng đặc điểm. Khi tạo một nhóm phiên bản, nguyên mẫu của tất cả các máy trong nhóm này được định cấu hình và sau đó là các đặc điểm của chính nhóm đó (ví dụ: số lượng máy hoạt động tối thiểu và tối đa). Nếu số hiện tại không đáp ứng các tiêu chí này thì nhóm phiên bản sẽ tự loại bỏ các máy không cần thiết hoặc tạo các máy mới trong hình ảnh của chính nó.

Là một phần trong nhiệm vụ của chúng tôi, chúng tôi sẽ tạo một nhóm máy chủ web sẽ được tạo từ ảnh đĩa đã tạo trước đó.

Triển khai các dịch vụ phân tán trong Yandex.Cloud bằng Grafana làm ví dụ

Triển khai các dịch vụ phân tán trong Yandex.Cloud bằng Grafana làm ví dụ

Điều thực sự đáng chú ý là việc thiết lập nhóm phiên bản cuối cùng. Nhóm mục tiêu tích hợp với Load Balancer sẽ giúp bạn định cấu hình bộ cân bằng L3 trên các máy ảo của nhóm này bằng cách nhấp vào một vài nút.

Triển khai các dịch vụ phân tán trong Yandex.Cloud bằng Grafana làm ví dụ

Khi thiết lập bộ cân bằng, tôi đã thực hiện hai điểm quan trọng:

  1. Tôi đã làm cho bộ cân bằng chấp nhận lưu lượng truy cập của người dùng trên cổng 80 và chuyển hướng nó đến cổng 3000 của máy ảo, chính xác là nơi Grafana sống.
  2. Tôi thiết lập việc kiểm tra khả năng tồn tại của máy bằng cách ping chúng tới cổng 3000.

Triển khai các dịch vụ phân tán trong Yandex.Cloud bằng Grafana làm ví dụ

Tóm tắt nhỏ

Cuối cùng, chúng tôi đã có thể triển khai thủ công cơ sở hạ tầng ứng dụng mong muốn và giờ đây chúng tôi có dịch vụ Grafana có khả năng phục hồi cao. Bạn chỉ cần biết địa chỉ IP của bộ cân bằng làm điểm vào ứng dụng và máy chủ của cụm ClickHouse để tải tập dữ liệu vào đó.

Nó có vẻ giống như một chiến thắng? Vâng, chiến thắng. Nhưng có điều gì đó vẫn làm tôi bối rối. Toàn bộ quá trình trên đòi hỏi nhiều bước thủ công và không thể mở rộng được; tôi muốn tự động hóa nó nếu có thể. Đây là nội dung phần tiếp theo sẽ được dành cho.

Tích hợp địa hình

Chúng ta sẽ lại sử dụng một công cụ từ HashiCorp có tên là Terraform. Nó sẽ giúp bạn triển khai toàn bộ cơ sở hạ tầng ứng dụng chỉ bằng một nút bấm, dựa trên một số biến được người dùng chuyển qua. Hãy viết một công thức có thể chạy nhiều lần trong các phần khác nhau của những người dùng khác nhau.

Tất cả công việc với Terraform đều bắt nguồn từ việc ghi một tệp cấu hình (*.tf) và tạo ra cơ sở hạ tầng dựa trên nó.

Biến

Ở phần đầu của tệp, chúng tôi sẽ bao gồm các biến xác định vị trí và cách thức triển khai cơ sở hạ tầng trong tương lai.

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

Toàn bộ quá trình triển khai ứng dụng sẽ bao gồm việc xây dựng ảnh đĩa và thiết lập các biến này. Hãy để tôi giải thích những gì họ chịu trách nhiệm:

oauth_token — một mã thông báo để truy cập vào đám mây. Có thể thu được bằng cách liên kết.
cloud_id — mã định danh đám mây nơi chúng tôi sẽ triển khai ứng dụng
thư mục_id - mã định danh phần nơi chúng tôi sẽ triển khai ứng dụng
dịch vụ_account_id — mã định danh tài khoản dịch vụ trong phần tương ứng của đám mây.
id_hình ảnh — mã định danh của ảnh đĩa thu được bằng cách sử dụng Packer
tên truy nhập и mật khẩu — tên người dùng và mật khẩu để truy cập cả cơ sở dữ liệu và máy chủ web Grafana
tên cơ sở dữ liệu - tên cơ sở dữ liệu bên trong cụm CH và MySQL
public_key_path - đường dẫn đến tệp bằng khóa ssh công khai của bạn, bạn có thể sử dụng khóa này để kết nối dưới tên ubuntu đến các máy ảo với máy chủ web

Thiết lập nhà cung cấp

Bây giờ bạn cần định cấu hình nhà cung cấp Terraform - trong trường hợp của chúng tôi là Yandex:

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

Bạn sẽ nhận thấy rằng ở đây chúng tôi đang sử dụng các biến được xác định ở trên.

Mạng và cụm

Bây giờ chúng tôi sẽ tạo một mạng trong đó các thành phần cơ sở hạ tầng của chúng tôi sẽ giao tiếp với nhau, ba mạng con (một mạng ở mỗi khu vực) và xây dựng các cụm CH và 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
  }
}

Như bạn có thể thấy, mỗi cụm trong số hai cụm được tạo ra có khả năng chịu lỗi khá tốt bằng cách được đặt trong ba vùng sẵn sàng.

Máy chủ web

Có vẻ như chúng tôi có thể tiếp tục với tinh thần tương tự, nhưng tôi đã gặp khó khăn. Trước đó, lần đầu tiên tôi đã tạo một cụm MySQL và chỉ sau đó, khi biết ID của nó, tôi đã thu thập một ảnh đĩa có cấu hình được yêu cầu, trong đó tôi đã chỉ định máy chủ cho cụm đó. Nhưng bây giờ chúng tôi không biết ID cụm trước khi khởi chạy Terraform, kể cả tại thời điểm xây dựng hình ảnh. Vì vậy, tôi đã phải dùng đến cách sau lừa.

Bằng cách sử dụng dịch vụ siêu dữ liệu của Amazon, chúng tôi sẽ chuyển một số tham số tới máy ảo mà nó sẽ chấp nhận và xử lý. Chúng tôi cần máy truy cập siêu dữ liệu đằng sau máy chủ cụm MySQL và mật khẩu tên người dùng mà người dùng đã chỉ định trong tệp Terraform sau khi bắt đầu. Hãy thay đổi nội dung của tập tin một chút setup.sh, chạy khi máy ảo được bật.

thiết lập.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

Nhóm Intance và bộ cân bằng

Sau khi xây dựng lại ảnh đĩa mới, cuối cùng chúng ta cũng có thể thêm tệp của mình cho Terraform.

Hãy cho biết rằng chúng tôi muốn sử dụng ảnh đĩa hiện có:

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

Bây giờ hãy tạo một nhóm cá thể:

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

Điều đáng chú ý là cách chúng tôi chuyển nó vào siêu dữ liệu cluster_uri, username и password. Đó là những thứ mà máy ảo sẽ lấy ra khi khởi động và đưa vào cấu hình Grafana.

Nó phụ thuộc vào sự cân bằng.

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

Một ít đường

Chỉ còn lại một ít. Sau khi cơ sở hạ tầng được triển khai, bạn sẽ phải truy cập Giao diện người dùng Grafana và thêm cụm CH theo cách thủ công (vẫn cần lấy ID của cụm đó) làm Nguồn dữ liệu. Nhưng Terraform biết ID cụm. Hãy giao phó cho anh ấy việc đưa vấn đề thành hiện thực.

Hãy thêm một nhà cung cấp mới - Grafana và cung cấp cho cô ấy địa chỉ IP của người cân bằng làm máy chủ lưu trữ. Tất cả những thay đổi mà Terraform thực hiện trên máy mà bộ cân bằng của nó xác định sẽ phát triển trong MySQL và do đó trên tất cả các máy khác.

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

Hãy chải tóc của chúng ta

Hãy hiển thị địa chỉ IP cân bằng và máy chủ của cụm 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"
}

Bạn có thể chạy

Tất cả! Tệp cấu hình của chúng tôi đã sẵn sàng và bằng cách đặt các biến, chúng tôi có thể yêu cầu Terraform nâng cao mọi thứ mà chúng tôi đã mô tả ở trên. Toàn bộ quá trình làm tôi mất khoảng 15 phút.
Cuối cùng, bạn có thể thấy một thông điệp đẹp:

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

Và trên đám mây, các thành phần của cơ sở hạ tầng được nâng cao sẽ hiển thị:

Triển khai các dịch vụ phân tán trong Yandex.Cloud bằng Grafana làm ví dụ

Tổng hợp

Giờ đây, lấy Grafana làm ví dụ, mỗi người trong số các bạn có thể triển khai các ứng dụng có kiến ​​trúc đám mây trải rộng trên nền tảng Yandex.Cloud. Các công cụ hữu ích từ HashiCorp như Packer và Terraform có thể giúp bạn điều này. Tôi hy vọng ai đó thấy bài viết này hữu ích :)

Tái bút Bên dưới tôi sẽ đính kèm một liên kết đến kho lưu trữ nơi bạn có thể tìm thấy các công thức làm sẵn cho Packer và Terraform, những đoạn mà tôi đã cung cấp trong bài viết này.

kho

Nguồn: www.habr.com

Thêm một lời nhận xét