Grafana örneğini kullanarak dağıtılmış hizmetlerin Yandex.Cloud'da dağıtımı

Herkese selam! Ders çalışmam kapsamında yerli bir bulut platformunun yeteneklerini araştırdım. Yandex.Bulut. Platform pratik sorunların çözümü için çeşitli hizmetler sunmaktadır. Ancak bazen bu hizmetleri baz alarak oldukça geniş bir altyapıya sahip kendi bulut uygulamanızı kurmanız gerekebilir. Bu makalede böyle bir uygulamayı dağıtma deneyimimi paylaşmak istiyorum.

Grafana örneğini kullanarak dağıtılmış hizmetlerin Yandex.Cloud'da dağıtımı

Ne almak istiyorsun?

grafana — Analitik sorunları çözmek veya herhangi bir sistemdeki sorunları izlemek için güçlü bir araç. Temel konfigürasyonunda bu, Grafana web sunucusuna sahip bir sanal makinenin yanı sıra analitiğin dayanacağı veri kümesine sahip bir veritabanıdır (ClickHouse, InfluxDB, vb.).

Bir web sunucusuyla sanal makineyi başlattıktan sonra, ana bilgisayarına gidebilir ve güzel bir kullanıcı arayüzü alabilir, daha fazla çalışma için veritabanlarını kaynak olarak belirleyebilir, kontrol panelleri ve grafikler oluşturabilirsiniz.

Grafana örneğini kullanarak dağıtılmış hizmetlerin Yandex.Cloud'da dağıtımı

Temel versiyonun önemli bir dezavantajı var; hataya hiç dayanıklı değil. Yani uygulamanın tüm işlevselliği tek bir sanal makinenin yaşayabilirliğine bağlıdır. Reddederse veya kullanıcı arayüzünü aynı anda 10 kişi açarsa sorunlar ortaya çıkacaktır.

Bunlar basit bir şekilde çözülebilir: sadece birçok özdeş sanal makineyi bir web sunucusuyla dağıtmanız ve bunları bir L3 dengeleyicinin altına yerleştirmeniz yeterlidir. Ancak burada her şey o kadar net değil. Grafana, kullanıcı ayarlarını (veritabanlarına giden yollar, kontrol panelleri, grafikler vb.) doğrudan sanal makinesinin diskinde saklar. Dolayısıyla kullanıcı arayüzünde bazı ayarları değiştirdiğimizde bu değişiklikler yalnızca dengeleyicinin bize gönderdiği sanal makineye yansıyacaktır. Bu, uygulamamız için tutarsız ayarlara yol açarak başlatma ve kullanımda sorunlara yol açacaktır.

Burada başka bir veritabanı kurtarmaya gelecek, örneğin MySQL veya eşdeğeri. Grafana'ya kullanıcı ayarlarını bu "yedek" veritabanında saklaması gerektiğini söylüyoruz. Daha sonra her makinede bir kez bu veritabanına giden yolu belirtmeniz ve herhangi bir sanal makinedeki diğer tüm kullanıcı ayarlarını düzenlemeniz yeterli olacaktır; diğerlerine de yayılacaktır.

İşte nihai uygulama altyapısının bir diyagramı:

Grafana örneğini kullanarak dağıtılmış hizmetlerin Yandex.Cloud'da dağıtımı

Ellerimizle kaldırmayı öğrenelim

MySQL ve ClickHouse

Böyle bir uygulamayı tek tuşla devreye almadan önce, her bir bileşeninin nasıl yönetileceğini ve birbirleriyle nasıl entegre edileceğini öğrenmek gerekiyordu.

Burada L3 dengeleyicileri, ClickHouse ve MySQL'i yönetilen hizmetler olarak sağlayan Yandex.Cloud bize yardımcı olacaktır. Kullanıcının yalnızca parametreleri belirtmesi ve platform her şeyi çalışır duruma getirene kadar beklemesi gerekir.

Kayıt oldum, bir bulut ve ödeme hesabı oluşturdum. Sonrasında buluta geçerek MySQL ve ClickHouse kümelerini minimal ayarlarla kurdum. Aktif hale gelene kadar bekledim.

Grafana örneğini kullanarak dağıtılmış hizmetlerin Yandex.Cloud'da dağıtımıGrafana örneğini kullanarak dağıtılmış hizmetlerin Yandex.Cloud'da dağıtımı

Ayrıca her kümede bir veritabanı oluşturmayı ve bir kullanıcı adı ve parola kullanarak bu veritabanına erişimi yapılandırmayı da hatırlamanız gerekir. Burada ayrıntılara girmeyeceğim - arayüzde her şey oldukça açık.

Açıkça görülmeyen ayrıntı, bu veritabanlarının hata toleransını sağlayan çok sayıda ana bilgisayara sahip olmasıydı. Ancak Grafana, birlikte çalıştığı her veritabanı için tam olarak bir ana bilgisayar gerektirir. Uzun okuma belgeleme Bulutlar beni bir karara götürdü. Görünüşe göre türün ev sahibi c-<cluster_id>.rw.mdb.yandexcloud.net karşılık gelen kimlikle kümenin geçerli etkin ana ana bilgisayarına eşlenir. Grafana'ya bunu vereceğiz.

Web sunucusu

Artık iş web sunucusuna kalmış. Linux ile normal bir sanal makine oluşturalım ve Grafana'yı manuel olarak yapılandıralım.

Grafana örneğini kullanarak dağıtılmış hizmetlerin Yandex.Cloud'da dağıtımı

Grafana örneğini kullanarak dağıtılmış hizmetlerin Yandex.Cloud'da dağıtımı

Ssh üzerinden bağlanıp gerekli paketleri kuralım.

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 

Bundan sonra, Grafana'yı systemctl altında çalıştıralım ve ClickHouse ile çalışmak için eklentiyi yükleyelim (evet, temel pakette bulunmuyor).

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

İşte bu kadar, bundan sonra basit bir komutla

sudo service grafana-server start

web sunucusunu başlatacağız. Artık sanal makinenin harici IP adresini tarayıcıya girebilir, bağlantı noktası 3000'i belirleyebilir ve güzel Grafana kullanıcı arayüzünü görebilirsiniz.
Grafana örneğini kullanarak dağıtılmış hizmetlerin Yandex.Cloud'da dağıtımı

Ancak acele etmeyin, Grafana'yı kurmadan önce, ayarları orada saklamak için ona MySQL'in yolunu söylemeyi unutmamalısınız.

Grafana web sunucusunun tüm konfigürasyonu dosyadadır /etc/grafana/grafana.ini. Gerekli satır şöyle görünür:

;url =

Host'u MySQL kümesine ayarladık. Aynı dosya, yukarıdaki resimde Grafana'ya erişim için gerekli kullanıcı adını ve şifreyi içerir; varsayılan olarak her ikisi de eşittir admin.

Sed komutlarını kullanabilirsiniz:

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

Web sunucusunu yeniden başlatmanın zamanı geldi!

sudo service grafana-server restart

Şimdi Grafana kullanıcı arayüzünde ClickHouse'u DataSource olarak belirleyeceğiz.

Aşağıdaki ayarlarla çalışan bir konfigürasyon elde edebildim:

Grafana örneğini kullanarak dağıtılmış hizmetlerin Yandex.Cloud'da dağıtımı

URL olarak belirttim https://c-<cluster_id>.rw.mdb.yandexcloud.net:8443

Tüm! CH ve MySQL'e bağlı bir web sunucusuna sahip çalışan bir sanal makinemiz var. Veri kümesini zaten ClickHouse'a yükleyebilir ve kontrol panelleri oluşturabilirsiniz. Ancak henüz hedefimize ulaşamadık ve tam teşekküllü bir altyapıyı devreye alamadık.

Paketleme

Yandex.Cloud, mevcut bir sanal makinenin ve buna dayalı olarak birbiriyle aynı sayıda makinenin disk görüntüsünü oluşturmanıza olanak tanır. Bu tam olarak kullanacağımız şey. Görüntüyü rahatça birleştirmek için aracı alın Paketleme HashiCorp'tan. Görüntüyü birleştirme talimatlarını içeren bir json dosyasını girdi olarak alır.

Json dosyamız iki bloktan oluşacaktır: builders ve provizyonerlar. İlk blok, görüntünün kendisinin parametrelerini bir varlık olarak tanımlar ve ikinci blok, onu gerekli içerikle doldurma talimatlarını açıklar.

İnşaatçılar

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

Bu şablonda, görüntüyü oluşturmak istediğiniz buluttaki bölümün tanımlayıcısını ve bu bölümde daha önce oluşturulan hizmet hesabındaki anahtarlarla dosyanın yolunu ayarlamanız gerekir. İlgili bölümde hizmet hesapları ve anahtarları dosya biçiminde oluşturma hakkında daha fazla bilgi edinebilirsiniz. belgeleme.

Bu yapılandırma, disk görüntüsünün platforma göre oluşturulacağını söylüyor ubuntu-1804-lts, resim ailesindeki uygun kullanıcı bölümüne yerleştirilir GRAFANA adı altında grafana-{{timestamp}}.

Hazırlayıcılar

Şimdi konfigürasyonun daha ilginç kısmı geliyor. Durumu bir disk görüntüsüne dondurmadan önce sanal makinenin üzerinde gerçekleştirilmesi gereken eylemlerin sırasını açıklayacaktır.

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

Burada tüm eylemler 3 aşamaya ayrılmıştır. İlk aşamada, yardımcı bir dizin oluşturan basit bir komut dosyası yürütülür.

hazır-ctg.sh:

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

Bir sonraki aşamada, bu dizine sanal makineyi başlattıktan hemen sonra başlatılması gereken bir komut dosyası yerleştiriyoruz. Bu komut dosyası, Grafana yapılandırmasına kaydedilmesi gereken kullanıcı değişkenlerini yerleştirecek ve web sunucusunu yeniden başlatacaktır.

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

Bundan sonra yapılacak 3 şey kalıyor:
1) paketleri yükleyin
2) Grafana'yı systemctl altında çalıştırın ve ClickHouse eklentisini yükleyin
3) sanal makineyi açtıktan hemen sonra setup.sh betiğini başlatma kuyruğuna koyun.

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;

Artık geriye kalan tek şey Packer'ı çalıştırmak ve çıktı görüntüsünü belirtilen bölüme yerleştirmektir. Bir sanal makine oluştururken, onu önyükleme diski olarak seçebilirsiniz ve başlattıktan sonra hazır bir Grafana web sunucusu alacaksınız.

Grafana örneğini kullanarak dağıtılmış hizmetlerin Yandex.Cloud'da dağıtımı
Grafana örneğini kullanarak dağıtılmış hizmetlerin Yandex.Cloud'da dağıtımı

Örnek grubu ve dengeleyici

Birçok özdeş Grafana web sunucusu oluşturmamıza olanak tanıyan bir disk imajına sahip olduğumuzda, bir örnek grubu oluşturabiliriz. Yandex.Cloud platformunda bu terim aynı özelliklere sahip sanal makinelerin birleşimini ifade eder. Bir örnek grubu oluştururken, bu gruptaki tüm makinelerin prototipi yapılandırılır ve ardından grubun kendi özellikleri (örneğin, minimum ve maksimum etkin makine sayısı) yapılandırılır. Mevcut sayı bu kriterleri karşılamıyorsa örnek grubunun kendisi gereksiz makineleri kaldıracak veya kendi görüntüsünde yenilerini oluşturacaktır.

Görevimizin bir parçası olarak, önceden oluşturulan disk görüntüsünden oluşturulacak web sunucularından oluşan bir örnek grup oluşturacağız.

Grafana örneğini kullanarak dağıtılmış hizmetlerin Yandex.Cloud'da dağıtımı

Grafana örneğini kullanarak dağıtılmış hizmetlerin Yandex.Cloud'da dağıtımı

Gerçekten dikkat çekici olan, son örnek grubu kurulumudur. Load Balancer ile entegre olan hedef grup, birkaç butona tıklayarak bu gruptaki sanal makinelerin üzerinde bir L3 dengeleyici yapılandırmanıza yardımcı olacaktır.

Grafana örneğini kullanarak dağıtılmış hizmetlerin Yandex.Cloud'da dağıtımı

Dengeleyiciyi kurarken iki önemli noktayı uyguladım:

  1. Dengeleyicinin 80 numaralı bağlantı noktasındaki kullanıcı trafiğini kabul etmesini ve bunu sanal makinelerin tam olarak Grafana'nın yaşadığı 3000 numaralı bağlantı noktasına yönlendirmesini sağladım.
  2. Makinelerin kullanılabilirliğini kontrol etmek için onları 3000 numaralı bağlantı noktasına ping atarak ayarladım.

Grafana örneğini kullanarak dağıtılmış hizmetlerin Yandex.Cloud'da dağıtımı

Mini özet

Sonunda istenen uygulama altyapısını manuel olarak dağıtmayı başardık ve artık oldukça dayanıklı bir Grafana hizmetimiz var. Veri kümesini yüklemek için uygulamaya ve ClickHouse kümesinin ana bilgisayarına giriş noktası olarak dengeleyicinin IP adresini bilmeniz yeterlidir.

Bir zafer gibi mi görünüyor? Evet zafer. Ama bir şey hala kafamı karıştırıyor. Yukarıdaki sürecin tamamı çok sayıda manuel adım gerektirir ve hiçbir şekilde ölçeklenebilir değildir; mümkünse bunu otomatikleştirmek istiyorum. Bir sonraki bölüm buna ayrılacak.

Terraform entegrasyonu

Yine HashiCorp'un adlı aracını kullanacağız. Terraform. Kullanıcı tarafından iletilen çeşitli değişkenlere bağlı olarak, tek bir düğmeyi tıklatarak tüm uygulama altyapısını dağıtmanıza yardımcı olacaktır. Farklı kullanıcıların farklı bölümlerinde birden çok kez çalıştırılabilecek bir tarif yazalım.

Terraform ile yapılan tüm çalışmalar bir yapılandırma dosyası yazmaya (*.tf) ve buna dayalı altyapının oluşturulması.

Değişkenler

Dosyanın en başında gelecekteki altyapının nerede ve nasıl konuşlandırılacağını belirleyen değişkenlere yer vereceğiz.

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

Uygulama dağıtım sürecinin tamamı bir disk görüntüsü oluşturmaya ve bu değişkenleri ayarlamaya indirgenecektir. Nelerden sorumlu olduklarını açıklayayım:

oauth_token — buluta erişim için bir belirteç. Tarafından elde edilebilir bağlantı.
cloud_id — uygulamayı dağıtacağımız bulut tanımlayıcı
klasör_kimliği — uygulamayı dağıtacağımız bölüm tanımlayıcısı
service_account_id — bulutun ilgili bölümündeki hizmet hesabı tanımlayıcısı.
resim_kimliği - Packer kullanılarak elde edilen disk görüntüsünün tanımlayıcısı
kullanıcı adı и şifre — hem veritabanlarına hem de Grafana web sunucusuna erişim için kullanıcı adı ve şifre
veritabanı adı — CH ve MySQL kümelerinin içindeki veritabanı adı
genel_anahtar_yolu — adı altında bağlanmak için kullanabileceğiniz genel ssh anahtarınızın bulunduğu dosyanın yolu ubuntu web sunucuları olan sanal makinelere

Sağlayıcı kurulumu

Artık Terraform sağlayıcısını yapılandırmanız gerekiyor - bizim durumumuzda Yandex:

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

Burada yukarıda tanımlanan değişkenleri kullandığımızı fark edeceksiniz.

Ağ ve kümeler

Şimdi altyapımızın unsurlarının iletişim kuracağı, üç alt ağın (her bölgede bir tane) ve CH ve MySQL kümelerini yükselteceği bir ağ oluşturacağız.


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

Gördüğünüz gibi iki kümenin her biri üç kullanılabilirlik bölgesinde konumlandırılarak hataya oldukça dayanıklı oluşturulmuştur.

Web sunucuları

Görünüşe göre aynı ruhla devam edebilirdik ama zorluklarla karşılaştım. Bundan önce, ilk önce bir MySQL kümesi oluşturdum ve ancak bundan sonra kimliğini bilerek, kümenin ana bilgisayarını belirttiğim gerekli yapılandırmaya sahip bir disk görüntüsü topladım. Ancak artık Terraform'u başlatmadan önce, görüntünün oluşturulduğu an da dahil olmak üzere küme kimliğini bilmiyoruz. Bu nedenle aşağıdaki yöntemlere başvurmak zorunda kaldım kandırmak.

Amazon'un meta veri hizmetini kullanarak sanal makineye kabul edeceği ve işleyeceği bazı parametreleri aktaracağız. Makinenin başladıktan sonra Terraform dosyasında kullanıcının belirttiği MySQL kümesi ana bilgisayarının arkasındaki meta verilere ve kullanıcı adı-şifreye gitmesine ihtiyacımız var. Dosyanın içeriğini biraz değiştirelim setup.sh, sanal makine açıldığında çalışır.

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

Örnek grubu ve dengeleyici

Yeni bir disk imajını yeniden oluşturduktan sonra nihayet Terraform dosyamızı ekleyebiliriz.

Mevcut bir disk imajını kullanmak istediğimizi belirtelim:

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

Şimdi bir örnek grubu oluşturalım:

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

Bunu meta verilere nasıl aktardığımıza dikkat etmeye değer cluster_uri, username и password. Sanal makinenin başlangıçta çıkaracağı ve Grafana yapılandırmasına koyacağı şeyler bunlardır.

Dengeleyiciye kalmış.

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

Biraz şeker

Sadece biraz kaldı. Altyapı dağıtıldıktan sonra Grafana kullanıcı arayüzüne gitmeniz ve CH kümesini (kimliğinin hala alınması gereken) Veri Kaynağı olarak manuel olarak eklemeniz gerekecektir. Ancak Terraform küme kimliğini biliyor. Bu meseleyi sonuçlandırma görevini ona emanet edelim.

Yeni bir sağlayıcı ekleyelim - Grafana ve ona ana bilgisayar olarak dengeleyicinin IP adresini verelim. Terraform'un dengeleyicisinin belirlediği makinede yaptığı tüm değişiklikler MySQL'de ve dolayısıyla diğer tüm makinelerde büyüyecektir.

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

Hadi saçlarımızı tarayalım

Dengeleyici IP adresini ve ClickHouse kümesinin ana bilgisayarını görüntüleyelim

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

Koşabilir

Tüm! Yapılandırma dosyamız hazır ve değişkenleri ayarlayarak Terraform'a yukarıda tanımladığımız her şeyi yükseltmesini söyleyebiliriz. Tüm süreç yaklaşık 15 dakikamı aldı.
Sonunda güzel bir mesaj görebilirsiniz:

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

Bulutta ise yükseltilmiş altyapının unsurları görünür olacak:

Grafana örneğini kullanarak dağıtılmış hizmetlerin Yandex.Cloud'da dağıtımı

Toparlamak

Artık Grafana'yı örnek alırsak, her biriniz Yandex.Cloud platformunda genişleyen bulut mimarisine sahip uygulamaları dağıtabilirsiniz. HashiCorp'un Packer ve Terraform gibi faydalı araçları bu konuda size yardımcı olabilir. Umarım birileri bu makaleyi faydalı bulur :)

PS Aşağıda, bu makalede parçalarını verdiğim Packer ve Terraform için hazır tarifler bulabileceğiniz deponun bağlantısını ekleyeceğim.

depo

Kaynak: habr.com

Yorum ekle