Γεια σε όλους! Το όνομά μου είναι Kirill, είμαι CTO στο Adapty. Το μεγαλύτερο μέρος της αρχιτεκτονικής μας είναι σε AWS και σήμερα θα μιλήσω για το πώς μειώσαμε το κόστος του διακομιστή κατά 3 φορές χρησιμοποιώντας spot στιγμιότυπα σε περιβάλλον παραγωγής, καθώς και για το πώς να ρυθμίσουμε την αυτόματη κλιμάκωση τους. Πρώτα θα υπάρχει μια επισκόπηση του τρόπου λειτουργίας του και, στη συνέχεια, λεπτομερείς οδηγίες για να ξεκινήσετε.
Τι είναι οι Spot Instances;
Παρακάτω είναι μερικά στιγμιότυπα οθόνης που δείχνουν το ιστορικό τιμών για σποτ.
m5.μεγάλο στην περιοχή eu-west-1 (Ιρλανδία). Η τιμή είναι ως επί το πλείστον σταθερή για 3 μήνες, προς το παρόν εξοικονομεί 2.9x.
m5.μεγάλο στην περιοχή ΗΠΑ-ανατολικά-1 (Β. Βιρτζίνια). Η τιμή αλλάζει συνεχώς μέσα σε 3 μήνες, προς το παρόν εξοικονομεί από 2.3x σε 2.8x ανάλογα με τη ζώνη διαθεσιμότητας.
t3.μικρό στην περιοχή ΗΠΑ-ανατολική-1 (Β. Βιρτζίνια). Η τιμή είναι σταθερή εδώ και 3 μήνες, προς το παρόν εξοικονομεί 3.4 φορές.
Αρχιτεκτονική υπηρεσίας
Η βασική αρχιτεκτονική της υπηρεσίας για την οποία θα μιλήσουμε σε αυτό το άρθρο φαίνεται στο παρακάτω διάγραμμα.
Εφαρμογή Load Balancer → EC2 Target Group → Elastic Container Service
Το Application Load Balancer (ALB) χρησιμοποιείται ως εξισορροπητής, ο οποίος στέλνει αιτήματα στην ομάδα στόχου EC2 (TG). Η TG είναι υπεύθυνη για το άνοιγμα θυρών σε στιγμιότυπα για ALB και τη σύνδεσή τους σε θύρες εμπορευματοκιβωτίων Elastic Container Service (ECS). Το ECS είναι ένα ανάλογο του Kubernetes στο AWS, το οποίο διαχειρίζεται τα κοντέινερ Docker.
Μια παρουσία μπορεί να έχει πολλά κοντέινερ που τρέχουν με τις ίδιες θύρες, επομένως δεν μπορούμε να τα ρυθμίσουμε σταθερά. Η ECS λέει στην TG ότι εκκινεί μια νέα εργασία (στην ορολογία του Kubernetes αυτό ονομάζεται pod), ελέγχει για δωρεάν θύρες στο στιγμιότυπο και αναθέτει μία από αυτές στην εκκινημένη εργασία. Το TG ελέγχει επίσης τακτικά εάν το στιγμιότυπο και το API εργάζονται σε αυτό χρησιμοποιώντας έλεγχο υγείας και εάν δει προβλήματα, σταματά να στέλνει αιτήματα εκεί.
EC2 Auto Scaling Groups + ECS Capacity Providers
Το παραπάνω διάγραμμα δεν δείχνει την υπηρεσία EC2 Auto Scaling Groups (ASG). Από το όνομα μπορείτε να καταλάβετε ότι είναι υπεύθυνο για την κλιμάκωση των περιπτώσεων. Ωστόσο, μέχρι πρόσφατα, το AWS δεν είχε ενσωματωμένη δυνατότητα διαχείρισης του αριθμού των μηχανημάτων που λειτουργούσαν από το ECS. Το ECS κατέστησε δυνατή την κλιμάκωση του αριθμού των εργασιών, για παράδειγμα, με βάση τη χρήση της CPU, τη μνήμη RAM ή τον αριθμό των αιτημάτων. Αλλά αν οι εργασίες καταλάμβαναν όλες τις ελεύθερες περιπτώσεις, τότε δεν δημιουργήθηκαν αυτόματα νέα μηχανήματα.
Αυτό άλλαξε με την εμφάνιση των παρόχων χωρητικότητας ECS (ECS CP). Τώρα κάθε υπηρεσία στο ECS μπορεί να συσχετιστεί με ένα ASG και εάν οι εργασίες δεν ταιριάζουν στις εκτελούμενες περιπτώσεις, τότε θα αυξηθούν νέες (αλλά εντός των καθορισμένων ορίων ASG). Αυτό λειτουργεί επίσης προς την αντίθετη κατεύθυνση, εάν το ECS CP δει αδρανείς παρουσίες χωρίς εργασίες, τότε θα δώσει την εντολή ASG να τις τερματίσει. Το ECS CP έχει τη δυνατότητα να καθορίσει ένα στοχευόμενο ποσοστό φόρτωσης παρουσίας, έτσι ώστε ένας συγκεκριμένος αριθμός μηχανών να είναι πάντα ελεύθερος για εργασίες γρήγορης κλιμάκωσης· θα μιλήσω για αυτό λίγο αργότερα.
Πρότυπα εκκίνησης EC2
Η τελευταία υπηρεσία για την οποία θα μιλήσω πριν προχωρήσω σε λεπτομέρειες σχετικά με τη δημιουργία αυτής της υποδομής είναι τα EC2 Launch Templates. Σας επιτρέπει να δημιουργήσετε ένα πρότυπο σύμφωνα με το οποίο θα ξεκινήσουν όλα τα μηχανήματα, ώστε να μην το επαναλαμβάνετε από την αρχή κάθε φορά. Εδώ μπορείτε να επιλέξετε τον τύπο του μηχανήματος προς εκκίνηση, την ομάδα ασφαλείας, την εικόνα του δίσκου και πολλές άλλες παραμέτρους. Μπορείτε επίσης να καθορίσετε δεδομένα χρήστη που θα μεταφορτώνονται σε όλες τις εκκινήσεις. Μπορείτε να εκτελέσετε σενάρια σε δεδομένα χρήστη, για παράδειγμα, μπορείτε να επεξεργαστείτε τα περιεχόμενα ενός αρχείου
Μία από τις πιο σημαντικές παραμέτρους διαμόρφωσης για αυτό το άρθρο είναι
Σχετικά με το δίσκο - AWS πρόσφατα
Δημιουργία υπηρεσίας
Ας προχωρήσουμε στη δημιουργία της περιγραφόμενης υπηρεσίας. Στη διαδικασία, θα περιγράψω επιπλέον πολλά χρήσιμα σημεία που δεν αναφέρθηκαν παραπάνω. Σε γενικές γραμμές, αυτή είναι μια οδηγία βήμα προς βήμα, αλλά δεν θα εξετάσω ορισμένες πολύ βασικές ή, αντίθετα, πολύ συγκεκριμένες περιπτώσεις. Όλες οι ενέργειες εκτελούνται στην οπτική κονσόλα AWS, αλλά μπορούν να αναπαραχθούν μέσω προγραμματισμού χρησιμοποιώντας το CloudFormation ή το Terraform. Στο Adapty χρησιμοποιούμε Terraform.
Πρότυπο εκκίνησης EC2
Αυτή η υπηρεσία δημιουργεί μια διαμόρφωση των μηχανημάτων που θα χρησιμοποιηθούν. Η διαχείριση των προτύπων γίνεται στην ενότητα EC2 -> Instances -> Launch templates.
Εικόνα μηχανής Amazon (AMI) — καθορίστε την εικόνα δίσκου με την οποία θα εκκινηθούν όλες οι παρουσίες. Για το ECS, στις περισσότερες περιπτώσεις αξίζει να χρησιμοποιήσετε τη βελτιστοποιημένη εικόνα από το Amazon. Ενημερώνεται τακτικά και περιέχει όλα τα απαραίτητα για τη λειτουργία του ECS. Για να μάθετε το τρέχον αναγνωριστικό εικόνας, μεταβείτε στη σελίδα
Τύπος παρουσίας — υποδεικνύουν τον τύπο του στιγμιότυπου. Επιλέξτε αυτό που ταιριάζει καλύτερα στην εργασία σας.
Ζεύγος κλειδιών (είσοδος) — καθορίστε ένα πιστοποιητικό με το οποίο μπορείτε να συνδεθείτε στην παρουσία μέσω SSH, εάν είναι απαραίτητο.
Ρυθμίσεις δικτύου — καθορίστε τις παραμέτρους δικτύου. Πλατφόρμα δικτύωσης Στις περισσότερες περιπτώσεις θα πρέπει να υπάρχει ένα Virtual Private Cloud (VPC). Ομάδες ασφαλείας — ομάδες ασφαλείας για τις εμφανίσεις σας. Δεδομένου ότι θα χρησιμοποιήσουμε έναν εξισορροπητή μπροστά από τα στιγμιότυπα, προτείνω να καθορίσετε μια ομάδα εδώ που να επιτρέπει τις εισερχόμενες συνδέσεις μόνο από τον εξισορροπητή. Δηλαδή, θα έχετε 2 ομάδες ασφαλείας, μία για τον εξισορροπητή, που επιτρέπει εισερχόμενες συνδέσεις από οπουδήποτε στις θύρες 80 (http) και 443 (https) και τη δεύτερη για μηχανές, η οποία επιτρέπει εισερχόμενες συνδέσεις σε οποιεσδήποτε θύρες από την ομάδα εξισορρόπησης . Οι εξερχόμενες συνδέσεις και στις δύο ομάδες πρέπει να ανοίγουν χρησιμοποιώντας το πρωτόκολλο TCP σε όλες τις θύρες σε όλες τις διευθύνσεις. Μπορείτε να περιορίσετε τις θύρες και τις διευθύνσεις για εξερχόμενες συνδέσεις, αλλά στη συνέχεια πρέπει να παρακολουθείτε συνεχώς ότι δεν προσπαθείτε να αποκτήσετε πρόσβαση σε κάτι σε μια κλειστή θύρα.
Αποθήκευση (τόμοι) — καθορίστε τις παραμέτρους του δίσκου για τα μηχανήματα. Το μέγεθος του δίσκου δεν μπορεί να είναι μικρότερο από αυτό που καθορίζεται στο AMI· για το ECS Optimized είναι 30 GiB.
Προηγμένες λεπτομέρειες — καθορίστε πρόσθετες παραμέτρους.
Επιλογή αγοράς — αν θέλουμε να αγοράσουμε σποτ. Θέλουμε, αλλά δεν θα τσεκάρουμε αυτό το πλαίσιο εδώ, θα το διαμορφώσουμε στην ομάδα αυτόματης κλιμάκωσης, υπάρχουν περισσότερες επιλογές εκεί.
Προφίλ στιγμιότυπου IAM — υποδεικνύουν τον ρόλο με τον οποίο θα εκκινήσουν οι παρουσίες. Για να εκτελούνται οι παρουσίες στο ECS, χρειάζονται δικαιώματα, τα οποία συνήθως βρίσκονται στον ρόλο ecsInstanceRole. Σε ορισμένες περιπτώσεις μπορεί να δημιουργηθεί, αν όχι, τότε εδώ
Στη συνέχεια, υπάρχουν πολλές παράμετροι, βασικά μπορείτε να αφήσετε τις προεπιλεγμένες τιμές παντού, αλλά καθεμία από αυτές έχει μια σαφή περιγραφή. Ενεργοποιώ πάντα τη βελτιστοποιημένη παρουσία EBS και τις επιλογές T2/T3 Unlimited, εάν χρησιμοποιούνται
Φορά που ο χρήστης — υποδεικνύουν τα δεδομένα χρήστη. Θα επεξεργαστούμε το αρχείο /etc/ecs/ecs.config
, το οποίο περιέχει τη διαμόρφωση παράγοντα ECS.
Ένα παράδειγμα για το πώς μπορεί να φαίνονται τα δεδομένα χρήστη:
#!/bin/bash
echo ECS_CLUSTER=DemoApiClusterProd >> /etc/ecs/ecs.config
echo ECS_ENABLE_SPOT_INSTANCE_DRAINING=true >> /etc/ecs/ecs.config
echo ECS_CONTAINER_STOP_TIMEOUT=1m >> /etc/ecs/ecs.config
echo ECS_ENGINE_AUTH_TYPE=docker >> /etc/ecs/ecs.config
echo "ECS_ENGINE_AUTH_DATA={"registry.gitlab.com":{"username":"username","password":"password"}}" >> /etc/ecs/ecs.config
ECS_CLUSTER=DemoApiClusterProd
— η παράμετρος υποδεικνύει ότι το στιγμιότυπο ανήκει σε ένα σύμπλεγμα με το συγκεκριμένο όνομα, δηλαδή, αυτό το σύμπλεγμα θα μπορεί να τοποθετήσει τις εργασίες του σε αυτόν τον διακομιστή. Δεν έχουμε δημιουργήσει ακόμα ένα σύμπλεγμα, αλλά θα χρησιμοποιήσουμε αυτό το όνομα κατά τη δημιουργία του.
ECS_ENABLE_SPOT_INSTANCE_DRAINING=true
— η παράμετρος καθορίζει ότι όταν λαμβάνεται ένα σήμα για την απενεργοποίηση ενός στιγμιότυπου, όλες οι εργασίες σε αυτό θα πρέπει να μεταφέρονται στην κατάσταση αποστράγγισης.
ECS_CONTAINER_STOP_TIMEOUT=1m
- η παράμετρος καθορίζει ότι μετά τη λήψη ενός σήματος SIGINT, όλες οι εργασίες έχουν 1 λεπτό πριν σκοτωθούν.
ECS_ENGINE_AUTH_TYPE=docker
— η παράμετρος υποδεικνύει ότι το σχήμα Docker χρησιμοποιείται ως μηχανισμός εξουσιοδότησης
ECS_ENGINE_AUTH_DATA=...
— παραμέτρους σύνδεσης στο ιδιωτικό μητρώο κοντέινερ, όπου αποθηκεύονται οι εικόνες Docker σας. Εάν είναι δημόσιο, τότε δεν χρειάζεται να προσδιορίσετε τίποτα.
Για τους σκοπούς αυτού του άρθρου, θα χρησιμοποιήσω μια δημόσια εικόνα από το Docker Hub, επομένως καθορίστε τις παραμέτρους ECS_ENGINE_AUTH_TYPE
и ECS_ENGINE_AUTH_DATA
δεν χρειάζεται.
Καλό να το ξέρω: Συνιστάται η τακτική ενημέρωση του AMI, επειδή οι νέες εκδόσεις ενημερώνουν τις εκδόσεις του Docker, Linux, ECS agent κ.λπ. Για να μην το ξεχάσετε αυτό, μπορείτε
EC2 Auto Scaling Group
Η Auto Scaling Group είναι υπεύθυνη για την εκκίνηση και την κλιμάκωση των παρουσιών. Η διαχείριση των ομάδων γίνεται στην ενότητα EC2 -> Auto Scaling -> Auto Scaling Groups.
Εκκίνηση προτύπου — επιλέξτε το πρότυπο που δημιουργήθηκε στο προηγούμενο βήμα. Αφήνουμε την προεπιλεγμένη έκδοση.
Επιλογές αγοράς και τύποι παρουσιών — καθορίστε τους τύπους παρουσιών για το σύμπλεγμα. Το πρότυπο εκκίνησης Συμμόρφωση στην εκκίνηση χρησιμοποιεί τον τύπο παρουσίας από το Πρότυπο εκκίνησης. Ο συνδυασμός επιλογών αγοράς και τύπων παρουσιών σάς επιτρέπει να διαμορφώνετε με ευελιξία τους τύπους παρουσιών. Θα το χρησιμοποιήσουμε.
Προαιρετική βάση κατ' απαίτηση — ο αριθμός των τακτικών, μη σημειακών περιπτώσεων που θα λειτουργούν πάντα.
Ποσοστό κατ' απαίτηση πάνω από τη βάση — ποσοστιαία αναλογία κανονικών και σποτ, 50-50 θα κατανεμηθούν ισόποσα, 20-80 για κάθε κανονικό στιγμιότυπο θα αυξηθούν 4 σποτ. Για τους σκοπούς αυτού του παραδείγματος, θα αναφέρω 50-50, αλλά στην πραγματικότητα κάνουμε τις περισσότερες φορές 20-80, σε ορισμένες περιπτώσεις 0-100.
Τύποι παρουσίας — εδώ μπορείτε να καθορίσετε πρόσθετους τύπους παρουσιών που θα χρησιμοποιηθούν στο σύμπλεγμα. Δεν το χρησιμοποιήσαμε ποτέ γιατί δεν καταλαβαίνω πραγματικά το νόημα της ιστορίας. Ίσως αυτό οφείλεται στα όρια σε συγκεκριμένους τύπους περιπτώσεων, αλλά μπορούν εύκολα να αυξηθούν μέσω της υποστήριξης. Εάν γνωρίζετε την εφαρμογή, θα χαρώ να τη διαβάσω στα σχόλια)
Δίκτυο — ρυθμίσεις δικτύου, επιλέξτε VPC και υποδίκτυα για μηχανήματα, στις περισσότερες περιπτώσεις θα πρέπει να επιλέξετε όλα τα διαθέσιμα υποδίκτυα.
Εξισορρόπηση φορτίου - ρυθμίσεις εξισορρόπησης, αλλά θα το κάνουμε αυτό ξεχωριστά, δεν θα αγγίξουμε τίποτα εδώ. Έλεγχοι υγείας θα ρυθμιστεί επίσης αργότερα.
Μέγεθος ομάδας — υποδεικνύουμε τα όρια στον αριθμό των μηχανών στο σύμπλεγμα και τον επιθυμητό αριθμό μηχανών στην αρχή. Ο αριθμός των μηχανών στο σύμπλεγμα δεν θα είναι ποτέ μικρότερος από το ελάχιστο καθορισμένο και μεγαλύτερο από το μέγιστο, ακόμα κι αν η κλιμάκωση πρέπει να γίνει σύμφωνα με τις μετρήσεις.
Πολιτικές κλιμάκωσης — παραμέτρους κλιμάκωσης, αλλά θα κλιμακώσουμε με βάση τις τρέχουσες εργασίες ECS, επομένως θα διαμορφώσουμε την κλίμακα αργότερα.
Προστασία για παράδειγμα κλίμακας — προστασία των περιπτώσεων από διαγραφή κατά τη μείωση της κλίμακας. Το ενεργοποιούμε έτσι ώστε το ASG να μην διαγράφει το μηχάνημα που έχει εκτελούμενες εργασίες. Το ECS Capacity Provider θα απενεργοποιήσει την προστασία για περιπτώσεις που δεν έχουν εργασίες.
Προσθέστε ετικέτες — μπορείτε να καθορίσετε ετικέτες για παρουσίες (για αυτό, πρέπει να είναι επιλεγμένο το πλαίσιο ελέγχου Ετικέτα νέων περιπτώσεων). Συνιστώ να καθορίσετε την ετικέτα Όνομα, τότε όλες οι εμφανίσεις που εκκινούνται εντός της ομάδας θα έχουν το ίδιο όνομα και είναι βολικό να τις προβάλετε στην κονσόλα.
Αφού δημιουργήσετε την ομάδα, ανοίξτε την και μεταβείτε στην ενότητα Σύνθετες διαμορφώσεις.Γιατί δεν είναι ορατές όλες οι επιλογές στην κονσόλα στο στάδιο της δημιουργίας.
Πολιτικές τερματισμού — κανόνες που λαμβάνονται υπόψη κατά τη διαγραφή περιπτώσεων. Εφαρμόζονται με τη σειρά. Συνήθως χρησιμοποιούμε αυτά της παρακάτω εικόνας. Αρχικά, οι παρουσίες με το παλαιότερο Πρότυπο εκκίνησης διαγράφονται (για παράδειγμα, εάν ενημερώσαμε το AMI, δημιουργήσαμε μια νέα έκδοση, αλλά όλες οι παρουσίες κατάφεραν να μεταβούν σε αυτό). Στη συνέχεια, επιλέγονται οι περιπτώσεις που είναι πιο κοντά στην επόμενη ώρα χρέωσης. Και στη συνέχεια επιλέγονται τα παλαιότερα με βάση την ημερομηνία κυκλοφορίας.
Καλό να το ξέρω: για ενημέρωση όλων των μηχανημάτων σε ένα σύμπλεγμα, βολικό στη χρήση
Application Load Balancer και EC2 Target Group
Ο εξισορροπητής δημιουργείται στην ενότητα EC2 → Load Balancing → Load Balancer. Θα χρησιμοποιήσουμε το Application Load Balancer. Μπορείτε να διαβάσετε μια σύγκριση διαφορετικών τύπων εξισορροπητών
Ακρόαση - είναι λογικό να δημιουργήσετε τις θύρες 80 και 443 και να ανακατευθύνετε από το 80 στο 443 χρησιμοποιώντας κανόνες εξισορρόπησης αργότερα.
Ζώνες διαθεσιμότητας — στις περισσότερες περιπτώσεις, επιλέγουμε ζώνες προσβασιμότητας για όλους.
Διαμόρφωση ρυθμίσεων ασφαλείας — εδώ υποδεικνύεται το πιστοποιητικό SSL για τον εξισορροπητή, η πιο βολική επιλογή είναι ELBSecurityPolicy-2016-08
. Αφού δημιουργήσετε τον εξισορροπητή, θα το δείτε Όνομα DNS, το οποίο χρειάζεστε για να διαμορφώσετε το CNAME για τον τομέα σας. Για παράδειγμα, έτσι φαίνεται στο Cloudflare.
Ομάδα ασφαλείας — δημιουργήστε ή επιλέξτε μια ομάδα ασφαλείας για τον εξισορροπητή, έγραψα περισσότερα για αυτό ακριβώς παραπάνω στην ενότητα Πρότυπο εκκίνησης EC2 → Ρυθμίσεις δικτύου.
Ομάδα-στόχος — δημιουργούμε μια ομάδα που είναι υπεύθυνη για τη δρομολόγηση αιτημάτων από τον εξισορροπητή σε μηχανήματα και τον έλεγχο της διαθεσιμότητάς τους προκειμένου να τα αντικαταστήσει σε περίπτωση προβλημάτων. Τύπος στόχου πρέπει να είναι παράδειγμα, Πρωτόκολλο и Λιμάνι οποιαδήποτε, εάν χρησιμοποιείτε HTTPS για επικοινωνία μεταξύ του εξισορροπητή και των παρουσιών, τότε πρέπει να ανεβάσετε ένα πιστοποιητικό σε αυτά. Για τους σκοπούς αυτού του παραδείγματος, δεν θα το κάνουμε αυτό, απλώς θα αφήσουμε τη θύρα 80.
Έλεγχοι υγείας — παραμέτρους για τον έλεγχο της λειτουργικότητας της υπηρεσίας. Σε μια πραγματική υπηρεσία, αυτό θα πρέπει να είναι ένα ξεχωριστό αίτημα που υλοποιεί σημαντικά μέρη της επιχειρηματικής λογικής· για τους σκοπούς αυτού του παραδείγματος, θα αφήσω τις προεπιλεγμένες ρυθμίσεις. Στη συνέχεια, μπορείτε να επιλέξετε το διάστημα αιτήματος, το χρονικό όριο, τους κωδικούς επιτυχίας κ.λπ. Στο παράδειγμά μας, θα υποδείξουμε τους κωδικούς επιτυχίας 200-399, επειδή η εικόνα Docker που θα χρησιμοποιηθεί επιστρέφει έναν κωδικό 304.
Εγγραφή Στόχων — εδώ επιλέγονται τα αυτοκίνητα για την ομάδα, αλλά στην περίπτωσή μας αυτό θα γίνει από την ECS, επομένως απλώς παραλείπουμε αυτό το βήμα.
Καλό να το ξέρω: σε επίπεδο εξισορροπητή μπορείτε να ενεργοποιήσετε αρχεία καταγραφής που θα αποθηκευτούν στο S3 σε ένα ορισμένο
Ορισμός εργασιών ECS
Στα προηγούμενα βήματα, δημιουργήσαμε οτιδήποτε σχετίζεται με την υποδομή υπηρεσιών· τώρα προχωράμε στην περιγραφή των κοντέινερ που θα λανσάρουμε. Αυτό γίνεται στην ενότητα ECS → Task Definitions.
Συμβατότητα τύπου εκκίνησης - επιλέξτε EC2.
Εκτέλεση εργασιών Ρόλος IAM - επιλέξτε ecsTaskExecutionRole
. Χρησιμοποιώντας το, γράφονται αρχεία καταγραφής, δίνεται πρόσβαση σε μυστικές μεταβλητές κ.λπ.
Στην ενότητα Ορισμοί κοντέινερ, κάντε κλικ στην επιλογή Προσθήκη κοντέινερ.
Εικόνα — σύνδεσμος προς την εικόνα με τον κώδικα του έργου· για αυτό το παράδειγμα θα χρησιμοποιήσω μια δημόσια εικόνα από το Docker Hub
Όρια μνήμης — όρια μνήμης για το δοχείο. Σκληρό όριο — σκληρό όριο, εάν το κοντέινερ υπερβαίνει την καθορισμένη τιμή, η εντολή kill docker θα εκτελεστεί, το κοντέινερ θα πεθάνει αμέσως. Soft Limit — μαλακό όριο, το δοχείο μπορεί να υπερβαίνει την καθορισμένη τιμή, αλλά αυτή η παράμετρος θα λαμβάνεται υπόψη κατά την τοποθέτηση εργασιών σε μηχανήματα. Για παράδειγμα, εάν ένα μηχάνημα έχει 4 GiB μνήμης RAM και το soft όριο ενός κοντέινερ είναι 2048 MiB, τότε αυτό το μηχάνημα μπορεί να έχει έως και 2 εργασίες που εκτελούνται με αυτό το κοντέινερ. Στην πραγματικότητα, τα 4 GiB μνήμης RAM είναι ελαφρώς λιγότερα από 4096 MiB, αυτό μπορεί να προβληθεί στην καρτέλα ECS Instances στο σύμπλεγμα. Το μαλακό όριο δεν μπορεί να είναι μεγαλύτερο από το σκληρό όριο. Είναι σημαντικό να κατανοήσουμε ότι εάν υπάρχουν πολλά δοχεία σε μία εργασία, τότε τα όριά τους συνοψίζονται.
Χαρτογραφήσεις λιμένων - στις Θύρα υποδοχής Υποδεικνύουμε 0, αυτό σημαίνει ότι η θύρα θα εκχωρηθεί δυναμικά και θα παρακολουθείται από την Target Group. Λιμάνι εμπορευματοκιβωτίων — η θύρα στην οποία εκτελείται η εφαρμογή σας προσδιορίζεται συχνά στην εντολή εκτέλεσης ή εκχωρείται στον κώδικα της εφαρμογής σας, στο Dockerfile κ.λπ. Για το παράδειγμά μας θα χρησιμοποιήσουμε το 3000 επειδή αναφέρεται στο
Ελεγχος υγείας — παράμετροι υγειονομικού ελέγχου εμπορευματοκιβωτίων, που δεν πρέπει να συγχέονται με αυτές που έχουν διαμορφωθεί στην ομάδα στόχο.
Περιβάλλον - ρυθμίσεις περιβάλλοντος. Μονάδες CPU - παρόμοια με τα όρια μνήμης, μόνο για τον επεξεργαστή. Κάθε πυρήνας επεξεργαστή είναι 1024 μονάδες, επομένως εάν ο διακομιστής έχει επεξεργαστή διπλού πυρήνα και το κοντέινερ έχει οριστεί σε 512, τότε 4 εργασίες με αυτό το κοντέινερ μπορούν να εκκινηθούν σε έναν διακομιστή. Οι μονάδες CPU αντιστοιχούν πάντα στον αριθμό των πυρήνων· δεν μπορεί να είναι λίγο λιγότεροι, όπως συμβαίνει με τη μνήμη.
εντολή — μια εντολή για την έναρξη μιας υπηρεσίας μέσα σε ένα κοντέινερ, όλες οι παράμετροι καθορίζονται διαχωρισμένες με κόμμα. Αυτό θα μπορούσε να είναι gunicorn, npm, κ.λπ. Εάν δεν προσδιορίζεται, θα χρησιμοποιηθεί η τιμή της οδηγίας CMD από το Dockerfile. υποδεικνύουμε npm,start
.
Μεταβλητές περιβάλλοντος — μεταβλητές περιβάλλοντος κοντέινερ. Αυτό μπορεί να είναι είτε απλά δεδομένα κειμένου είτε μυστικές μεταβλητές από
Αποθήκευση και Καταγραφή — εδώ θα ρυθμίσουμε τη σύνδεση στο CloudWatch Logs (υπηρεσία για αρχεία καταγραφής από το AWS). Για να το κάνετε αυτό, απλώς ενεργοποιήστε το πλαίσιο ελέγχου Auto-configure CloudWatch Logs. Μετά τη δημιουργία του ορισμού εργασιών, μια ομάδα αρχείων καταγραφής θα δημιουργηθεί αυτόματα στο CloudWatch. Από προεπιλογή, τα αρχεία καταγραφής αποθηκεύονται σε αυτό επ' αόριστον. Συνιστώ να αλλάξετε την περίοδο διατήρησης από Ποτέ δεν λήγει στην απαιτούμενη περίοδο. Αυτό γίνεται στις ομάδες καταγραφής CloudWatch, πρέπει να κάνετε κλικ στην τρέχουσα περίοδο και να επιλέξετε μια νέα.
ECS Cluster και ECS Capacity Provider
Μεταβείτε στην ενότητα ECS → Cluster για να δημιουργήσετε ένα σύμπλεγμα. Επιλέγουμε το EC2 Linux + Networking ως πρότυπο.
Όνομα συμπλέγματος - πολύ σημαντικό, κάνουμε εδώ το ίδιο όνομα με αυτό που καθορίζεται στην παράμετρο Launch Template ECS_CLUSTER
, στην περίπτωσή μας - DemoApiClusterProd
. Επιλέξτε το πλαίσιο ελέγχου Δημιουργία κενού συμπλέγματος. Προαιρετικά, μπορείτε να ενεργοποιήσετε το Container Insights για προβολή μετρήσεων για υπηρεσίες στο CloudWatch. Εάν τα κάνατε όλα σωστά, τότε στην ενότητα ECS Instances θα δείτε μηχανήματα που δημιουργήθηκαν στην ομάδα Auto Scaling.
Μεταβείτε στην καρτέλα Πάροχοι χωρητικότητας και δημιουργήστε ένα νέο. Επιτρέψτε μου να σας υπενθυμίσω ότι απαιτείται για τον έλεγχο της δημιουργίας και του τερματισμού λειτουργίας μηχανών ανάλογα με τον αριθμό των εργασιών ECS που εκτελούνται. Είναι σημαντικό να σημειωθεί ότι ένας πάροχος μπορεί να εκχωρηθεί μόνο σε μία ομάδα.
Ομάδα αυτόματης κλιμάκωσης — επιλέξτε την ομάδα που δημιουργήθηκε προηγουμένως.
Διαχειριζόμενη κλιμάκωση — ενεργοποιήστε το έτσι ώστε ο πάροχος να μπορεί να κλιμακώσει την υπηρεσία.
Χωρητικότητα στόχος % — ποιο ποσοστό μηχανημάτων φορτωμένων με εργασίες χρειαζόμαστε. Εάν καθορίσετε 100%, τότε όλα τα μηχανήματα θα είναι πάντα απασχολημένα με την εκτέλεση εργασιών. Εάν καθορίσετε το 50%, τότε τα μισά αυτοκίνητα θα είναι πάντα δωρεάν. Σε αυτήν την περίπτωση, εάν υπάρξει απότομη άλμα στο φορτίο, τα νέα ταξί θα φτάσουν αμέσως σε δωρεάν αυτοκίνητα, χωρίς να χρειάζεται να περιμένουν να αναπτυχθούν περιπτώσεις.
Διαχειριζόμενη προστασία τερματισμού — ενεργοποίηση, αυτή η παράμετρος επιτρέπει στον πάροχο να αφαιρέσει την προστασία των παρουσιών από τη διαγραφή. Αυτό συμβαίνει όταν δεν υπάρχουν ενεργές εργασίες στο μηχάνημα και επιτρέπει τη χωρητικότητα στόχου%.
Υπηρεσία ECS και ρύθμιση κλιμάκωσης
Τελευταίο βήμα :) Για να δημιουργήσετε μια υπηρεσία, πρέπει να μεταβείτε στο σύμπλεγμα που δημιουργήθηκε προηγουμένως στην καρτέλα Υπηρεσίες.
Τύπος εκκίνησης — πρέπει να κάνετε κλικ στη στρατηγική Εναλλαγή σε πάροχο χωρητικότητας και να επιλέξετε τους παρόχους που δημιουργήθηκαν προηγουμένως.
Ορισμός Εργασίας — επιλέξτε τον ορισμό εργασίας που δημιουργήθηκε προηγουμένως και την αναθεώρησή του.
Ονομα Υπηρεσίας — για αποφυγή σύγχυσης, υποδεικνύουμε πάντα το ίδιο με τον ορισμό εργασίας.
Υπηρεσία τύπου - πάντα Ρεπλίκα.
Αριθμός εργασιών — τον επιθυμητό αριθμό ενεργών εργασιών στην υπηρεσία. Αυτή η παράμετρος ελέγχεται με κλιμάκωση, αλλά πρέπει ακόμα να καθοριστεί.
Ελάχιστο υγιές ποσοστό и Μέγιστο ποσοστό — καθορίζει τη συμπεριφορά των εργασιών κατά την ανάπτυξη. Οι προεπιλεγμένες τιμές είναι 100 και 200, υποδεικνύοντας ότι κατά τη στιγμή της ανάπτυξης ο αριθμός των εργασιών θα αυξηθεί αρκετές φορές και στη συνέχεια θα επιστρέψει στην επιθυμητή τιμή. Εάν έχετε 1 εργασία που εκτελείται, min=0 και max=100, τότε κατά την ανάπτυξη θα σκοτωθεί και μετά θα ανέβει μια νέα, δηλαδή θα είναι εκτός λειτουργίας. Εάν εκτελείται 1 εργασία, min=50, max=150, τότε η ανάπτυξη δεν θα γίνει καθόλου, επειδή 1 εργασία δεν μπορεί να διαιρεθεί στο μισό ή να αυξηθεί κατά μιάμιση φορά.
Τύπος ανάπτυξης — έξοδος από την Κυλιόμενη ενημέρωση.
Πρότυπα τοποθέτησης — κανόνες για την τοποθέτηση εργασιών σε μηχανές. Η προεπιλογή είναι AZ Balanced Spread - αυτό σημαίνει ότι κάθε νέα εργασία θα τοποθετείται σε μια νέα παρουσία έως ότου αυξηθούν τα μηχανήματα σε όλες τις ζώνες διαθεσιμότητας. Συνήθως κάνουμε BinPack - CPU και Spread - AZ· με αυτήν την πολιτική, οι εργασίες τοποθετούνται όσο το δυνατόν πιο πυκνά σε ένα μηχάνημα ανά CPU. Εάν είναι απαραίτητο να δημιουργήσετε ένα νέο μηχάνημα, δημιουργείται σε μια νέα ζώνη διαθεσιμότητας.
Τύπος εξισορροπητή φορτίου — επιλέξτε Application Load Balancer.
Ρόλος IAM υπηρεσίας - επιλέξτε ecsServiceRole
.
Όνομα εξισορροπητή φορτίου — επιλέξτε τον εξισορροπητή που δημιουργήθηκε προηγουμένως.
Περίοδος χάριτος για έλεγχο υγείας — παύση πριν από την εκτέλεση υγειονομικών ελέγχων μετά την κυκλοφορία μιας νέας εργασίας, συνήθως την ορίζουμε στα 60 δευτερόλεπτα.
Εμπορευματοκιβώτιο για την ισορροπία φόρτωσης — στο στοιχείο Όνομα ομάδας στόχου, επιλέξτε την ομάδα που δημιουργήθηκε προηγουμένως και όλα θα συμπληρωθούν αυτόματα.
Αυτόματη κλιμάκωση σέρβις — παράμετροι κλιμάκωσης υπηρεσίας. Επιλέξτε Configure Service Auto Scaling για να προσαρμόσετε τον επιθυμητό αριθμό της υπηρεσίας σας. Ορίζουμε τον ελάχιστο και μέγιστο αριθμό εργασιών κατά την κλιμάκωση.
Ρόλος IAM για την αυτόματη κλιμάκωση σέρβις - επιλέξτε AWSServiceRoleForApplicationAutoScaling_ECSService
.
Πολιτικές αυτόματης κλιμάκωσης εργασιών — κανόνες για την κλιμάκωση. Υπάρχουν 2 τύποι:
- Παρακολούθηση στόχου — παρακολούθηση μετρήσεων στόχου (χρήση CPU/RAM ή αριθμός αιτημάτων για κάθε εργασία). Για παράδειγμα, θέλουμε ο μέσος φόρτος επεξεργαστή να είναι 85%, όταν γίνει υψηλότερος, θα προστεθούν νέες εργασίες μέχρι να φτάσει την τιμή στόχο. Εάν το φορτίο είναι χαμηλότερο, τότε οι εργασίες θα αφαιρεθούν, αντίθετα, εκτός εάν είναι ενεργοποιημένη η προστασία από μείωση της κλιμάκωσης (Απενεργοποίηση κλιμάκωσης).
- Κλιμάκωση βημάτων - αντίδραση σε αυθαίρετο γεγονός. Εδώ μπορείτε να διαμορφώσετε μια αντίδραση σε οποιοδήποτε συμβάν (Συναγερμός CloudWatch), όταν συμβεί, μπορείτε να προσθέσετε ή να αφαιρέσετε τον καθορισμένο αριθμό εργασιών ή να καθορίσετε τον ακριβή αριθμό εργασιών.
Μια υπηρεσία μπορεί να έχει πολλούς κανόνες κλιμάκωσης, αυτό μπορεί να είναι χρήσιμο, το κύριο πράγμα είναι να διασφαλιστεί ότι δεν έρχονται σε σύγκρουση μεταξύ τους.
Συμπέρασμα
Εάν ακολουθήσατε τις οδηγίες και χρησιμοποιήσατε την ίδια εικόνα Docker, η υπηρεσία σας θα πρέπει να επιστρέψει μια σελίδα όπως αυτή.
- Έχουμε δημιουργήσει ένα πρότυπο σύμφωνα με το οποίο εκκινούνται όλα τα μηχανήματα στην υπηρεσία. Μάθαμε επίσης πώς να ενημερώνουμε μηχανές όταν αλλάζει το πρότυπο.
- Έχουμε διαμορφώσει τις παραμέτρους της επεξεργασίας του σήματος διακοπής στιγμιαίου στιγμιότυπου, επομένως μέσα σε ένα λεπτό μετά τη λήψη του, όλες οι εκτελούμενες εργασίες αφαιρούνται από το μηχάνημα, ώστε να μην χάνεται ή να διακόπτεται τίποτα.
- Ανυψώσαμε τον εξισορροπητή για να κατανεμηθεί ομοιόμορφα το φορτίο στα μηχανήματα.
- Έχουμε δημιουργήσει μια υπηρεσία που εκτελείται επί τόπου, η οποία μειώνει το κόστος του μηχανήματος κατά περίπου 3 φορές.
- Έχουμε διαμορφώσει την αυτόματη κλιμάκωση και προς τις δύο κατευθύνσεις, ώστε να χειριζόμαστε αυξημένο φόρτο εργασίας χωρίς να επιβαρύνουμε το κόστος διακοπής λειτουργίας.
- Χρησιμοποιούμε το Capacity Provider ώστε η εφαρμογή να διαχειρίζεται την υποδομή (μηχανήματα) και όχι το αντίστροφο.
- Είμαστε υπέροχοι.
Εάν έχετε προβλέψιμες αιχμές στο φορτίο, για παράδειγμα, διαφημίζεστε σε μια μεγάλη καμπάνια ηλεκτρονικού ταχυδρομείου, μπορείτε να ρυθμίσετε την κλιμάκωση κατά
Μπορείτε επίσης να κλιμακώσετε με βάση δεδομένα από διαφορετικά μέρη του συστήματός σας. Για παράδειγμα, έχουμε τη λειτουργικότητα
Θα χαρώ αν μου πείτε στα σχόλια ενδιαφέρουσες περιπτώσεις χρήσης σποτ και ECS ή κάτι για κλιμάκωση.
Σύντομα θα υπάρξουν άρθρα σχετικά με το πώς επεξεργαζόμαστε χιλιάδες αναλυτικά συμβάντα ανά δευτερόλεπτο σε μια στοίβα κατά κύριο λόγο χωρίς διακομιστή (με χρήματα) και πώς λειτουργεί η ανάπτυξη των υπηρεσιών χρησιμοποιώντας το GitLab CI και το Terraform Cloud.
Εγγραφείτε σε εμάς, θα είναι ενδιαφέρον!
Μόνο εγγεγραμμένοι χρήστες μπορούν να συμμετάσχουν στην έρευνα.
Χρησιμοποιείτε spot στιγμιότυπα στην παραγωγή;
-
22,2%Ναι 6
-
66,7%Νο18
-
11,1%Έμαθα για αυτά από ένα άρθρο και σκοπεύω να τα χρησιμοποιήσω3
Ψήφισαν 27 χρήστες. 5 χρήστες απείχαν.
Πηγή: www.habr.com