Κόμβοι εργασίας Kubernetes: πολλοί μικροί ή πολλοί μεγάλοι;

Κόμβοι εργασίας Kubernetes: πολλοί μικροί ή πολλοί μεγάλοι;
Κατά τη δημιουργία ενός συμπλέγματος Kubernetes, μπορεί να προκύψουν ερωτήσεις: πόσοι κόμβοι εργαζομένων να διαμορφωθούν και ποιος τύπος; Τι είναι καλύτερο για ένα σύμπλεγμα εσωτερικής εγκατάστασης: αγοράστε αρκετούς ισχυρούς διακομιστές ή χρησιμοποιήστε μια ντουζίνα παλιές μηχανές στο κέντρο δεδομένων σας; Είναι καλύτερο να παίρνετε οκτώ μονοπύρηνα ή δύο τετραπύρηνα στιγμιότυπα στο cloud;

Οι απαντήσεις σε αυτές τις ερωτήσεις βρίσκονται στο άρθρο. Daniel Weibel, μηχανικός λογισμικού και δάσκαλος του εκπαιδευτικού έργου Learnk8s στη μετάφραση της εντολής Kubernetes aaS από το Mail.ru.

Χωρητικότητα συμπλέγματος

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

Υπάρχουν διάφοροι τρόποι για να επιτύχετε τον επιθυμητό στόχο χωρητικότητας συμπλέγματος. Για παράδειγμα, χρειαζόμαστε ένα σύμπλεγμα με συνολική χωρητικότητα 8 πυρήνων επεξεργαστή και 32 GB μνήμης RAM, επειδή ένα σύνολο εφαρμογών απαιτεί τόσους πολλούς πόρους. Στη συνέχεια, μπορείτε να εγκαταστήσετε δύο κόμβους με μνήμη 16 GB ή τέσσερις κόμβους με μνήμη 8 GB, δύο επεξεργαστές τετραπλού πυρήνα ή τέσσερις διπύρηνους.

Ακολουθούν μόνο δύο πιθανοί τρόποι για να δημιουργήσετε ένα σύμπλεγμα:

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

Ποια είναι η καλύτερη επιλογή;

Για να απαντήσουμε σε αυτήν την ερώτηση, ας δούμε τα πλεονεκτήματα και των δύο επιλογών. Τα έχουμε συνοψίσει σε έναν πίνακα.

Αρκετοί μεγάλοι κόμβοι

Πολλοί μικροί κόμβοι

Ευκολότερη διαχείριση συμπλέγματος (εάν είναι εσωτερικής εγκατάστασης)

Ομαλή αυτόματη κλιμάκωση

Φθηνότερο (αν είναι εντός εγκατάστασης)

Η τιμή είναι λίγο διαφορετική (στο σύννεφο)

Μπορεί να τρέξει εφαρμογές έντασης πόρων

Πλήρης αναπαραγωγή

Οι πόροι χρησιμοποιούνται πιο αποτελεσματικά (λιγότερα έξοδα για τους δαίμονες του συστήματος
Υψηλότερη ανοχή σφαλμάτων συμπλέγματος

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

Ας συζητήσουμε, λοιπόν, κάθε σημείο από τον πίνακα με περισσότερες λεπτομέρειες.

Πρώτη επιλογή: αρκετοί μεγάλοι κόμβοι

Η πιο ακραία επιλογή είναι ένας κόμβος εργαζόμενος για ολόκληρη τη χωρητικότητα του συμπλέγματος. Στο παραπάνω παράδειγμα, αυτός θα ήταν ένας μεμονωμένος κόμβος εργάτη με 16 πυρήνες CPU και 16 GB μνήμης RAM.

Πλεονεκτήματα

Συν Νο. 1. Ευκολότερη διαχείριση
Είναι πιο εύκολο να διαχειριστείς λίγα μηχανήματα παρά έναν ολόκληρο στόλο. Είναι πιο γρήγορο να κυκλοφορήσετε ενημερώσεις και διορθώσεις και είναι πιο εύκολο να συγχρονίσετε. Ο αριθμός των αστοχιών σε απόλυτους αριθμούς είναι επίσης μικρότερος.

Λάβετε υπόψη ότι όλα τα παραπάνω ισχύουν για το υλικό σας, τους διακομιστές σας και όχι για περιπτώσεις cloud.

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

Δρομολόγηση κυκλοφορίας και κατανομή φορτίου μεταξύ των pod στο cloud εκτελείται αυτόματα: η κίνηση που προέρχεται από το Διαδίκτυο αποστέλλεται στον κύριο εξισορροπητή φορτίου, ο οποίος προωθεί την κίνηση στη θύρα ενός από τους κόμβους (η υπηρεσία NodePort ορίζει τη θύρα στην περιοχή 30000-32767 σε κάθε κόμβο συμπλέγματος). Οι κανόνες που ορίζονται από το kube-proxy ανακατευθύνουν την κυκλοφορία από τον κόμβο στο pod. Δείτε πώς φαίνεται για δέκα λοβούς σε δύο κόμβους:

Κόμβοι εργασίας Kubernetes: πολλοί μικροί ή πολλοί μεγάλοι;
Pro #2: Λιγότερο κόστος ανά κόμβο
Ένα ισχυρό αυτοκίνητο είναι πιο ακριβό, αλλά η αύξηση της τιμής δεν είναι απαραίτητα γραμμική. Με άλλα λόγια, ένας διακομιστής δέκα πυρήνων με 10 GB μνήμης είναι συνήθως φθηνότερος από δέκα διακομιστές μονού πυρήνα με την ίδια ποσότητα μνήμης.

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

Έτσι, στο cloud συνήθως δεν μπορείτε να αποθηκεύσετε σε πιο ισχυρούς διακομιστές.

Pro #3: Μπορείτε να εκτελέσετε εφαρμογές με ένταση πόρων
Ορισμένες εφαρμογές απαιτούν ισχυρούς διακομιστές σε ένα σύμπλεγμα. Για παράδειγμα, εάν ένα σύστημα μηχανικής εκμάθησης απαιτεί 8 GB μνήμης, δεν θα μπορείτε να το εκτελέσετε σε κόμβους 1 GB, αλλά μόνο με τουλάχιστον έναν μεγάλο κόμβο εργασίας.

Μειονεκτήματα

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

Αυτό μπορεί να είναι πρόβλημα.

Ο λόγος είναι ότι κάθε λειτουργική μονάδα εισάγει κάποια επιβάρυνση στο χρόνο εκτέλεσης του κοντέινερ (π.χ. Docker), καθώς και στο kubelet και το cAdvisor.

Για παράδειγμα, ένα kubelet εξετάζει τακτικά όλα τα δοχεία σε έναν κόμβο για επιβίωση - όσο περισσότερα δοχεία, τόσο περισσότερη δουλειά έχει να κάνει το kubelet.

Το CAdvisor συλλέγει στατιστικά στοιχεία χρήσης πόρων για όλα τα κοντέινερ σε έναν κόμβο και το kubelet ρωτά τακτικά αυτές τις πληροφορίες και τις παρέχει μέσω ενός API. Και πάλι, περισσότερα κοντέινερ σημαίνει περισσότερη δουλειά τόσο για το cAdvisor όσο και για το kubelet.

Εάν ο αριθμός των μονάδων αυξηθεί, μπορεί να επιβραδύνει το σύστημα και ακόμη και να υπονομεύσει την αξιοπιστία του.

Κόμβοι εργασίας Kubernetes: πολλοί μικροί ή πολλοί μεγάλοι;
Στο αποθετήριο Kubernetes μερικά παραπονέθηκεότι οι κόμβοι μεταπηδούν μεταξύ των καταστάσεων Ready/NotReady επειδή οι τακτικοί έλεγχοι kubelet όλων των κοντέινερ σε έναν κόμβο διαρκούν πολύ.
Για αυτό το λόγο Kubernetes συνιστά την τοποθέτηση όχι περισσότερων από 110 λοβών ανά κόμβο. Ανάλογα με την απόδοση του κόμβου, μπορείτε να εκτελέσετε περισσότερα pods ανά κόμβο, αλλά είναι δύσκολο να προβλέψετε εάν θα υπάρξουν προβλήματα ή όλα θα λειτουργήσουν καλά. Αξίζει να δοκιμάσετε την εργασία εκ των προτέρων.

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

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

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

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

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

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

Έτσι, όσο περισσότεροι κόμβοι, τόσο μικρότερος είναι ο αντίκτυπος των αστοχιών υλικού.

Μειονέκτημα #4: Περισσότερα βήματα αυτόματης κλιμάκωσης
Το Kubernetes διαθέτει ένα σύστημα αυτόματης κλίμακας συμπλέγματος για υποδομή cloud, το οποίο σας επιτρέπει να προσθέτετε ή να αφαιρείτε αυτόματα κόμβους ανάλογα με τις τρέχουσες ανάγκες σας. Με μεγαλύτερους κόμβους, η αυτόματη κλιμάκωση γίνεται πιο απότομη και αδέξια. Για παράδειγμα, σε δύο κόμβους, η προσθήκη ενός επιπλέον κόμβου θα αυξήσει αμέσως τη χωρητικότητα του συμπλέγματος κατά 50%. Και θα πρέπει να πληρώσετε για αυτούς τους πόρους, ακόμα κι αν δεν τους χρειάζεστε.

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

Τώρα ας δούμε τα πλεονεκτήματα και τα μειονεκτήματα ενός μεγάλου αριθμού μικρών κόμβων.

Δεύτερη επιλογή: πολλοί μικροί κόμβοι

Τα πλεονεκτήματα αυτής της προσέγγισης πηγάζουν ουσιαστικά από τα μειονεκτήματα της αντίθετης επιλογής με αρκετούς μεγάλους κόμβους.

Πλεονεκτήματα

Υπέρ #1: Λιγότερος αντίκτυπος της αποτυχίας
Όσο περισσότεροι κόμβοι, τόσο λιγότερα pods σε κάθε κόμβο. Για παράδειγμα, εάν έχετε εκατό μονάδες ανά δέκα κόμβους, τότε κάθε κόμβος θα έχει κατά μέσο όρο δέκα μονάδες.

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

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

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

Μειονεκτήματα

Μειονέκτημα Νο. 1. Δύσκολο στον έλεγχο
Η διαχείριση μεγάλου αριθμού κόμβων είναι πιο δύσκολη. Για παράδειγμα, κάθε κόμβος Kubernetes πρέπει να επικοινωνεί με όλους τους άλλους, δηλαδή ο αριθμός των συνδέσεων αυξάνεται τετραγωνικά και όλες αυτές οι συνδέσεις πρέπει να παρακολουθούνται.

Ο ελεγκτής κόμβου στο Kubernetes Controller Manager περπατά τακτικά σε όλους τους κόμβους του συμπλέγματος για να ελέγχει την υγεία - όσο περισσότεροι κόμβοι, τόσο περισσότερο φορτίζεται ο ελεγκτής.

Ο φόρτος στη βάση δεδομένων etcd αυξάνεται επίσης - κάθε kubelet και kube-proxy καλεί παρατηρητής για etcd (μέσω του API), στο οποίο το etcd θα πρέπει να μεταδίδει ενημερώσεις αντικειμένων.

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

Κόμβοι εργασίας Kubernetes: πολλοί μικροί ή πολλοί μεγάλοι;
Το Kubernetes υποστηρίζει επίσημα συμπλέγματα με αριθμός κόμβων έως 5000. Ωστόσο, στην πράξη υπάρχουν ήδη 500 κόμβοι μπορεί να προκαλέσει μη ασήμαντα προβλήματα.

Για να διαχειριστείτε μεγάλο αριθμό κόμβων εργαζομένων, θα πρέπει να επιλέξετε πιο ισχυρούς κύριους κόμβους. Για παράδειγμα, το kube-up εγκαθίσταται αυτόματα το σωστό μέγεθος VM για τον κύριο κόμβο ανάλογα με τον αριθμό των εργαζομένων κόμβων. Δηλαδή, όσο περισσότεροι κόμβοι εργαζόμενοι, τόσο πιο παραγωγικοί θα πρέπει να είναι οι κύριοι κόμβοι.

Για την επίλυση αυτών των συγκεκριμένων προβλημάτων υπάρχουν ειδικές εξελίξεις, όπως π.χ Εικονικό Kubelet. Αυτό το σύστημα σάς επιτρέπει να παρακάμπτετε περιορισμούς και να δημιουργείτε συμπλέγματα με έναν τεράστιο αριθμό κόμβων εργαζομένων.

Μειονέκτημα #2: Περισσότερα γενικά έξοδα.
Σε κάθε κόμβο εργάτη, το Kubernetes εκτελεί ένα σύνολο δαιμόνων συστήματος - σε αυτούς περιλαμβάνονται ο χρόνος εκτέλεσης του κοντέινερ (όπως το Docker), ο διακομιστής μεσολάβησης kube και ο kubelet, συμπεριλαμβανομένου του cAdvisor. Μαζί καταναλώνουν ένα συγκεκριμένο σταθερό ποσό πόρων.

Εάν έχετε πολλούς μικρούς κόμβους, η αναλογία αυτού του γενικού κόστους σε κάθε κόμβο είναι μεγαλύτερη. Για παράδειγμα, φανταστείτε ότι όλοι οι δαίμονες του συστήματος σε έναν μόνο κόμβο χρησιμοποιούν μαζί 0,1 πυρήνες CPU και 0,1 GB μνήμης. Εάν έχετε έναν κόμβο δέκα πυρήνων με 10 GB μνήμης, τότε οι δαίμονες καταναλώνουν το 1% της χωρητικότητας του συμπλέγματος. Από την άλλη πλευρά, σε δέκα κόμβους μονού πυρήνα με 1 GB μνήμης, οι δαίμονες θα πάρουν το 10% της χωρητικότητας του συμπλέγματος.

Έτσι, όσο λιγότεροι κόμβοι, τόσο πιο αποτελεσματικά χρησιμοποιείται η υποδομή.

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

Για παράδειγμα, κάθε pod απαιτεί 0,75 GB μνήμης. Εάν έχετε δέκα κόμβους, ο καθένας με 1 GB μνήμης, μπορείτε να εκτελέσετε δέκα pods, αφήνοντας κάθε κόμβο με 0,25 GB αχρησιμοποίητη μνήμη.

Αυτό σημαίνει ότι το 25% της μνήμης ολόκληρου του συμπλέγματος χάνεται.

Σε έναν μεγάλο κόμβο με μνήμη 10 GB, μπορείτε να εκτελέσετε 13 από αυτές τις μονάδες - και θα υπάρχει μόνο ένα αχρησιμοποίητο τμήμα των 0,25 GB.

Σε αυτή την περίπτωση, μόνο το 2,5% της μνήμης χάνεται.

Έτσι, οι πόροι χρησιμοποιούνται βέλτιστα σε μεγαλύτερους κόμβους.

Αρκετοί μεγάλοι κόμβοι ή πολλοί μικροί;

Λοιπόν, ποιο είναι καλύτερο: μερικοί μεγάλοι κόμβοι σε ένα σύμπλεγμα ή πολλοί μικροί; Όπως πάντα, δεν υπάρχει ξεκάθαρη απάντηση. Πολλά εξαρτώνται από τον τύπο της εφαρμογής.

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

Σε ενδιάμεσες καταστάσεις, κάντε μια επιλογή με βάση τα πλεονεκτήματα και τα μειονεκτήματα κάθε επιλογής. Ίσως κάποια επιχειρήματα είναι πιο σχετικά με την κατάστασή σας από άλλα.

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

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

Μετάφραση που ετοιμάστηκε από την ομάδα της πλατφόρμας cloud Mail.ru Cloud Solutions.

Περισσότερα για το Kubernetes: 25 Χρήσιμα εργαλεία για τη διαχείριση και την ανάπτυξη συμπλεγμάτων.

Πηγή: www.habr.com

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