Αποθήκευση δεδομένων σε ένα σύμπλεγμα Kubernetes

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

Αποθήκευση δεδομένων σε ένα σύμπλεγμα Kubernetes

Μέθοδος 1: Καθορίστε PV στο μανιφέστο pod

Ένα τυπικό μανιφέστο που περιγράφει ένα λοβό σε ένα σύμπλεγμα Kubernetes:

Αποθήκευση δεδομένων σε ένα σύμπλεγμα Kubernetes

Τα μέρη του μανιφέστου που περιγράφουν ποιος τόμος είναι συνδεδεμένος και πού επισημαίνονται έγχρωμα.

Στο τμήμα VolumeMounts υποδείξτε τα σημεία προσάρτησης (mountPath) - σε ποιον κατάλογο μέσα στο κοντέινερ θα τοποθετηθεί ο μόνιμος τόμος, καθώς και το όνομα του τόμου.

Στο τμήμα x παραθέτει όλους τους τόμους που χρησιμοποιούνται στο pod. Καθορίστε το όνομα κάθε τόμου, καθώς και τον τύπο (στην περίπτωσή μας: awsElasticBlockStore) και τις παραμέτρους σύνδεσης. Ποιες παράμετροι παρατίθενται στο μανιφέστο εξαρτάται από τον τύπο του τόμου.

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

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

Υπάρχουν πολλά προβλήματα κατά τη χρήση του:

  1. Όλοι οι τόμοι πρέπει να δημιουργηθούν χειροκίνητα, το Kubernetes δεν μπορεί να δημιουργήσει τίποτα για εμάς.
  2. Οι παράμετροι πρόσβασης για κάθε τόμο είναι μοναδικές και πρέπει να προσδιορίζονται στα μανιφέστα όλων των ομάδων που χρησιμοποιούν τον τόμο.
  3. για να αλλάξετε το σύστημα αποθήκευσης (για παράδειγμα, να μετακινηθείτε από το AWS στο Google Cloud), πρέπει να αλλάξετε τις ρυθμίσεις και τον τύπο των μονταρισμένων τόμων σε όλα τα μανιφέστα.

Όλα αυτά είναι πολύ άβολα, επομένως στην πραγματικότητα αυτή η μέθοδος χρησιμοποιείται για τη σύνδεση μόνο ορισμένων ειδικών τύπων τόμων: configMap, secret, whiteDir, hostPath:

  • Το configMap και το secret είναι τόμοι υπηρεσιών που σας επιτρέπουν να δημιουργήσετε έναν τόμο με αρχεία από εκδηλώσεις Kubernetes στο κοντέινερ.

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

  • hostPath - σας επιτρέπει να προσαρτήσετε οποιονδήποτε κατάλογο στον τοπικό δίσκο του διακομιστή στον οποίο εκτελείται η εφαρμογή μέσα στο κοντέινερ με την εφαρμογή, συμπεριλαμβανομένου του /etc/kubernetes. Αυτό είναι ένα μη ασφαλές χαρακτηριστικό, επομένως οι πολιτικές ασφαλείας συνήθως απαγορεύουν τη χρήση τόμων αυτού του τύπου. Διαφορετικά, η εφαρμογή ενός εισβολέα θα μπορεί να προσαρτήσει τον κατάλογο HTC Kubernetes μέσα στο κοντέινερ του και να κλέψει όλα τα πιστοποιητικά συμπλέγματος. Συνήθως, οι τόμοι hostPath επιτρέπεται να χρησιμοποιούνται μόνο από εφαρμογές συστήματος που εκτελούνται στον χώρο ονομάτων του συστήματος kube.

Συστήματα αποθήκευσης με τα οποία λειτουργεί η Kubernetes εκτός συσκευασίας δίνονται στην τεκμηρίωση.

Μέθοδος 2. Σύνδεση σε εστίες SC/PVC/PV

Μια εναλλακτική μέθοδος σύνδεσης είναι η έννοια της κλάσης αποθήκευσης, PersistentVolumeClaim, PersistentVolume.

Κατηγορία αποθήκευσης αποθηκεύει τις παραμέτρους σύνδεσης στο σύστημα αποθήκευσης δεδομένων.

PersistentVolumeClaim περιγράφει τις απαιτήσεις για το τι χρειάζεται η εφαρμογή.
PersistentVolume αποθηκεύει τις παραμέτρους πρόσβασης και την κατάσταση του όγκου.

Η ουσία της ιδέας: στο μανιφέστο pod υποδεικνύουν έναν τόμο τύπου PersistentVolumeClaim και υποδεικνύουν το όνομα αυτής της οντότητας στην παράμετρο requestName.

Αποθήκευση δεδομένων σε ένα σύμπλεγμα Kubernetes

Η δήλωση PersistentVolumeClaim περιγράφει τις απαιτήσεις για τον όγκο δεδομένων που απαιτεί η εφαρμογή. Συμπεριλαμβανομένου:

  • Μέγεθος δίσκου?
  • μέθοδος πρόσβασης: ReadWriteOnce ή ReadWriteMany.
  • σύνδεσμος στην κλάση αποθήκευσης - σε ποιο σύστημα αποθήκευσης δεδομένων θέλουμε να δημιουργήσουμε τον τόμο.

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

Οι εκδηλώσεις PersistentVolume υποδεικνύουν την κλάση αποθήκευσης και τις παραμέτρους πρόσβασης για έναν συγκεκριμένο τόμο (αναγνωριστικό τόμου, διαδρομή κ.λπ.).

Κατά τη δημιουργία ενός PVC, το Kubernetes εξετάζει ποιο μέγεθος όγκου και ποια κατηγορία αποθήκευσης απαιτείται και επιλέγει ένα δωρεάν PersistentVolume.

Εάν τέτοια Φ/Β δεν είναι διαθέσιμα, η Kubernetes μπορεί να ξεκινήσει ένα ειδικό πρόγραμμα - Προμηθευτής (το όνομά του υποδεικνύεται στην κατηγορία Αποθήκευση). Αυτό το πρόγραμμα συνδέεται με το σύστημα αποθήκευσης, δημιουργεί έναν τόμο του απαιτούμενου μεγέθους, λαμβάνει ένα αναγνωριστικό και δημιουργεί ένα μανιφέστο PersistentVolume στο σύμπλεγμα Kubernetes, το οποίο συσχετίζεται με το PersistentVolumeClaim.

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

Όλες οι παράμετροι για τη σύνδεση στο σύστημα αποθήκευσης δεδομένων βρίσκονται στην κλάση Storage, για την οποία είναι υπεύθυνοι οι διαχειριστές συμπλέγματος. Το μόνο που χρειάζεται να κάνετε όταν μετακινείστε από το AWS στο Google Cloud είναι να αλλάξετε το όνομα της κλάσης αποθήκευσης σε PVC στις δηλώσεις εφαρμογής. Το Persistance Volume για αποθήκευση δεδομένων θα δημιουργηθεί στο σύμπλεγμα αυτόματα χρησιμοποιώντας το πρόγραμμα Provisioner.

Μέθοδος 3: Διεπαφή αποθήκευσης δοχείων

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

Για να λύσουν το πρόβλημα, προγραμματιστές από τις Cloud Foundry, Kubernetes, Mesos και Docker δημιούργησαν τη διεπαφή αποθήκευσης κοντέινερ (CSI) - μια απλή ενοποιημένη διεπαφή που περιγράφει την αλληλεπίδραση του συστήματος διαχείρισης κοντέινερ και ένα ειδικό πρόγραμμα οδήγησης (CSI Driver) που λειτουργεί με ένα συγκεκριμένο σύστημα αποθήκευσης. Όλος ο κώδικας για αλληλεπίδραση με συστήματα αποθήκευσης μετακινήθηκε από τον πυρήνα του Kubernetes σε ένα ξεχωριστό σύστημα.

Τεκμηρίωση διεπαφής αποθήκευσης κοντέινερ.

Συνήθως, το πρόγραμμα οδήγησης CSI αποτελείται από δύο στοιχεία: την προσθήκη Node και την προσθήκη Controller.

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

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

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

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

Όταν εργάζεστε με το Ceph, η προσθήκη CSI παρέχει περισσότερες επιλογές για εργασία με συστήματα αποθήκευσης από τα ενσωματωμένα προγράμματα οδήγησης.

  1. Δημιουργία δυναμικού δίσκου. Συνήθως οι δίσκοι RBD χρησιμοποιούνται μόνο σε λειτουργία RWO, αλλά το CSI για το Ceph επιτρέπει τη χρήση τους σε λειτουργία RWX. Πολλά pods σε διαφορετικούς κόμβους μπορούν να προσαρτήσουν τον ίδιο δίσκο RDB στους κόμβους τους και να εργαστούν μαζί τους παράλληλα. Για να είμαστε δίκαιοι, δεν είναι όλα τόσο φωτεινά - αυτός ο δίσκος μπορεί να συνδεθεί μόνο ως συσκευή μπλοκ, πράγμα που σημαίνει ότι θα πρέπει να προσαρμόσετε την εφαρμογή για να λειτουργεί μαζί του σε λειτουργία πολλαπλής πρόσβασης.
  2. Δημιουργία στιγμιότυπων. Σε ένα σύμπλεγμα Kubernetes, μπορείτε να δημιουργήσετε ένα μανιφέστο με την απαίτηση να δημιουργήσετε ένα στιγμιότυπο. Το πρόσθετο CSI θα το δει και θα τραβήξει ένα στιγμιότυπο από το δίσκο. Με βάση αυτό, μπορείτε να δημιουργήσετε είτε ένα αντίγραφο ασφαλείας είτε ένα αντίγραφο του PersistentVolume.
  3. Αύξηση μεγέθους δίσκου για αποθήκευση και PersistentVolume σε ένα σύμπλεγμα Kubernetes.
  4. Ποσοστώσεις. Τα προγράμματα οδήγησης CephFS που είναι ενσωματωμένα στο Kubernetes δεν υποστηρίζουν ποσοστώσεις, αλλά τα νέα πρόσθετα CSI με το πιο πρόσφατο Ceph Nautilus μπορούν να ενεργοποιήσουν ποσοστώσεις σε κατατμήσεις CephFS.
  5. Μετρήσεις. Το πρόσθετο CSI μπορεί να παρέχει στον Prometheus μια ποικιλία μετρήσεων σχετικά με το ποιοι τόμοι είναι συνδεδεμένοι, ποιες επικοινωνίες πραγματοποιούνται κ.λπ.
  6. Με επίγνωση τοπολογίας. Σας επιτρέπει να καθορίσετε σε μανιφέστα τον τρόπο με τον οποίο το σύμπλεγμα κατανέμεται γεωγραφικά και να αποφύγετε τη σύνδεση ενός συστήματος αποθήκευσης που βρίσκεται στο Άμστερνταμ σε ομάδες που εκτελούνται στο Λονδίνο.

Πώς να συνδέσετε τον Ceph σε ένα σύμπλεγμα Kubernetes μέσω CSI, βλ στο πρακτικό μέρος της διάλεξης του απογευματινού σχολείου Slurm. Μπορείτε επίσης να εγγραφείτε σε Κεφάλαιο βίντεο μάθημα, που θα κυκλοφορήσει στις 15 Οκτωβρίου.

Συγγραφέας του άρθρου: Sergey Bondarev, εν ενεργεία αρχιτέκτονας στο Southbridge, Πιστοποιημένος Διαχειριστής Kubernetes, ένας από τους προγραμματιστές του kubespray.

Ένα μικρό Post Scriptum όχι για διαφήμιση, αλλά για όφελος...

Υ.Γ. Ο Sergey Bondarev οδηγεί δύο εντατικά μαθήματα: ενημερωμένο Βάση Kubernetes 28-30 Σεπτεμβρίου και προχωρημένοι Kubernetes Mega 14–16 Οκτωβρίου.

Αποθήκευση δεδομένων σε ένα σύμπλεγμα Kubernetes

Πηγή: www.habr.com

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