Παρουσιάζουμε το Kubernetes CCM (Cloud Controller Manager) για το Yandex.Cloud

Παρουσιάζουμε το Kubernetes CCM (Cloud Controller Manager) για το Yandex.Cloud

Σε συνέχεια των πρόσφατων Έκδοση προγράμματος οδήγησης CSI για το Yandex.Cloud δημοσιεύουμε ένα άλλο έργο ανοιχτού κώδικα για αυτό το cloud - Cloud Controller Manager. Το CCM απαιτείται όχι μόνο για το σύμπλεγμα ως σύνολο, αλλά και για το ίδιο το πρόγραμμα οδήγησης CSI. Λεπτομέρειες σχετικά με τον σκοπό του και ορισμένα χαρακτηριστικά υλοποίησης είναι υπό περικοπή.

Εισαγωγή

Γιατί είναι αυτό?

Τα κίνητρα που μας ώθησαν να αναπτύξουμε το CCM για το Yandex.Cloud συμπίπτουν πλήρως με αυτά που έχουν ήδη περιγραφεί στο ανακοίνωση Προγράμματα οδήγησης CSI. Διατηρούμε πολλά συμπλέγματα Kubernetes από διαφορετικούς παρόχους cloud, για τα οποία χρησιμοποιούμε ένα μόνο εργαλείο. Εφαρμόζει πολλές ανέσεις «παρακάμπτοντας» τις διαχειριζόμενες λύσεις αυτών των παρόχων. Ναι, έχουμε μια μάλλον συγκεκριμένη περίπτωση και ανάγκες, αλλά οι εξελίξεις που δημιουργούνται εξαιτίας τους μπορεί να είναι χρήσιμες σε άλλους χρήστες.

Τι ακριβώς είναι το CCM;

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

Συγκεκριμένα, το Cloud Controller Manager παρέχει πέντε κύριους τύπους αλληλεπίδρασης:

  1. Περιπτώσεις – υλοποιεί μια σχέση 1:1 μεταξύ ενός αντικειμένου κόμβου στο Kubernetes (Node) και μια εικονική μηχανή στον πάροχο cloud. Για αυτό εμείς:
    • συμπληρώστε το πεδίο spec.providerID στο αντικείμενο Node. Για παράδειγμα, για το OpenStack CCM αυτό το πεδίο έχει την ακόλουθη μορφή: openstack:///d58a78bf-21b0-4682-9dc6-2132406d2bb0. Μπορείτε να δείτε το όνομα του παρόχου cloud και το μοναδικό UUID του διακομιστή (εικονική μηχανή στο OpenStack) του αντικειμένου.
    • συμπλήρωμα nodeInfo στο αντικείμενο Node πληροφορίες για την εικονική μηχανή. Για παράδειγμα, καθορίζουμε τον τύπο παρουσίας στο AWS.
    • Ελέγχουμε την παρουσία εικονικής μηχανής στο cloud. Για παράδειγμα, εάν ένα αντικείμενο Node πήγε σε κατάσταση NotReady, μπορείτε να ελέγξετε εάν η εικονική μηχανή υπάρχει καθόλου στον πάροχο cloud από providerID. Εάν δεν υπάρχει, διαγράψτε το αντικείμενο Node, το οποίο διαφορετικά θα παρέμενε στο σύμπλεγμα για πάντα.
  2. Ζώνες – ορίζει τον τομέα αποτυχίας για το αντικείμενο Node, έτσι ώστε ο προγραμματιστής να μπορεί να επιλέξει έναν κόμβο για το Pod σύμφωνα με τις περιοχές και τις ζώνες στον πάροχο cloud.
  3. LoadBalancer – όταν δημιουργείτε ένα αντικείμενο Service με τύπο LoadBalancer δημιουργεί ένα είδος εξισορροπητή που θα κατευθύνει την κίνηση από έξω προς τους κόμβους συμπλέγματος. Για παράδειγμα, στο Yandex.Cloud μπορείτε να χρησιμοποιήσετε NetworkLoadBalancer и TargetGroup για τους σκοπούς αυτούς·
  4. Διαδρομή – δημιουργεί ένα δίκτυο μεταξύ κόμβων, επειδή Σύμφωνα με τις απαιτήσεις του Kubernetes, κάθε pod πρέπει να έχει τη δική του διεύθυνση IP και να μπορεί να φτάσει σε οποιοδήποτε άλλο pod. Για τους σκοπούς αυτούς, μπορείτε να χρησιμοποιήσετε ένα δίκτυο επικάλυψης (VXLAN, GENEVE) ή να ορίσετε έναν πίνακα δρομολόγησης απευθείας στο εικονικό δίκτυο του παρόχου cloud:

    Παρουσιάζουμε το Kubernetes CCM (Cloud Controller Manager) για το Yandex.Cloud

  5. Τόμος – Επιτρέπει τη δυναμική παραγγελία Φ/Β με χρήση PVC και SC. Αρχικά, αυτή η λειτουργικότητα ήταν μέρος του CCM, αλλά λόγω της μεγάλης πολυπλοκότητάς της μεταφέρθηκε σε ένα ξεχωριστό έργο, το Container Storage Interface (CSI). Έχουμε μιλήσει για το CSI περισσότερες από μία φορές писали και, όπως ήδη αναφέρθηκε, ακόμη κυκλοφόρησε Πρόγραμμα οδήγησης CSI.

Προηγουμένως, όλος ο κώδικας που αλληλεπιδρά με το σύννεφο βρισκόταν στο κύριο αποθετήριο Git του έργου Kubernetes στο k8s.io/kubernetes/pkg/cloudprovider/providers, αλλά αποφάσισαν να το εγκαταλείψουν λόγω της ταλαιπωρίας της εργασίας με μια μεγάλη βάση κώδικα. Όλες οι παλιές υλοποιήσεις έχουν μεταφερθεί στο ξεχωριστό αποθετήριο. Για τη διευκόλυνση της περαιτέρω υποστήριξης και ανάπτυξης, όλα τα κοινά στοιχεία μεταφέρθηκαν επίσης στο ξεχωριστό αποθετήριο.

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

Για να γράψετε τη δική σας υλοποίηση του CCM, αρκεί να εφαρμόσετε απαιτούμενες διεπαφές Go.

И αυτό έχουμε.

Реализация

Πώς καταλήξατε σε αυτό

Ξεκινήσαμε την ανάπτυξη (ή μάλλον, ακόμη και τη χρήση) με έτοιμο(!) CCM για το Yandex.Cloud πριν από ένα χρόνο.

Ωστόσο, σε αυτήν την υλοποίηση μας έλειπαν:

  • έλεγχος ταυτότητας μέσω διακριτικού JWT IAM.
  • Υποστήριξη ελεγκτή σέρβις.

Σε συμφωνία με τον συγγραφέα (δλίσιν) στο Telegram, διαχωρίσαμε το yandex-cloud-controller-manager και προσθέσαμε τις λειτουργίες που λείπουν.

Βασικά χαρακτηριστικά

Επί του παρόντος, το CCM υποστηρίζει τις ακόλουθες διεπαφές:

  • Περιπτώσεις;
  • Ζώνες;
  • LoadBalancer.

Στο μέλλον, όταν το Yandex.Cloud αρχίσει να λειτουργεί με προηγμένες δυνατότητες VPC, θα προσθέσουμε μια διεπαφή διαδρομές.

LoadBalanacer ως κύρια πρόκληση

Αρχικά, προσπαθήσαμε, όπως και άλλες υλοποιήσεις CCM, να δημιουργήσουμε ένα ζευγάρι LoadBalancer и TargetGroup για κάθε Service με τύπο LoadBalancer. Ωστόσο, το Yandex.Cloud ανακάλυψε έναν ενδιαφέροντα περιορισμό: δεν μπορείτε να χρησιμοποιήσετε TargetGroups με διασταυρούμενη Targets (ζεύγος SubnetID - IpAddress).

Παρουσιάζουμε το Kubernetes CCM (Cloud Controller Manager) για το Yandex.Cloud

Επομένως, μέσα στο δημιουργημένο CCM, εκκινείται ένας ελεγκτής, ο οποίος, όταν αλλάζουν αντικείμενα Node συλλέγει πληροφορίες για όλες τις διεπαφές σε κάθε εικονική μηχανή, τις ομαδοποιεί ανάλογα με το αν ανήκουν σε ορισμένες NetworkID, δημιουργεί από TargetGroup επί NetworkIDκαι παρακολουθεί επίσης τη συνάφεια. Στη συνέχεια, κατά τη δημιουργία ενός αντικειμένου Service με τύπο LoadBalanacer απλά επισυνάπτουμε ένα προ-δημιουργημένο TargetGroup σε καινουρια NetworkLoadBalanacer'είμαι.

Πώς να αρχίσετε να το χρησιμοποιείτε;

Το CCM υποστηρίζει Kubernetes έκδοση 1.15 και νεότερη. Σε ένα σύμπλεγμα, για να λειτουργήσει, απαιτείται η σημαία --cloud-provider=external ορίστηκε σε true για kube-apiserver, kube-controller-manager, kube-scheduler και όλα τα kubelets.

Όλα τα απαραίτητα βήματα για την ίδια την εγκατάσταση περιγράφονται στο README. Η εγκατάσταση καταλήγει στη δημιουργία αντικειμένων στο Kubernetes από manifests.

Για να χρησιμοποιήσετε το CCM θα χρειαστείτε επίσης:

  • προσδιορίζω στο μανιφέστο το αναγνωριστικό καταλόγου (folder-id) Yandex.Cloud;
  • λογαριασμό υπηρεσίας για αλληλεπίδραση με το Yandex.Cloud API. Στο μανιφέστο Secret Απαιτείται μεταφορά εξουσιοδοτημένων κλειδιών από τον λογαριασμό υπηρεσίας. Στην τεκμηρίωση περιγράφεται, πώς να δημιουργήσετε έναν λογαριασμό υπηρεσίας και να λάβετε κλειδιά.

Θα χαρούμε να λάβουμε τα σχόλιά σας και νέα θέματααν αντιμετωπίσετε κάποιο πρόβλημα!

Αποτελέσματα της

Χρησιμοποιούμε το υλοποιημένο CCM σε πέντε συμπλέγματα Kubernetes τις τελευταίες δύο εβδομάδες και σχεδιάζουμε να επεκτείνουμε τον αριθμό τους σε 20 τον επόμενο μήνα. Προς το παρόν, δεν συνιστούμε τη χρήση CCM για μεγάλες και κρίσιμες εγκαταστάσεις K8.

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

PS

Διαβάστε επίσης στο blog μας:

Πηγή: www.habr.com

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