Kortstondige volumes met tracking van opslagcapaciteit: EmptyDir op steroïden

Kortstondige volumes met tracking van opslagcapaciteit: EmptyDir op steroïden

Sommige applicaties moeten ook gegevens opslaan, maar ze zijn er redelijk gerust in dat de gegevens na een herstart niet worden opgeslagen.

Cachingdiensten worden bijvoorbeeld beperkt door RAM, maar kunnen ook gegevens die zelden worden gebruikt verplaatsen naar opslag die langzamer is dan RAM, met weinig invloed op de algehele prestaties. Andere toepassingen moeten zich ervan bewust zijn dat er mogelijk alleen-lezen invoer in de bestanden aanwezig is, zoals instellingen of geheime sleutels.

Kubernetes kent al meerdere typen kortstondige volumes, maar hun functionaliteit is beperkt tot wat is geïmplementeerd in de K8s.

Vluchtig CSI-volumes stond toe dat Kubernetes werd uitgebreid met CSI-stuurprogramma's om ondersteuning te bieden voor lichtgewicht lokale volumes. Op deze manier is het mogelijk om te gebruiken willekeurige structuren: instellingen, geheimen, identificatiegegevens, variabelen, enzovoort. CSI-stuurprogramma's moeten worden aangepast om deze Kubernetes-functie te ondersteunen, omdat wordt aangenomen dat reguliere gestandaardiseerde stuurprogramma's niet zullen werken - maar er wordt aangenomen dat dergelijke volumes kunnen worden gebruikt op elk knooppunt dat voor de pod is geselecteerd.

Dit kan een probleem zijn voor volumes die aanzienlijke hostbronnen verbruiken of voor opslag die alleen op bepaalde hosts beschikbaar is. Daarom introduceert Kubernetes 1.19 twee nieuwe alfatestvolumefuncties die conceptueel vergelijkbaar zijn met EmptyDir-volumes:

  • tijdelijke volumes voor algemeen gebruik;

  • Volgen van CSI-opslagcapaciteit.

Voordelen van de nieuwe aanpak:

  • opslag kan lokaal zijn of verbonden via een netwerk;

  • volumes kunnen een gespecificeerde grootte hebben die niet door de applicatie kan worden overschreden;

  • werkt met alle CSI-stuurprogramma's die de inrichting van persistente volumes ondersteunen en (ter ondersteuning van het volgen van de capaciteit) de oproep implementeren GetCapacity;

  • volumes kunnen enkele initiële gegevens bevatten, afhankelijk van het stuurprogramma en de instellingen;

  • alle standaardbewerkingen met een volume (een momentopname maken, de grootte wijzigen, enz.) worden ondersteund;

  • volumes kunnen worden gebruikt met elke applicatiecontroller die een module- of volumespecificatie accepteert;

  • De Kubernetes-planner selecteert zelf geschikte knooppunten, zodat u niet langer planner-extensies hoeft in te richten en te configureren en webhooks te wijzigen.

Applicatie opties

Daarom zijn kortstondige volumes voor algemeen gebruik geschikt voor de volgende gebruiksscenario's:

Persistent geheugen als vervanging voor RAM voor memcached

Nieuwste releases van memcached extra ondersteuning met behulp van persistent geheugen (Intel Optane, enz., ca. vertaler) in plaats van gewoon RAM-geheugen. Wanneer u memcached implementeert via een applicatiecontroller, kunt u kortstondige volumes voor algemene doeleinden gebruiken om te verzoeken dat een volume van een bepaalde grootte wordt toegewezen aan PMEM met behulp van bijvoorbeeld het CSI-stuurprogramma. PMEM-CSI.

LVM lokale opslag als werkruimte

Applicaties die werken met gegevens die groter zijn dan RAM vereisen mogelijk lokale opslag met een grootte of prestatiestatistieken die reguliere EmptyDir-volumes van Kubernetes niet kunnen bieden. Voor dit doel is het bijvoorbeeld geschreven TopoLVM.

Alleen-lezen toegang voor datavolumes

Toewijzing van een volume kan resulteren in de creatie van een volledig volume wanneer:

Deze volumes kunnen in de alleen-lezenmodus worden gemonteerd.

Hoe werkt dit

Kortstondige volumes voor algemeen gebruik

Een belangrijk kenmerk van kortstondige volumes voor algemeen gebruik is de nieuwe volumebron, EphemeralVolumeSource, met daarin alle velden om een ​​volumeverzoek aan te maken (historisch een persistent volumeverzoek, PVC genoemd). Nieuwe regelaar binnen kube-controller-manager kijkt naar de pods die zo'n volumebron creëren, en maakt vervolgens een PVC voor die pods. Voor de CSI-driver ziet dit verzoek er hetzelfde uit als de andere, dus hier is geen speciale ondersteuning nodig.

Zolang dergelijke PVC's bestaan, kunnen ze net als alle andere verzoeken op het volume worden gebruikt. Er kan met name naar worden verwezen als gegevensbron bij het kopiëren van een volume of het maken van een momentopname van een volume. Het PVC-object bevat ook de huidige status van het volume.

De namen van automatisch gemaakte PVC's zijn vooraf gedefinieerd: ze zijn een combinatie van de podnaam en de volumenaam, gescheiden door een koppelteken. Vooraf gedefinieerde namen maken de interactie met de PVC eenvoudiger, omdat u er niet naar hoeft te zoeken als u de podnaam en de volumenaam kent. Het nadeel is dat de naam mogelijk al in gebruik is, wat wordt gedetecteerd door Kubernetes en als gevolg daarvan wordt het starten van de pod geblokkeerd.

Om ervoor te zorgen dat het volume samen met de pod wordt verwijderd, doet de controller een verzoek aan het volume onder de eigenaar. Wanneer de pod wordt verwijderd, werkt het standaard mechanisme voor het verzamelen van afval, waarbij zowel de aanvraag als het volume worden verwijderd.

Verzoeken worden door het opslagstuurprogramma gematcht via het normale mechanisme van de opslagklasse. Hoewel lessen met onmiddellijke en late binding (aka WaitForFirstConsumer) worden ondersteund, voor kortstondige volumes is het zinvol om te gebruiken WaitForFirstConsumer, kan de planner bij het selecteren van een knooppunt rekening houden met zowel het knooppuntgebruik als de opslagbeschikbaarheid. Hier verschijnt een nieuwe functie.

Traceren van opslagcapaciteit

Doorgaans weet de planner niet waar het CSI-stuurprogramma het volume zal creëren. De planner kan ook niet rechtstreeks contact opnemen met de chauffeur om deze informatie op te vragen. Daarom ondervraagt ​​de planner knooppunten totdat hij er een vindt waarop volumes toegankelijk zijn (late binding) of laat de keuze van de locatie volledig aan de bestuurder over (onmiddellijke binding).

Nieuw API CSIStorageCapacity, dat zich in de alfafase bevindt, maakt het mogelijk dat de benodigde gegevens in etcd worden opgeslagen, zodat deze beschikbaar zijn voor de planner. In tegenstelling tot ondersteuning voor kortstondige volumes voor algemeen gebruik, moet u bij het implementeren van het stuurprogramma het bijhouden van de opslagcapaciteit inschakelen: external-provisioner moet de capaciteitsinformatie die via normaal van de bestuurder wordt ontvangen, publiceren GetCapacity.

Als de planner een knooppunt moet selecteren voor een pod met een ongebonden volume dat gebruikmaakt van late binding, en het stuurprogramma deze functie tijdens de implementatie heeft ingeschakeld door de vlag in te stellen CSIDriver.storageCapacity, dan worden knooppunten die niet voldoende opslagcapaciteit hebben automatisch verwijderd. Dit werkt voor kortstondige en persistente volumes voor algemene doeleinden, maar niet voor kortstondige CSI-volumes, omdat hun parameters niet door Kubernetes kunnen worden gelezen.

Zoals gebruikelijk worden er direct gekoppelde volumes gemaakt voordat de pods worden gepland, en wordt hun plaatsing gekozen door het opslagstuurprogramma, dus bij het configureren external-provisioner Standaard worden opslagklassen met onmiddellijke binding overgeslagen, omdat deze gegevens toch niet worden gebruikt.

Omdat de kubernetes-planner wordt gedwongen te werken met mogelijk verouderde informatie, is er geen garantie dat er in alle gevallen capaciteit beschikbaar zal zijn wanneer het volume wordt gemaakt, maar de kans dat het zonder nieuwe pogingen wordt gemaakt, wordt niettemin vergroot.

NB U kunt meer gedetailleerde informatie krijgen, veilig "oefenen op de kattenstandaard", en in geval van een volkomen onbegrijpelijke situatie, gekwalificeerde technische ondersteuning krijgen tijdens intensieve cursussen - Kubernetes-basis wordt gehouden op 28-30 september, en voor meer gevorderde specialisten Kubernetes mega 14–16 oktober.

veiligheid

CSIStoragecapaciteit

CSIStorageCapacity-objecten bevinden zich in naamruimten; bij het uitrollen van elk CSI-stuurprogramma in zijn eigen naamruimte wordt aanbevolen om de RBAC-rechten voor de CSIStorageCapacity in die ruimte te beperken, omdat het duidelijk is waar de gegevens vandaan komen. Kubernetes controleert hier sowieso niet op, en meestal worden stuurprogramma's in dezelfde naamruimte geplaatst, dus uiteindelijk wordt van de stuurprogramma's verwacht dat ze werken en geen onjuiste gegevens publiceren (en dit is waar mijn kaart het begaf, ca. vertaler gebaseerd op een bebaarde grap)

Kortstondige volumes voor algemeen gebruik

Als gebruikers rechten hebben om een ​​pod te maken (direct of indirect), kunnen ze ook kortstondige volumes voor algemeen gebruik maken, zelfs als ze niet over de rechten beschikken om een ​​verzoek op het volume te maken. Dit komt omdat RBAC-toestemmingscontroles worden toegepast op de controller die de PVC maakt, en niet op de gebruiker. Dit is de belangrijkste wijziging die moet worden toegevoegd naar jouw rekening, voordat u deze functie inschakelt op clusters waar niet-vertrouwde gebruikers geen rechten mogen hebben om volumes te maken.

Voorbeeld

Verschillend filiaal PMEM-CSI bevat alle noodzakelijke wijzigingen om een ​​Kubernetes 1.19-cluster binnen QEMU virtuele machines te laten draaien met alle functies in de alfafase. De drivercode is niet gewijzigd, alleen de implementatie is gewijzigd.

Op een geschikte machine (Linux kan een normale gebruiker gebruiken havenarbeider, zien hier details) zullen deze opdrachten het cluster oproepen en het PMEM-CSI-stuurprogramma installeren:

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

Nadat alles werkt, bevat de uitvoer instructies voor gebruik:

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-objecten zijn niet bedoeld om door mensen te worden gelezen, dus enige verwerking is vereist. Golang-sjabloonfilters tonen de opslagklassen, dit voorbeeld toont de naam, topologie en capaciteit:

$ 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

Eén object heeft de volgende inhoud:

$ 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>

Laten we proberen een demotoepassing te maken met één kortstondig volume voor algemene doeleinden. Bestandsinhoud 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

Na het maken, zoals weergegeven in de bovenstaande instructies, hebben we nu een extra pod en 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-eigenaar - onder:

$ 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
...

Naar verwachting bijgewerkte informatie voor 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

Als een andere applicatie meer dan 26620Mi nodig heeft, houdt de planner daar geen rekening mee pmem-csi-pmem-govm-worker1 in elk geval.

Wat is het volgende?

Beide features zijn nog in ontwikkeling. Tijdens de alfatest zijn verschillende applicaties geopend. De links naar het verbeteringsvoorstel documenteren het werk dat moet worden gedaan om naar de bètafase te gaan, en welke alternatieven al zijn overwogen en afgewezen:

Bron: www.habr.com

Voeg een reactie