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ư
Bạn muốn nhận được gì?
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 đồ.
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:
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.
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 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.
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.
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:
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ụ
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
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.
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 đó.
Đ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.
Khi thiết lập bộ cân bằng, tôi đã thực hiện hai điểm quan trọng:
- 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.
- 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.
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à
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
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
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ị:
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.
Nguồn: www.habr.com