Εφήμεροι όγκοι με παρακολούθηση χωρητικότητας αποθήκευσης: EmptyDir σε στεροειδή

Εφήμεροι όγκοι με παρακολούθηση χωρητικότητας αποθήκευσης: EmptyDir σε στεροειδή

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

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

Το Kubernetes έχει ήδη αρκετούς τύπους εφήμερους όγκους, αλλά η λειτουργικότητά τους περιορίζεται σε αυτό που υλοποιείται στα K8.

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

Αυτό μπορεί να είναι πρόβλημα για τόμους που καταναλώνουν σημαντικούς πόρους κεντρικού υπολογιστή ή για χώρο αποθήκευσης που είναι διαθέσιμος μόνο σε ορισμένους κεντρικούς υπολογιστές. Αυτός είναι ο λόγος για τον οποίο το Kubernetes 1.19 εισάγει δύο νέες λειτουργίες τόμου δοκιμών άλφα που είναι εννοιολογικά παρόμοιες με τους τόμους EmptyDir:

  • εφήμεροι όγκοι γενικής χρήσης.

  • Παρακολούθηση χωρητικότητας αποθήκευσης CSI.

Πλεονεκτήματα της νέας προσέγγισης:

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

  • Οι τόμοι μπορεί να έχουν καθορισμένο μέγεθος που δεν μπορεί να ξεπεραστεί από την εφαρμογή.

  • συνεργάζεται με οποιαδήποτε προγράμματα οδήγησης CSI που υποστηρίζουν την παροχή μόνιμων τόμων και (για την υποστήριξη της παρακολούθησης χωρητικότητας) υλοποιούν την κλήση GetCapacity;

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

  • υποστηρίζονται όλες οι τυπικές λειτουργίες με τόμο (δημιουργία στιγμιότυπου, αλλαγή μεγέθους κ.λπ.).

  • Οι τόμοι μπορούν να χρησιμοποιηθούν με οποιονδήποτε ελεγκτή εφαρμογών που δέχεται μια ενότητα ή προδιαγραφή τόμου.

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

Επιλογές εφαρμογής

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

Μόνιμη μνήμη ως αντικατάσταση της μνήμης RAM για memcached

Τελευταίες εκδόσεις του memcached προστέθηκε υποστήριξη χρησιμοποιώντας μόνιμη μνήμη (Intel Optane, κ.λπ., περίπου. μεταφράστης) αντί για κανονική μνήμη RAM. Κατά την ανάπτυξη του memcached μέσω ενός ελεγκτή εφαρμογής, μπορείτε να χρησιμοποιήσετε εφήμερους τόμους γενικής χρήσης για να ζητήσετε να εκχωρηθεί ένας τόμος δεδομένου μεγέθους από το PMEM χρησιμοποιώντας το πρόγραμμα οδήγησης CSI, για παράδειγμα PMEM-CSI.

Τοπικός χώρος αποθήκευσης LVM ως χώρος εργασίας

Οι εφαρμογές που λειτουργούν με δεδομένα που είναι μεγαλύτερα από τη μνήμη RAM ενδέχεται να απαιτούν τοπική αποθήκευση με μετρήσεις μεγέθους ή απόδοσης που δεν μπορούν να παρέχουν οι κανονικοί τόμοι EmptyDir από την Kubernetes. Για παράδειγμα, για το σκοπό αυτό γράφτηκε TopoLVM.

Πρόσβαση μόνο για ανάγνωση για όγκους δεδομένων

Η κατανομή ενός τόμου μπορεί να οδηγήσει στη δημιουργία ενός πλήρους τόμου όταν:

Αυτοί οι τόμοι μπορούν να τοποθετηθούν σε λειτουργία μόνο για ανάγνωση.

Πώς λειτουργεί;

Εφήμεροι τόμοι γενικού σκοπού

Ένα βασικό χαρακτηριστικό των εφήμερων τόμων γενικής χρήσης είναι η νέα πηγή τόμου, EphemeralVolumeSource, που περιέχει όλα τα πεδία για τη δημιουργία ενός αιτήματος τόμου (ιστορικά ονομάζεται αίτημα επίμονου τόμου, PVC). Νέο χειριστήριο μέσα kube-controller-manager κοιτάζει τους λοβούς που δημιουργούν μια τέτοια πηγή όγκου και, στη συνέχεια, δημιουργεί ένα PVC για αυτούς τους λοβούς. Για το πρόγραμμα οδήγησης CSI, αυτό το αίτημα μοιάζει με τα άλλα, επομένως δεν χρειάζεται ειδική υποστήριξη εδώ.

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

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

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

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

Παρακολούθηση χωρητικότητας αποθήκευσης

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

νέος API CSIStorageCapacity, που βρίσκεται στο στάδιο άλφα, επιτρέπει την αποθήκευση των απαραίτητων δεδομένων σε etcd ώστε να είναι διαθέσιμα στον προγραμματιστή. Σε αντίθεση με την υποστήριξη για εφήμερους τόμους γενικής χρήσης, όταν αναπτύσσετε το πρόγραμμα οδήγησης, πρέπει να ενεργοποιήσετε την παρακολούθηση χωρητικότητας αποθήκευσης: external-provisioner θα πρέπει να δημοσιεύει τις πληροφορίες χωρητικότητας που λαμβάνονται από τον οδηγό μέσω κανονικού GetCapacity.

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

Ως συνήθως, οι αμέσως συνδεδεμένοι τόμοι δημιουργούνται πριν προγραμματιστούν τα pod και η τοποθέτησή τους επιλέγεται από το πρόγραμμα οδήγησης αποθήκευσης, επομένως κατά τη διαμόρφωση external-provisioner Από προεπιλογή, οι κλάσεις αποθήκευσης με άμεση δέσμευση παραλείπονται, καθώς αυτά τα δεδομένα δεν θα χρησιμοποιηθούν ούτως ή άλλως.

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

Σημείωση Μπορείτε να λάβετε πιο λεπτομερείς πληροφορίες, καθώς και με ασφάλεια «εξάσκηση στο περίπτερο για γάτες» και σε περίπτωση εντελώς ακατανόητης κατάστασης, λάβετε εξειδικευμένη τεχνική υποστήριξη σε εντατικά μαθήματα - Βάση Kubernetes θα πραγματοποιηθεί στις 28-30 Σεπτεμβρίου και για πιο προχωρημένους ειδικούς Kubernetes Mega 14–16 Οκτωβρίου.

Ασφάλεια

CSIStorageCapacity

Τα αντικείμενα CSIStorageCapacity βρίσκονται σε χώρους ονομάτων· κατά την ανάπτυξη κάθε προγράμματος οδήγησης CSI στον δικό του χώρο ονομάτων, συνιστάται ο περιορισμός των δικαιωμάτων RBAC στο CSIStorageCapacity σε αυτόν τον χώρο, καθώς είναι προφανές από πού προέρχονται τα δεδομένα. Το Kubernetes δεν το ελέγχει ούτως ή άλλως, και συνήθως τα προγράμματα οδήγησης τοποθετούνται στον ίδιο χώρο ονομάτων, οπότε τελικά τα προγράμματα οδήγησης αναμένεται να λειτουργούν και να μην δημοσιεύουν εσφαλμένα δεδομένα (και εδώ απέτυχε η κάρτα μου, περίπου. μεταφραστής βασισμένος σε ένα γενειοφόρο αστείο)

Εφήμεροι τόμοι γενικού σκοπού

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

Παράδειγμα

Ξεχωριστός υποκατάστημα Το PMEM-CSI περιέχει όλες τις απαραίτητες αλλαγές για την εκτέλεση ενός συμπλέγματος Kubernetes 1.19 μέσα σε εικονικές μηχανές QEMU με όλες τις δυνατότητες στο στάδιο άλφα. Ο κωδικός προγράμματος οδήγησης δεν έχει αλλάξει, έχει αλλάξει μόνο η ανάπτυξη.

Σε ένα κατάλληλο μηχάνημα (Linux, ένας κανονικός χρήστης μπορεί να χρησιμοποιήσει Λιμενεργάτης, Κοίτα εδώ λεπτομέρειες) αυτές οι εντολές θα εμφανίσουν το σύμπλεγμα και θα εγκαταστήσουν το πρόγραμμα οδήγησης PMEM-CSI:

git clone --branch=kubernetes-1-19-blog-post https://github.com/intel/pmem-csi.git
cd pmem-csi
export TEST_KUBERNETES_VERSION=1.19 TEST_FEATURE_GATES=CSIStorageCapacity=true,GenericEphemeralVolume=true TEST_PMEM_REGISTRY=intel
make start && echo && test/setup-deployment.sh

Αφού λειτουργήσουν όλα, η έξοδος θα περιέχει οδηγίες χρήσης:

The test cluster is ready. Log in with [...]/pmem-csi/_work/pmem-govm/ssh.0, run
kubectl once logged in.  Alternatively, use kubectl directly with the
following env variable:
   KUBECONFIG=[...]/pmem-csi/_work/pmem-govm/kube.config

secret/pmem-csi-registry-secrets created
secret/pmem-csi-node-secrets created
serviceaccount/pmem-csi-controller created
...
To try out the pmem-csi driver ephemeral volumes:
   cat deploy/kubernetes-1.19/pmem-app-ephemeral.yaml |
   [...]/pmem-csi/_work/pmem-govm/ssh.0 kubectl create -f -

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

$ kubectl get 
        -o go-template='{{range .items}}{{if eq .storageClassName "pmem-csi-sc-late-binding"}}{{.metadata.name}} {{.nodeTopology.matchLabels}} {{.capacity}}
{{end}}{{end}}' 
        csistoragecapacities
csisc-2js6n map[pmem-csi.intel.com/node:pmem-csi-pmem-govm-worker2] 30716Mi
csisc-sqdnt map[pmem-csi.intel.com/node:pmem-csi-pmem-govm-worker1] 30716Mi
csisc-ws4bv map[pmem-csi.intel.com/node:pmem-csi-pmem-govm-worker3] 30716Mi

Ένα μεμονωμένο αντικείμενο έχει το ακόλουθο περιεχόμενο:

$ kubectl describe csistoragecapacities/csisc-6cw8j
Name:         csisc-sqdnt
Namespace:    default
Labels:       <none>
Annotations:  <none>
API Version:  storage.k8s.io/v1alpha1
Capacity:     30716Mi
Kind:         CSIStorageCapacity
Metadata:
  Creation Timestamp:  2020-08-11T15:41:03Z
  Generate Name:       csisc-
  Managed Fields:
    ...
  Owner References:
    API Version:     apps/v1
    Controller:      true
    Kind:            StatefulSet
    Name:            pmem-csi-controller
    UID:             590237f9-1eb4-4208-b37b-5f7eab4597d1
  Resource Version:  2994
  Self Link:         /apis/storage.k8s.io/v1alpha1/namespaces/default/csistoragecapacities/csisc-sqdnt
  UID:               da36215b-3b9d-404a-a4c7-3f1c3502ab13
Node Topology:
  Match Labels:
    pmem-csi.intel.com/node:  pmem-csi-pmem-govm-worker1
Storage Class Name:           pmem-csi-sc-late-binding
Events:                       <none>

Ας προσπαθήσουμε να δημιουργήσουμε μια εφαρμογή επίδειξης με έναν ενιαίο εφήμερο τόμο γενικής χρήσης. Περιεχόμενα αρχείου pmem-app-ephemeral.yaml:

# This example Pod definition demonstrates
# how to use generic ephemeral inline volumes
# with a PMEM-CSI storage class.
kind: Pod
apiVersion: v1
metadata:
  name: my-csi-app-inline-volume
spec:
  containers:
    - name: my-frontend
      image: intel/pmem-csi-driver-test:v0.7.14
      command: [ "sleep", "100000" ]
      volumeMounts:
      - mountPath: "/data"
        name: my-csi-volume
  volumes:
  - name: my-csi-volume
    ephemeral:
      volumeClaimTemplate:
        spec:
          accessModes:
          - ReadWriteOnce
          resources:
            requests:
              storage: 4Gi
          storageClassName: pmem-csi-sc-late-binding

Μετά τη δημιουργία, όπως φαίνεται στις παραπάνω οδηγίες, έχουμε τώρα ένα επιπλέον λοβό και PVC:

$ kubectl get pods/my-csi-app-inline-volume -o wide
NAME                       READY   STATUS    RESTARTS   AGE     IP          NODE                         NOMINATED NODE   READINESS GATES
my-csi-app-inline-volume   1/1     Running   0          6m58s   10.36.0.2   pmem-csi-pmem-govm-worker1   <none>           <none>
$ kubectl get pvc/my-csi-app-inline-volume-my-csi-volume
NAME                                     STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS               AGE
my-csi-app-inline-volume-my-csi-volume   Bound    pvc-c11eb7ab-a4fa-46fe-b515-b366be908823   4Gi        RWO            pmem-csi-sc-late-binding   9m21s

Ιδιοκτήτης PVC - κάτω από:

$ kubectl get -o yaml pvc/my-csi-app-inline-volume-my-csi-volume
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  annotations:
    pv.kubernetes.io/bind-completed: "yes"
    pv.kubernetes.io/bound-by-controller: "yes"
    volume.beta.kubernetes.io/storage-provisioner: pmem-csi.intel.com
    volume.kubernetes.io/selected-node: pmem-csi-pmem-govm-worker1
  creationTimestamp: "2020-08-11T15:44:57Z"
  finalizers:
  - kubernetes.io/pvc-protection
  managedFields:
    ...
  name: my-csi-app-inline-volume-my-csi-volume
  namespace: default
  ownerReferences:
  - apiVersion: v1
    blockOwnerDeletion: true
    controller: true
    kind: Pod
    name: my-csi-app-inline-volume
    uid: 75c925bf-ca8e-441a-ac67-f190b7a2265f
...

Αναμενόμενα ενημερωμένες πληροφορίες για pmem-csi-pmem-govm-worker1:

csisc-2js6n map[pmem-csi.intel.com/node:pmem-csi-pmem-govm-worker2] 30716Mi
csisc-sqdnt map[pmem-csi.intel.com/node:pmem-csi-pmem-govm-worker1] 26620Mi
csisc-ws4bv map[pmem-csi.intel.com/node:pmem-csi-pmem-govm-worker3] 30716Mi

Εάν μια άλλη εφαρμογή χρειάζεται περισσότερα από 26620 Mi, ο προγραμματιστής δεν θα λάβει υπόψη pmem-csi-pmem-govm-worker1 σε κάθε περίπτωση.

Ποιο είναι το επόμενο;

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

Πηγή: www.habr.com

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