Ανάπτυξη κατανεμημένων υπηρεσιών στο Yandex.Cloud χρησιμοποιώντας το Grafana ως παράδειγμα

Γεια σε όλους! Ως μέρος της εργασίας μου στο μάθημα, ερεύνησα τις δυνατότητες μιας τέτοιας εγχώριας πλατφόρμας cloud όπως Yandex.Cloud. Η πλατφόρμα προσφέρει διάφορες υπηρεσίες για την επίλυση πρακτικών προβλημάτων. Ωστόσο, μερικές φορές χρειάζεται να ρυθμίσετε τη δική σας εφαρμογή cloud με μια αρκετά εκτεταμένη υποδομή που βασίζεται σε αυτές τις υπηρεσίες. Σε αυτό το άρθρο θέλω να μοιραστώ την εμπειρία μου από την ανάπτυξη μιας τέτοιας εφαρμογής.

Ανάπτυξη κατανεμημένων υπηρεσιών στο Yandex.Cloud χρησιμοποιώντας το Grafana ως παράδειγμα

Τι θέλετε να λάβετε;

Γκράφανα — ένα ισχυρό εργαλείο για την επίλυση αναλυτικών προβλημάτων ή προβλημάτων παρακολούθησης οποιωνδήποτε συστημάτων. Στη βασική του διαμόρφωση, πρόκειται για μια εικονική μηχανή με διακομιστή ιστού Grafana, καθώς και μια βάση δεδομένων (ClickHouse, InfluxDB κ.λπ.) με ένα σύνολο δεδομένων στο οποίο θα βασίζονται τα αναλυτικά στοιχεία.

Μετά την εκκίνηση μιας εικονικής μηχανής με έναν διακομιστή ιστού, μπορείτε να μεταβείτε στον κεντρικό υπολογιστή της και να αποκτήσετε μια όμορφη διεπαφή χρήστη, να καθορίσετε βάσεις δεδομένων ως πηγές για περαιτέρω εργασία, να δημιουργήσετε πίνακες εργαλείων και γραφήματα.

Ανάπτυξη κατανεμημένων υπηρεσιών στο Yandex.Cloud χρησιμοποιώντας το Grafana ως παράδειγμα

Η βασική έκδοση έχει ένα σημαντικό μειονέκτημα - δεν είναι καθόλου ανεκτική σε σφάλματα. Δηλαδή, ολόκληρη η λειτουργικότητα της εφαρμογής εξαρτάται από τη βιωσιμότητα μιας εικονικής μηχανής. Εάν αρνηθεί ή ανοίξουν 10 άτομα ταυτόχρονα, τότε θα προκύψουν προβλήματα.

Μπορούν να λυθούν απλά: χρειάζεται απλώς να... αναπτύξετε πολλές πανομοιότυπες εικονικές μηχανές με έναν διακομιστή web και να τις τοποθετήσετε κάτω από έναν εξισορροπητή L3. Αλλά δεν είναι όλα τόσο ξεκάθαρα εδώ. Η Grafana αποθηκεύει τις ρυθμίσεις χρήστη (διαδρομές προς βάσεις δεδομένων, πίνακες εργαλείων, γραφήματα κ.λπ.) απευθείας στον δίσκο της εικονικής μηχανής της. Έτσι, εάν αλλάξουμε κάποιες ρυθμίσεις στο UI, αυτές οι αλλαγές θα αντικατοπτρίζονται μόνο στην εικονική μηχανή όπου μας έστειλε ο εξισορροπητής. Αυτό θα οδηγήσει σε ασυνεπείς ρυθμίσεις για την εφαρμογή μας, προκαλώντας προβλήματα με την εκκίνηση και τη χρήση.

Εδώ μια άλλη βάση δεδομένων θα έρθει στη διάσωση, για παράδειγμα, η MySQL ή το αντίστοιχο. Λέμε στη Grafana ότι θα πρέπει να αποθηκεύσει τις ρυθμίσεις χρήστη σε αυτήν την «εφεδρική» βάση δεδομένων. Στη συνέχεια, θα αρκεί να καθορίσετε τη διαδρομή προς αυτήν τη βάση δεδομένων μία φορά σε κάθε μηχανή και να επεξεργαστείτε όλες τις άλλες ρυθμίσεις χρήστη σε οποιαδήποτε από τις εικονικές μηχανές· θα επεκταθούν και στις άλλες.

Ακολουθεί ένα διάγραμμα της τελικής υποδομής εφαρμογής:

Ανάπτυξη κατανεμημένων υπηρεσιών στο Yandex.Cloud χρησιμοποιώντας το Grafana ως παράδειγμα

Ας μάθουμε να σηκώνουμε με τα χέρια μας

MySQL και ClickHouse

Πριν από την ανάπτυξη μιας τέτοιας εφαρμογής με το πάτημα ενός κουμπιού, ήταν απαραίτητο να μάθουμε πώς να χειριζόμαστε κάθε στοιχείο της και να τα ενσωματώνουμε μεταξύ τους.

Εδώ θα μας βοηθήσει το Yandex.Cloud, το οποίο παρέχει L3 balancers, ClickHouse και MySQL ως διαχειριζόμενες υπηρεσίες. Ο χρήστης χρειάζεται μόνο να καθορίσει τις παραμέτρους και να περιμένει μέχρι η πλατφόρμα να φέρει τα πάντα σε κατάσταση λειτουργίας.

Έκανα εγγραφή, δημιούργησα ένα cloud και έναν λογαριασμό πληρωμών. Μετά από αυτό, πήγα στο cloud και έφτιαξα συμπλέγματα MySQL και ClickHouse με ελάχιστες ρυθμίσεις. Περίμενα μέχρι να ενεργοποιηθούν.

Ανάπτυξη κατανεμημένων υπηρεσιών στο Yandex.Cloud χρησιμοποιώντας το Grafana ως παράδειγμαΑνάπτυξη κατανεμημένων υπηρεσιών στο Yandex.Cloud χρησιμοποιώντας το Grafana ως παράδειγμα

Πρέπει επίσης να θυμάστε να δημιουργήσετε μια βάση δεδομένων σε κάθε σύμπλεγμα και να ρυθμίσετε την πρόσβαση σε αυτό χρησιμοποιώντας ένα login και έναν κωδικό πρόσβασης. Δεν θα μπω σε λεπτομέρειες εδώ - όλα είναι αρκετά προφανή στη διεπαφή.

Η μη προφανής λεπτομέρεια ήταν ότι αυτές οι βάσεις δεδομένων έχουν πολλούς κεντρικούς υπολογιστές, οι οποίοι εξασφαλίζουν την ανοχή τους σε σφάλματα. Ωστόσο, το 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

θα ξεκινήσουμε τον web server. Τώρα μπορείτε να εισαγάγετε την εξωτερική διεύθυνση 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 ως DataSource.

Κατάφερα να επιτύχω μια λειτουργική διαμόρφωση με τις ακόλουθες ρυθμίσεις:

Ανάπτυξη κατανεμημένων υπηρεσιών στο Yandex.Cloud χρησιμοποιώντας το Grafana ως παράδειγμα

Καθόρισα ως τη διεύθυνση URL https://c-<cluster_id>.rw.mdb.yandexcloud.net:8443

Ολα! Έχουμε μια εικονική μηχανή που λειτουργεί με διακομιστή web συνδεδεμένο σε CH και MySQL. Μπορείτε ήδη να ανεβάσετε το σύνολο δεδομένων στο ClickHouse και να δημιουργήσετε πίνακες εργαλείων. Ωστόσο, δεν έχουμε ακόμη πετύχει τον στόχο μας και δεν έχουμε αναπτύξει μια ολοκληρωμένη υποδομή.

Συσκευαστής

Το Yandex.Cloud σάς επιτρέπει να δημιουργήσετε μια εικόνα δίσκου μιας υπάρχουσας εικονικής μηχανής και στη βάση της - οποιονδήποτε αριθμό μηχανών πανομοιότυπων μεταξύ τους. Αυτό ακριβώς θα χρησιμοποιήσουμε. Για να συναρμολογήσετε εύκολα την εικόνα, πάρτε το εργαλείο Συσκευαστής από τη HashiCorp. Παίρνει ως είσοδο ένα αρχείο json με οδηγίες για τη συναρμολόγηση της εικόνας.

Το αρχείο μας json θα αποτελείται από δύο μπλοκ: builders και provisioners. Το πρώτο μπλοκ περιγράφει τις παραμέτρους της ίδιας της εικόνας ως οντότητα και το δεύτερο μπλοκ περιγράφει οδηγίες για τη συμπλήρωσή της με το απαραίτητο περιεχόμενο.

Οι οικοδόμοι

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

Σε αυτό το πρότυπο, πρέπει να ορίσετε το αναγνωριστικό της ενότητας στο cloud όπου θέλετε να δημιουργήσετε την εικόνα, καθώς και τη διαδρομή προς το αρχείο με τα κλειδιά από τον λογαριασμό υπηρεσίας που δημιουργήθηκε προηγουμένως σε αυτήν την ενότητα. Μπορείτε να διαβάσετε περισσότερα σχετικά με τη δημιουργία λογαριασμών υπηρεσιών και κλειδιών σε μορφή αρχείου στην αντίστοιχη ενότητα τεκμηρίωση.

Αυτή η διαμόρφωση λέει ότι η εικόνα του δίσκου θα δημιουργηθεί με βάση την πλατφόρμα 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 και θα επανεκκινήσει τον διακομιστή web.

setup.sh:

#!/bin/bash
CLUSTER_ID="<cluster_id>"
USERNAME="<username>"
PASSWORD="<password>"
sudo sed -i "s#.*;url =.*#url = mysql://${USERNAME}:${PASSWORD}@c-${CLUSTER_ID}.rw.mdb.yandexcloud.net#" /etc/grafana/grafana.ini
sudo sed -i "s#.*;admin_user =.*#admin_user = ${USERNAME}#" /etc/grafana/grafana.ini
sudo sed -i "s#.*;admin_password =.*#admin_password = ${PASSWORD}#" /etc/grafana/grafana.ini
sudo service grafana-server restart

Μετά από αυτό, απομένουν 3 πράγματα να κάνετε:
1) εγκατάσταση πακέτων
2) εκτελέστε το Grafana στο systemctl και εγκαταστήστε την προσθήκη ClickHouse
3) βάλτε το σενάριο setup.sh στην ουρά εκκίνησης αμέσως μετά την ενεργοποίηση της εικονικής μηχανής.

install-packages.sh:

#!/bin/bash
sudo systemd-run --property='After=apt-daily.service apt-daily-upgrade.service' --wait /bin/true
sudo apt-get install -y apt-transport-https
sudo apt-get install -y software-properties-common wget
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
sudo add-apt-repository "deb https://packages.grafana.com/enterprise/deb stable main"
sudo apt-get update
sudo apt-get install -y grafana-enterprise 

grafana-setup.sh:

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

run-setup-at-reboot.sh:

#!/bin/bash
chmod +x /opt/grafana/setup.sh
cat > /etc/cron.d/first-boot <<EOF
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
@reboot root /bin/bash /opt/grafana/setup.sh > /var/log/yc-setup.log 2>&1
EOF
chmod +x /etc/cron.d/first-boot;

Τώρα το μόνο που μένει είναι να εκτελέσετε το Packer και να τοποθετήσετε την εικόνα εξόδου στην καθορισμένη ενότητα. Κατά τη δημιουργία μιας εικονικής μηχανής, μπορείτε να την επιλέξετε ως δίσκο εκκίνησης και μετά την εκκίνηση θα λάβετε έναν έτοιμο διακομιστή ιστού Grafana.

Ανάπτυξη κατανεμημένων υπηρεσιών στο Yandex.Cloud χρησιμοποιώντας το Grafana ως παράδειγμα
Ανάπτυξη κατανεμημένων υπηρεσιών στο Yandex.Cloud χρησιμοποιώντας το Grafana ως παράδειγμα

Ομάδα περιπτώσεων και εξισορροπητής

Μόλις έχουμε μια εικόνα δίσκου που μας επιτρέπει να δημιουργήσουμε πολλούς πανομοιότυπους διακομιστές ιστού Grafana, μπορούμε να δημιουργήσουμε μια ομάδα παρουσίας. Στην πλατφόρμα Yandex.Cloud, αυτός ο όρος αναφέρεται στην ένωση εικονικών μηχανών που έχουν τα ίδια χαρακτηριστικά. Κατά τη δημιουργία μιας ομάδας παρουσίας, διαμορφώνεται το πρωτότυπο όλων των μηχανών αυτής της ομάδας και, στη συνέχεια, τα χαρακτηριστικά της ίδιας της ομάδας (για παράδειγμα, ο ελάχιστος και μέγιστος αριθμός ενεργών μηχανών). Εάν ο τρέχων αριθμός δεν πληροί αυτά τα κριτήρια, τότε η ίδια η ομάδα παρουσιών θα αφαιρέσει τα μη απαραίτητα μηχανήματα ή θα δημιουργήσει νέα στη δική της εικόνα.

Ως μέρος της εργασίας μας, θα δημιουργήσουμε μια ομάδα παρουσίας διακομιστών Ιστού που θα δημιουργηθούν από την εικόνα δίσκου που δημιουργήθηκε προηγουμένως.

Ανάπτυξη κατανεμημένων υπηρεσιών στο Yandex.Cloud χρησιμοποιώντας το Grafana ως παράδειγμα

Ανάπτυξη κατανεμημένων υπηρεσιών στο Yandex.Cloud χρησιμοποιώντας το Grafana ως παράδειγμα

Αυτό που είναι πραγματικά αξιοσημείωτο είναι η τελευταία εγκατάσταση ομάδας. Η ομάδα στόχος σε ενοποίηση με το Load Balancer θα σας βοηθήσει να διαμορφώσετε έναν εξισορροπητή L3 πάνω από τις εικονικές μηχανές αυτής της ομάδας κάνοντας κλικ σε μερικά κουμπιά.

Ανάπτυξη κατανεμημένων υπηρεσιών στο Yandex.Cloud χρησιμοποιώντας το Grafana ως παράδειγμα

Κατά τη ρύθμιση του εξισορροπητή, εφάρμοσα δύο σημαντικά σημεία:

  1. Έκανα τον εξισορροπητή να δέχεται την κίνηση των χρηστών στη θύρα 80 και να τον ανακατευθύνει στη θύρα 3000 των εικονικών μηχανών, ακριβώς εκεί που μένει η Grafana.
  2. Ρύθμισα τον έλεγχο της βιωσιμότητας των μηχανημάτων κάνοντας ping στη θύρα 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 — Αναγνωριστικό cloud όπου θα αναπτύξουμε την εφαρμογή
folder_id — αναγνωριστικό ενότητας όπου θα αναπτύξουμε την εφαρμογή
service_account_id — αναγνωριστικό λογαριασμού υπηρεσίας στην αντίστοιχη ενότητα του cloud.
image_id — αναγνωριστικό του ειδώλου του δίσκου που ελήφθη με τη χρήση του Packer
όνομα χρήστη и κωδικό πρόσβασης — όνομα χρήστη και κωδικός πρόσβασης για πρόσβαση τόσο στις βάσεις δεδομένων όσο και στον διακομιστή ιστού Grafana
dbname — όνομα βάσης δεδομένων μέσα σε συμπλέγματα CH και MySQL
Διαδρομή_δημόσιου_κλειδιού — διαδρομή προς το αρχείο με το δημόσιο κλειδί ssh, το οποίο μπορείτε να χρησιμοποιήσετε για να συνδεθείτε κάτω από το όνομα ubuntu σε εικονικές μηχανές με διακομιστές ιστού

Ρύθμιση παρόχου

Τώρα πρέπει να διαμορφώσετε τον πάροχο Terraform - στην περίπτωσή μας, Yandex:

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

Θα παρατηρήσετε ότι εδώ χρησιμοποιούμε τις μεταβλητές που ορίζονται παραπάνω.

Δίκτυο και συμπλέγματα

Τώρα θα δημιουργήσουμε ένα δίκτυο στο οποίο θα επικοινωνούν στοιχεία της υποδομής μας, τρία υποδίκτυα (ένα σε κάθε περιοχή) και θα ανεβάζουν συμπλέγματα CH και MySQL.


resource "yandex_vpc_network" "grafana_network" {}

resource "yandex_vpc_subnet" "subnet_a" {
  zone           = "ru-central1-a"
  network_id     = yandex_vpc_network.grafana_network.id
  v4_cidr_blocks = ["10.1.0.0/24"]
}

resource "yandex_vpc_subnet" "subnet_b" {
  zone           = "ru-central1-b"
  network_id     = yandex_vpc_network.grafana_network.id
  v4_cidr_blocks = ["10.2.0.0/24"]
}

resource "yandex_vpc_subnet" "subnet_c" {
  zone           = "ru-central1-c"
  network_id     = yandex_vpc_network.grafana_network.id
  v4_cidr_blocks = ["10.3.0.0/24"]
}

resource "yandex_mdb_clickhouse_cluster" "ch_cluster" {
  name        = "grafana-clickhouse"
  environment = "PRODUCTION"
  network_id  = yandex_vpc_network.grafana_network.id

  clickhouse {
    resources {
      resource_preset_id = "s2.micro"
      disk_type_id       = "network-ssd"
      disk_size          = 16
    }
  }

  zookeeper {
    resources {
      resource_preset_id = "s2.micro"
      disk_type_id       = "network-ssd"
      disk_size          = 10
    }
  }

  database {
    name = var.dbname
  }

  user {
    name     = var.username
    password = var.password
    permission {
      database_name = var.dbname
    }
  }

  host {
    type      = "CLICKHOUSE"
    zone      = "ru-central1-a"
    subnet_id = yandex_vpc_subnet.subnet_a.id
  }

  host {
    type      = "CLICKHOUSE"
    zone      = "ru-central1-b"
    subnet_id = yandex_vpc_subnet.subnet_b.id
  }

  host {
    type      = "CLICKHOUSE"
    zone      = "ru-central1-c"
    subnet_id = yandex_vpc_subnet.subnet_c.id
  }

  host {
    type      = "ZOOKEEPER"
    zone      = "ru-central1-a"
    subnet_id = yandex_vpc_subnet.subnet_a.id
  }

  host {
    type      = "ZOOKEEPER"
    zone      = "ru-central1-b"
    subnet_id = yandex_vpc_subnet.subnet_b.id
  }

  host {
    type      = "ZOOKEEPER"
    zone      = "ru-central1-c"
    subnet_id = yandex_vpc_subnet.subnet_c.id
  }
}

resource "yandex_mdb_mysql_cluster" "mysql_cluster" {
  name        = "grafana_mysql"
  environment = "PRODUCTION"
  network_id  = yandex_vpc_network.grafana_network.id
  version     = "8.0"

  resources {
    resource_preset_id = "s2.micro"
    disk_type_id       = "network-ssd"
    disk_size          = 16
  }

  database {
    name = var.dbname
  }

  user {
    name     = var.username
    password = var.password
    permission {
      database_name = var.dbname
      roles         = ["ALL"]
    }
  }

  host {
    zone      = "ru-central1-a"
    subnet_id = yandex_vpc_subnet.subnet_a.id
  }
  host {
    zone      = "ru-central1-b"
    subnet_id = yandex_vpc_subnet.subnet_b.id
  }
  host {
    zone      = "ru-central1-c"
    subnet_id = yandex_vpc_subnet.subnet_c.id
  }
}

Όπως μπορείτε να δείτε, κάθε ένα από τα δύο συμπλέγματα δημιουργείται αρκετά ανεκτικό σε σφάλματα, καθώς βρίσκεται σε τρεις ζώνες διαθεσιμότητας.

Διακομιστές Ιστού

Φαινόταν ότι μπορούσαμε να συνεχίσουμε με το ίδιο πνεύμα, αλλά δυσκολεύτηκα. Πριν από αυτό, ανέβασα πρώτα ένα σύμπλεγμα MySQL και μόνο μετά από αυτό, γνωρίζοντας το αναγνωριστικό του, συνέλεξα μια εικόνα δίσκου με την απαιτούμενη διαμόρφωση, όπου καθόρισα τον κεντρικό υπολογιστή στο σύμπλεγμα. Αλλά τώρα δεν γνωρίζουμε το αναγνωριστικό συμπλέγματος πριν από την κυκλοφορία του Terraform, συμπεριλαμβανομένης της στιγμής δημιουργίας της εικόνας. Ως εκ τούτου, έπρεπε να καταφύγω στα εξής τέχνασμα.

Χρησιμοποιώντας την υπηρεσία μεταδεδομένων της Amazon, θα περάσουμε κάποιες παραμέτρους στην εικονική μηχανή, τις οποίες θα αποδεχτεί και θα επεξεργαστεί. Χρειαζόμαστε το μηχάνημα να μεταβεί στα μεταδεδομένα πίσω από τον κεντρικό υπολογιστή του συμπλέγματος MySQL και το όνομα χρήστη-κωδικό πρόσβασης, τα οποία ο χρήστης καθόρισε στο αρχείο Terraform, μετά την εκκίνηση. Ας αλλάξουμε ελαφρώς τα περιεχόμενα του αρχείου setup.sh, το οποίο εκτελείται όταν η εικονική μηχανή είναι ενεργοποιημένη.

setup.sh:

#!/bin/bash
CLUSTER_URI="$(curl -H 'Metadata-Flavor:Google' http://169.254.169.254/computeMetadata/v1/instance/attributes/mysql_cluster_uri)"
USERNAME="$(curl -H 'Metadata-Flavor:Google' http://169.254.169.254/computeMetadata/v1/instance/attributes/username)"
PASSWORD="$(curl -H 'Metadata-Flavor:Google' http://169.254.169.254/computeMetadata/v1/instance/attributes/password)"
sudo sed -i "s#.*;url =.*#url = mysql://${USERNAME}:${PASSWORD}@${CLUSTER_URI}#" /etc/grafana/grafana.ini
sudo sed -i "s#.*;admin_user =.*#admin_user = ${USERNAME}#" /etc/grafana/grafana.ini
sudo sed -i "s#.*;admin_password =.*#admin_password = ${PASSWORD}#" /etc/grafana/grafana.ini
sudo service grafana-server restart

Ομάδα παρουσίας και εξισορροπητής

Έχοντας δημιουργήσει ξανά μια νέα εικόνα δίσκου, μπορούμε επιτέλους να προσθέσουμε το αρχείο μας για το Terraform.

Ας υποδείξουμε ότι θέλουμε να χρησιμοποιήσουμε μια υπάρχουσα εικόνα δίσκου:

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

Τώρα ας δημιουργήσουμε μια ομάδα παρουσίας:

resource "yandex_compute_instance_group" "grafana_group" {
  name               = "grafana-group"
  folder_id          = var.folder_id
  service_account_id = var.service_account_id
  instance_template {
    platform_id = "standard-v1"
    resources {
      memory = 1
      cores  = 1
    }
    boot_disk {
      mode = "READ_WRITE"
      initialize_params {
        image_id = data.yandex_compute_image.grafana_image.id
        size     = 4
      }
    }
    network_interface {
      network_id = yandex_vpc_network.grafana_network.id
      subnet_ids = [yandex_vpc_subnet.subnet_a.id, yandex_vpc_subnet.subnet_b.id, yandex_vpc_subnet.subnet_c.id]
      nat = "true"
    }
    metadata = {
      mysql_cluster_uri = "c-${yandex_mdb_mysql_cluster.mysql_cluster.id}.rw.mdb.yandexcloud.net:3306/${var.dbname}"
      username = var.username
      password = var.password
      ssh-keys = "ubuntu:${file("${var.public_key_path}")}"
    }
    network_settings {
      type = "STANDARD"
    }
  }

  scale_policy {
    fixed_scale {
      size = 6
    }
  }

  allocation_policy {
    zones = ["ru-central1-a", "ru-central1-b", "ru-central1-c"]
  }

  deploy_policy {
    max_unavailable = 2
    max_creating    = 2
    max_expansion   = 2
    max_deleting    = 2
  }

  load_balancer {
    target_group_name = "grafana-target-group"
  }
}

Αξίζει να προσέξουμε πώς το μεταβιβάσαμε στα μεταδεδομένα cluster_uri, username и password. Αυτά θα αφαιρέσει η εικονική μηχανή κατά την εκκίνηση και θα τα βάλει στη διαμόρφωση Grafana.

Είναι στο χέρι του εξισορροπητή.

resource "yandex_lb_network_load_balancer" "grafana_balancer" {
  name = "grafana-balancer"

  listener {
    name = "grafana-listener"
    port = 80
    target_port = 3000
    external_address_spec {
      ip_version = "ipv4"
    }
  }

  attached_target_group {
    target_group_id = yandex_compute_instance_group.grafana_group.load_balancer.0.target_group_id

    healthcheck {
      name = "healthcheck"
      tcp_options {
        port = 3000
      }
    }
  }
}

Λίγη ζάχαρη

Απομένει μόνο λίγο. Μετά την ανάπτυξη της υποδομής, θα πρέπει να μεταβείτε στη διεπαφή χρήστη Grafana και να προσθέσετε μη αυτόματα το σύμπλεγμα CH (το αναγνωριστικό του οποίου πρέπει ακόμα να αποκτηθεί) ως πηγή δεδομένων. Αλλά η Terraform γνωρίζει το αναγνωριστικό συμπλέγματος. Ας του αναθέσουμε να φέρει εις πέρας το θέμα.

Ας προσθέσουμε έναν νέο πάροχο - τη Grafana, και ας της δώσουμε τη διεύθυνση IP του εξισορροπητή ως κεντρικό υπολογιστή. Όλες οι αλλαγές που κάνει η Terraform στο μηχάνημα όπου καθορίζει ο εξισορροπητής του θα αυξηθούν στη MySQL και επομένως σε όλα τα άλλα μηχανήματα.

provider "grafana" {
  url  = "http://${[for s in yandex_lb_network_load_balancer.grafana_balancer.listener: s.external_address_spec.0.address].0}"
  auth = "${var.username}:${var.password}"
}

resource "grafana_data_source" "ch_data_source" {
  type          = "vertamedia-clickhouse-datasource"
  name          = "grafana"
  url           = "https://c-${yandex_mdb_clickhouse_cluster.ch_cluster.id}.rw.mdb.yandexcloud.net:8443"
  basic_auth_enabled = "true"
  basic_auth_username = var.username
  basic_auth_password = var.password
  is_default = "true"
  access_mode = "proxy"
}

Ας χτενίσουμε τα μαλλιά μας

Ας εμφανίσουμε τη διεύθυνση IP του εξισορροπητή και τον κεντρικό υπολογιστή του συμπλέγματος ClickHouse

output "grafana_balancer_ip_address" {
  value = [for s in yandex_lb_network_load_balancer.grafana_balancer.listener: s.external_address_spec.0.address].0
}

output "clickhouse_cluster_host" {
  value = "https://c-${yandex_mdb_clickhouse_cluster.ch_cluster.id}.rw.mdb.yandexcloud.net:8443"
}

Μπορώ να τρέξω

Ολα! Το αρχείο διαμόρφωσής μας είναι έτοιμο και μπορούμε, ορίζοντας τις μεταβλητές, να πούμε στην Terraform να αυξήσει όλα όσα περιγράψαμε παραπάνω. Η όλη διαδικασία μου πήρε περίπου 15 λεπτά.
Στο τέλος μπορείτε να δείτε ένα όμορφο μήνυμα:

Apply complete! Resources: 9 added, 0 changed, 0 destroyed.
Outputs:

clickhouse_cluster_host = https://c-c9q14ipa2ngadqsbp2iq.rw.mdb.yandexcloud.net:8443
grafana_balancer_ip_address = 130.193.50.25

Και στο cloud, στοιχεία της ανυψωμένης υποδομής θα είναι ορατά:

Ανάπτυξη κατανεμημένων υπηρεσιών στο Yandex.Cloud χρησιμοποιώντας το Grafana ως παράδειγμα

Συνοψίζοντας

Τώρα, χρησιμοποιώντας το Grafana ως παράδειγμα, ο καθένας από εσάς μπορεί να αναπτύξει εφαρμογές με μια εκτεταμένη αρχιτεκτονική cloud στην πλατφόρμα Yandex.Cloud. Χρήσιμα εργαλεία από τη HashiCorp όπως το Packer και το Terraform μπορούν να σας βοηθήσουν σε αυτό. Ελπίζω κάποιος να βρει αυτό το άρθρο χρήσιμο :)

Υ.Γ Παρακάτω θα επισυνάψω έναν σύνδεσμο προς το αποθετήριο όπου μπορείτε να βρείτε έτοιμες συνταγές για το Packer και το Terraform, κομμάτια των οποίων παρείχα σε αυτό το άρθρο.

αποθήκη

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο