Δημιουργία πλατφόρμας kubernetes στο Pinterest

Με τα χρόνια, οι 300 εκατομμύρια χρήστες του Pinterest έχουν δημιουργήσει περισσότερα από 200 δισεκατομμύρια pin σε περισσότερα από 4 δισεκατομμύρια πίνακες. Για να εξυπηρετήσει αυτόν τον στρατό χρηστών και την τεράστια βάση περιεχομένου, η πύλη έχει αναπτύξει χιλιάδες υπηρεσίες, που κυμαίνονται από μικροϋπηρεσίες που μπορούν να χειριστούν μερικές CPU έως γιγάντια μονόλιθους που τρέχουν σε έναν ολόκληρο στόλο εικονικών μηχανών. Και μετά ήρθε η στιγμή που το βλέμμα της παρέας έπεσε στα k8. Γιατί ο «κύβος» φαινόταν καλός στο Pinterest; Θα μάθετε για αυτό από τη μετάφραση ενός πρόσφατου άρθρου από blog Pinterest egeneering.

Δημιουργία πλατφόρμας kubernetes στο Pinterest

Έτσι, εκατοντάδες εκατομμύρια χρήστες και εκατοντάδες δισεκατομμύρια καρφίτσες. Για να εξυπηρετήσουμε αυτόν τον στρατό χρηστών και την τεράστια βάση περιεχομένου, έχουμε αναπτύξει χιλιάδες υπηρεσίες, που κυμαίνονται από μικροϋπηρεσίες που μπορούν να χειριστούν μερικές CPU έως γιγάντια μονόλιθους που τρέχουν σε ολόκληρους στόλους εικονικών μηχανών. Επιπλέον, έχουμε μια ποικιλία πλαισίων που μπορεί επίσης να απαιτούν πρόσβαση CPU, μνήμη ή I/O.

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

  • Δεν υπάρχει ενιαίος τρόπος για τους μηχανικούς να λειτουργούν ένα περιβάλλον παραγωγής. Οι υπηρεσίες ανιθαγενών, οι κρατικές υπηρεσίες και τα έργα υπό ενεργό ανάπτυξη βασίζονται σε εντελώς διαφορετικές στοίβες τεχνολογίας. Αυτό οδήγησε στη δημιουργία ενός ολόκληρου κύκλου μαθημάτων κατάρτισης για μηχανικούς, και επίσης περιπλέκει σοβαρά το έργο της ομάδας υποδομής μας.
  • Οι προγραμματιστές με το δικό τους στόλο εικονικών μηχανών δημιουργούν τεράστιο βάρος στους εσωτερικούς διαχειριστές. Ως αποτέλεσμα, τέτοιες απλές λειτουργίες όπως η ενημέρωση του λειτουργικού συστήματος ή του AMI διαρκούν εβδομάδες και μήνες. Αυτό οδηγεί σε αυξημένο φόρτο εργασίας σε φαινομενικά απολύτως καθημερινές καταστάσεις.
  • Δυσκολίες στη δημιουργία παγκόσμιων εργαλείων διαχείρισης υποδομής πέρα ​​από τις υπάρχουσες λύσεις. Η κατάσταση περιπλέκεται ακόμη περισσότερο από το γεγονός ότι η εύρεση των κατόχων εικονικών μηχανών δεν είναι εύκολη. Δηλαδή, δεν γνωρίζουμε αν αυτή η χωρητικότητα μπορεί να εξαχθεί με ασφάλεια για να λειτουργήσει σε άλλα μέρη της υποδομής μας.

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

Δημιουργία πλατφόρμας kubernetes στο Pinterest

Σχήμα 1: Προτεραιότητες υποδομής (αξιοπιστία, παραγωγικότητα προγραμματιστή και αποδοτικότητα).

Η ομάδα Cloud Management Platform στο Pinterest ανακάλυψε τα K8 το 2017. Μέχρι το πρώτο εξάμηνο του 2017, είχαμε τεκμηριώσει τις περισσότερες από τις παραγωγικές μας δυνατότητες, συμπεριλαμβανομένου του API και όλων των διακομιστών ιστού μας. Στη συνέχεια, πραγματοποιήσαμε μια διεξοδική αξιολόγηση διαφόρων συστημάτων για την ενορχήστρωση λύσεων κοντέινερ, τη δημιουργία συμπλεγμάτων και την εργασία με αυτά. Προς το τέλος του 2017, αποφασίσαμε να χρησιμοποιήσουμε το Kubernetes. Ήταν αρκετά ευέλικτο και υποστηρίχθηκε ευρέως στην κοινότητα προγραμματιστών.

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

Kubernetes: The Pinterest Way

Το ξεκίνημα με το Kubernetes στην κλίμακα του Pinterest ως μια πλατφόρμα που θα λατρέψουν οι μηχανικοί μας ήρθε με πολλές προκλήσεις.

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

Από την άλλη πλευρά, τα μοντέλα πρόβλεψης φορτίου στο ίδιο το Kubernetes (όπως οι αναπτύξεις, οι εργασίες και τα σύνολα Daemon) δεν είναι αρκετά για το έργο μας. Αυτά τα ζητήματα χρηστικότητας αποτελούν τεράστια εμπόδια για τη μετάβαση στο Kubernetes. Για παράδειγμα, έχουμε ακούσει προγραμματιστές υπηρεσιών να παραπονιούνται για έλλειψη ή εσφαλμένες ρυθμίσεις σύνδεσης. Αντιμετωπίσαμε επίσης λανθασμένη χρήση μηχανών προτύπων, όταν δημιουργήθηκαν εκατοντάδες αντίγραφα με την ίδια προδιαγραφή και εργασία, που οδήγησε σε εφιαλτικά προβλήματα εντοπισμού σφαλμάτων.

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

Ιδιότητες χρήστη και ελεγκτές του Pinterest

Για να διευκολύνουμε τους μηχανικούς μας να εφαρμόσουν το Kubernetes και να απλοποιήσουμε και να επιταχύνουμε την υποδομή μας, έχουμε αναπτύξει τους δικούς μας προσαρμοσμένους ορισμούς πόρων (CRD).

Τα CRD παρέχουν τις ακόλουθες λειτουργίες:

  1. Συνδυάζοντας διαφορετικούς εγγενείς πόρους Kubernetes έτσι ώστε να λειτουργούν ως ενιαίος φόρτος εργασίας. Για παράδειγμα, ο πόρος PinterestService περιλαμβάνει μια ανάπτυξη, μια υπηρεσία σύνδεσης και έναν χάρτη διαμόρφωσης. Αυτό επιτρέπει στους προγραμματιστές να μην ανησυχούν για τη ρύθμιση του DNS.
  2. Εφαρμόστε την απαραίτητη υποστήριξη εφαρμογών. Ο χρήστης πρέπει να επικεντρωθεί μόνο στις προδιαγραφές του κοντέινερ σύμφωνα με την επιχειρηματική του λογική, ενώ ο ελεγκτής CRD υλοποιεί όλα τα απαραίτητα init containers, τις μεταβλητές περιβάλλοντος και τις προδιαγραφές pod. Αυτό παρέχει ένα θεμελιωδώς διαφορετικό επίπεδο άνεσης για τους προγραμματιστές.
  3. Οι ελεγκτές CRD διαχειρίζονται επίσης τον κύκλο ζωής των εγγενών πόρων και βελτιώνουν τη διαθεσιμότητα εντοπισμού σφαλμάτων. Αυτό περιλαμβάνει τη συμφωνία των επιθυμητών και πραγματικών προδιαγραφών, την ενημέρωση της κατάστασης CRD και τη διατήρηση αρχείων καταγραφής συμβάντων και πολλά άλλα. Χωρίς CRD, οι προγραμματιστές θα αναγκάζονταν να διαχειρίζονται πολλαπλούς πόρους, κάτι που θα αύξανε μόνο την πιθανότητα λάθους.

Ακολουθεί ένα παράδειγμα PinterestService και ενός εσωτερικού πόρου που διαχειρίζεται ο ελεγκτής μας:

Δημιουργία πλατφόρμας kubernetes στο Pinterest

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

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

Ροή εργασιών ανάπτυξης εφαρμογής

Δημιουργία πλατφόρμας kubernetes στο Pinterest

Η παραπάνω εικόνα δείχνει πώς να αναπτύξετε έναν προσαρμοσμένο πόρο του Pinterest σε ένα σύμπλεγμα Kubernetes:

  1. Οι προγραμματιστές αλληλεπιδρούν με το σύμπλεγμα Kubernetes μέσω του CLI και της διεπαφής χρήστη.
  2. Τα εργαλεία CLI/UI ανακτούν τα αρχεία διαμόρφωσης ροής εργασιών YAML και άλλες ιδιότητες κατασκευής (ίδιο αναγνωριστικό έκδοσης) από το Artifactory και στη συνέχεια τα υποβάλλουν στην Υπηρεσία Υποβολής Εργασίας. Αυτό το βήμα διασφαλίζει ότι μόνο οι εκδόσεις παραγωγής παραδίδονται στο σύμπλεγμα.
  3. Το JSS είναι μια πύλη για διάφορες πλατφόρμες, συμπεριλαμβανομένου του Kubernetes. Εδώ γίνεται έλεγχος ταυτότητας του χρήστη, εκδίδονται ποσοστώσεις και ελέγχεται εν μέρει η διαμόρφωση του CRD μας.
  4. Μετά τον έλεγχο του CRD στην πλευρά JSS, οι πληροφορίες αποστέλλονται στο API της πλατφόρμας k8s.
  5. Ο ελεγκτής CRD παρακολουθεί συμβάντα σε όλους τους πόρους του χρήστη. Μετατρέπει τους CR σε εγγενείς πόρους k8s, προσθέτει τις απαραίτητες λειτουργικές μονάδες, ορίζει τις κατάλληλες μεταβλητές περιβάλλοντος και εκτελεί άλλες εργασίες υποστήριξης για να διασφαλίσει ότι οι εφαρμογές χρηστών σε κοντέινερ έχουν επαρκή υποστήριξη υποδομής.
  6. Στη συνέχεια, ο ελεγκτής CRD μεταβιβάζει τα λαμβανόμενα δεδομένα στο Kubernetes API, έτσι ώστε να μπορούν να υποβληθούν σε επεξεργασία από τον προγραμματιστή και να τεθούν σε παραγωγή.

Σημείωση: Αυτή η ροή εργασίας πριν από την κυκλοφορία της ανάπτυξης δημιουργήθηκε για τους πρώτους χρήστες της νέας πλατφόρμας k8s. Αυτήν τη στιγμή βρισκόμαστε στη διαδικασία βελτίωσης αυτής της διαδικασίας ώστε να ενσωματωθεί πλήρως στο νέο μας CI/CD. Αυτό σημαίνει ότι δεν μπορούμε να σας πούμε όλα όσα σχετίζονται με το Kubernetes. Ανυπομονούμε να μοιραστούμε την εμπειρία μας και την πρόοδο της ομάδας προς αυτή την κατεύθυνση στην επόμενη ανάρτησή μας στο blog, «Δημιουργία πλατφόρμας CI/CD για το Pinterest».

Τύποι ειδικών πόρων

Με βάση τις συγκεκριμένες ανάγκες του Pinterest, έχουμε αναπτύξει τα ακόλουθα CRD για να ταιριάζουν σε διαφορετικές ροές εργασίας:

  • Το PinterestService είναι υπηρεσίες ανιθαγενών που λειτουργούν εδώ και πολύ καιρό. Πολλά από τα βασικά μας συστήματα βασίζονται σε ένα σύνολο τέτοιων υπηρεσιών.
  • Το PinterestJobSet διαμορφώνει εργασίες παρτίδας πλήρους κύκλου. Ένα κοινό σενάριο στο Pinterest είναι ότι πολλές εργασίες εκτελούν τα ίδια κοντέινερ παράλληλα, ανεξάρτητα από άλλες παρόμοιες διαδικασίες.
  • Το PinterestCronJob χρησιμοποιείται ευρέως σε συνδυασμό με μικρά περιοδικά φορτία. Αυτό είναι ένα περιτύλιγμα για εγγενή εργασία cron με μηχανισμούς υποστήριξης Pinterest που είναι υπεύθυνοι για την ασφάλεια, την κυκλοφορία, τα αρχεία καταγραφής και τις μετρήσεις.
  • Το PinterestDaemon περιλαμβάνει υποδομές Daemons. Αυτή η οικογένεια συνεχίζει να μεγαλώνει καθώς προσθέτουμε περισσότερη υποστήριξη στα clusters μας.
  • Το PinterestTrainingJob επεκτείνεται στις διεργασίες Tensorflow και Pytorch, παρέχοντας το ίδιο επίπεδο υποστήριξης χρόνου εκτέλεσης με όλα τα άλλα CRD. Εφόσον το Pinterest χρησιμοποιεί ενεργά το Tensorflow και άλλα συστήματα μηχανικής μάθησης, είχαμε έναν λόγο να δημιουργήσουμε ένα ξεχωριστό CRD γύρω από αυτά.

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

Υποστήριξη χρόνου εκτέλεσης

Όταν ένα pod εφαρμογών εκτελείται στο Kubernetes, λαμβάνει αυτόματα ένα πιστοποιητικό για την αναγνώριση του εαυτού του. Αυτό το πιστοποιητικό χρησιμοποιείται για πρόσβαση σε μυστικό χώρο αποθήκευσης ή για επικοινωνία με άλλες υπηρεσίες μέσω mTLS. Εν τω μεταξύ, το Container Init Configurator και ο Daemon θα πραγματοποιήσουν λήψη όλων των απαραίτητων εξαρτήσεων πριν από την εκτέλεση της εφαρμογής που περιέχει κοντέινερ. Όταν όλα είναι έτοιμα, το πλευρικό αυτοκίνητο και ο Daemon θα καταχωρήσουν τη διεύθυνση IP της μονάδας στο Zookeeper μας, ώστε οι πελάτες να μπορούν να την ανακαλύψουν. Όλα αυτά θα λειτουργήσουν επειδή η λειτουργική μονάδα δικτύου διαμορφώθηκε πριν από την εκκίνηση της εφαρμογής.

Τα παραπάνω είναι τυπικά παραδείγματα υποστήριξης χρόνου εκτέλεσης για φόρτους εργασίας. Άλλοι τύποι φόρτου εργασίας μπορεί να απαιτούν ελαφρώς διαφορετική υποστήριξη, αλλά όλοι έχουν τη μορφή sidecars σε επίπεδο pod, σε επίπεδο κόμβου ή σε επίπεδο εικονικής μηχανής Daemons. Διασφαλίζουμε ότι όλα αυτά αναπτύσσονται εντός της υποδομής διαχείρισης και είναι συνεπή σε όλες τις εφαρμογές, γεγονός που τελικά μειώνει σημαντικά την επιβάρυνση όσον αφορά την τεχνική εργασία και την υποστήριξη πελατών.

Δοκιμές και QA

Κατασκευάσαμε έναν αγωγό δοκιμής από άκρο σε άκρο πάνω από την υπάρχουσα υποδομή δοκιμών Kubernetes. Αυτά τα τεστ ισχύουν για όλα τα cluster μας. Ο αγωγός μας πέρασε από πολλές αναθεωρήσεις προτού γίνει μέρος του συμπλέγματος προϊόντων.

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

Εναλλακτικές λύσεις

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

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

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

Επικείμενη εργασία

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

  • Μια συλλογή από συμπλέγματα κατανέμει μεγάλες εφαρμογές σε διαφορετικά cluster για επεκτασιμότητα και σταθερότητα.
  • Εξασφάλιση σταθερότητας συμπλέγματος, επεκτασιμότητας και ορατότητας για τη δημιουργία συνδεσιμότητας εφαρμογών και SLA.
  • Διαχείριση πόρων και ποσοστώσεων ώστε οι εφαρμογές να μην έρχονται σε σύγκρουση μεταξύ τους και η κλίμακα του συμπλέγματος να ελέγχεται από την πλευρά μας.
  • Μια νέα πλατφόρμα CI/CD για υποστήριξη και ανάπτυξη εφαρμογών στο Kubernetes.

Πηγή: www.habr.com

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