Pomíjivé svazky se sledováním úložné kapacity: EmptyDir na steroidech

Pomíjivé svazky se sledováním úložné kapacity: EmptyDir na steroidech

Některé aplikace také potřebují ukládat data, ale docela jim vyhovuje, že se data po restartu neuloží.

Například služby ukládání do mezipaměti jsou omezeny pamětí RAM, ale mohou také přesouvat data, která se zřídka používají, do úložiště, které je pomalejší než RAM, s malým dopadem na celkový výkon. Jiné aplikace si musí být vědomy, že v souborech může být nějaký vstup pouze pro čtení, jako jsou nastavení nebo tajné klíče.

Kubernetes už má několik typů efemérní objemy, ale jejich funkčnost je omezena na to, co je implementováno v K8s.

Efemérní svazky CSI umožnilo rozšíření Kubernetes o ovladače CSI, aby poskytovaly podporu pro lehké místní svazky. Tímto způsobem je možné použít libovolné struktury: nastavení, tajemství, identifikační údaje, proměnné a tak dále. Ovladače CSI musí být upraveny tak, aby podporovaly tuto funkci Kubernetes, protože se předpokládá, že běžné standardizované ovladače nebudou fungovat – ale předpokládá se, že takové svazky lze použít na jakémkoli uzlu vybraném pro pod.

To může být problém u svazků, které spotřebovávají značné zdroje hostitele, nebo u úložiště, které je dostupné pouze u některých hostitelů. Proto Kubernetes 1.19 zavádí dvě nové funkce pro testování alfa verze, které jsou koncepčně podobné svazkům EmptyDir:

  • pomíjivé objemy pro obecné účely;

  • Sledování kapacity úložiště CSI.

Výhody nového přístupu:

  • úložiště může být lokální nebo připojené přes síť;

  • svazky mohou mít specifikovanou velikost, kterou aplikace nemůže překročit;

  • pracuje se všemi ovladači CSI, které podporují poskytování trvalých svazků a (pro podporu sledování kapacity) implementují volání GetCapacity;

  • svazky mohou mít některá počáteční data v závislosti na ovladači a nastavení;

  • jsou podporovány všechny standardní operace se svazkem (vytvoření snímku, změna velikosti atd.);

  • svazky lze použít s jakýmkoli aplikačním řadičem, který přijímá specifikaci modulu nebo svazku;

  • Plánovač Kubernetes vybírá vhodné uzly sám, takže již není potřeba zajišťovat a konfigurovat rozšíření plánovače nebo upravovat webhooky.

Možnosti aplikace

Proto jsou efemérní svazky pro obecné účely vhodné pro následující případy použití:

Perzistentní paměť jako náhrada RAM pro memcached

Nejnovější verze memcached přidána podpora pomocí trvalé paměti (Intel Optane atd., Cca. překladatel) místo běžné paměti RAM. Při nasazování memcached prostřednictvím aplikačního řadiče můžete použít univerzální dočasné svazky a požádat o přidělení svazku dané velikosti z PMEM pomocí ovladače CSI, například PMEM-CSI.

Lokální úložiště LVM jako pracovní prostor

Aplikace, které pracují s daty, která jsou větší než RAM, mohou vyžadovat místní úložiště s metrikami velikosti nebo výkonu, které běžné svazky EmptyDir od Kubernetes nemohou poskytnout. Například pro tento účel byl napsán TopoLVM.

Přístup pouze pro čtení pro objemy dat

Přidělení svazku může vést k vytvoření celého svazku, když:

Tyto svazky lze připojit v režimu pouze pro čtení.

Jak to funguje

General Purpose Ephemeral Volumes

Klíčovou vlastností pomíjivých svazků pro obecné účely je nový zdroj svazků, EphemeralVolumeSourceobsahující všechna pole pro vytvoření požadavku na svazek (historicky nazývaný trvalý požadavek na svazek, PVC). Nový ovladač v kube-controller-manager podívá se na pody, které vytvářejí takový zdroj objemu, a poté pro tyto pody vytvoří PVC. U ovladače CSI vypadá tento požadavek stejně jako ostatní, takže zde není potřeba žádná speciální podpora.

Dokud takové PVC existují, lze je použít jako jakékoli jiné požadavky na svazek. Konkrétně na ně lze odkazovat jako na zdroj dat při kopírování svazku nebo vytváření snímku ze svazku. Objekt PVC obsahuje také aktuální stav objemu.

Názvy automaticky vytvořených PVC jsou předdefinovány: jsou kombinací názvu pod a názvu svazku, oddělené pomlčkou. Předdefinované názvy usnadňují interakci s PVC, protože pokud znáte název podu a název svazku, nemusíte je hledat. Nevýhodou je, že název může být již používán, což Kubernetes detekuje a v důsledku toho je blok blokován spuštění.

Aby bylo zajištěno, že se svazek vymaže spolu s modulem, ovladač odešle požadavek na svazek pod vlastníkem. Když je modul odstraněn, funguje standardní mechanismus pro shromažďování odpadu, který odstraní požadavek i svazek.

Požadavky jsou porovnávány ovladačem úložiště prostřednictvím normálního mechanismu třídy úložiště. Ačkoli třídy s okamžitou a pozdní vazbou (aka WaitForFirstConsumer) jsou podporovány, pro efemérní objemy má smysl používat WaitForFirstConsumer, pak plánovač může při výběru uzlu vzít v úvahu využití uzlu i dostupnost úložiště. Zde se objeví nová funkce.

Sledování kapacity úložiště

Plánovač obvykle neví, kde ovladač CSI vytvoří svazek. Plánovač také nemá možnost kontaktovat přímo řidiče a požádat o tyto informace. Plánovač se proto dotazuje na uzly, dokud nenajde ten, na kterém lze přistupovat ke svazkům (pozdní vazba), nebo ponechá volbu umístění zcela na ovladači (okamžitá vazba).

Nový API CSIStorageCapacity, který je ve fázi alfa, umožňuje uložit potřebná data do etcd tak, aby byla k dispozici plánovači. Na rozdíl od podpory pomíjivých svazků pro obecné účely musíte při nasazení ovladače povolit sledování kapacity úložiště: external-provisioner by měl zveřejnit informace o kapacitě obdržené od řidiče normálním způsobem GetCapacity.

Pokud plánovač potřebuje vybrat uzel pro pod s nevázaným svazkem, který používá pozdní vazbu, a ovladač tuto funkci povolil během nasazení nastavením příznaku CSIDriver.storageCapacity, pak uzly, které nemají dostatečnou kapacitu úložiště, budou automaticky vyřazeny. To funguje jak pro efemérní, tak pro trvalé svazky pro obecné účely, ale ne pro efemérní svazky CSI, protože jejich parametry nemůže Kubernetes přečíst.

Jako obvykle jsou bezprostředně propojené svazky vytvořeny před naplánováním podů a jejich umístění volí ovladač úložiště, takže při konfiguraci external-provisioner Ve výchozím nastavení jsou třídy úložiště s okamžitou vazbou přeskočeny, protože tato data nebudou stejně použita.

Vzhledem k tomu, že plánovač kubernetes je nucen pracovat s potenciálně zastaralými informacemi, není zaručeno, že kapacita bude k dispozici v každém případě, když je svazek vytvořen, ale přesto se zvyšuje šance, že bude vytvořen bez opakování.

NB Můžete získat podrobnější informace, bezpečně si „zacvičit na kočičím stánku“ a v případě zcela nepochopitelné situace získat kvalifikovanou technickou podporu na intenzivních kurzech - Základna Kubernetes se bude konat 28. – 30. září a pro pokročilejší specialisty Kubernetes Mega 14.–16. října.

zabezpečení

CSIS kapacita úložiště

Objekty CSIStorageCapacity jsou umístěny ve jmenných prostorech; při zavádění každého ovladače CSI do vlastního jmenného prostoru se doporučuje omezit práva RBAC na CSIStorageCapacity v tomto prostoru, protože je zřejmé, odkud data pocházejí. Kubernetes to stejně nekontroluje a obvykle jsou ovladače umístěny do stejného jmenného prostoru, takže se nakonec očekává, že ovladače budou fungovat a nebudou publikovat nesprávná data (a tady moje karta selhala, Cca. překladatel založený na vousatém vtipu)

General Purpose Ephemeral Volumes

Pokud mají uživatelé práva k vytvoření pod (přímo nebo nepřímo), budou také moci vytvářet pomíjivé svazky pro obecné účely, i když nemají práva k vytvoření požadavku na svazku. Je to proto, že kontroly oprávnění RBAC jsou aplikovány na řadič, který vytváří PVC, nikoli na uživatele. Toto je hlavní změna, kterou je třeba přidat na váš účetpřed povolením této funkce na clusterech, kde by nedůvěryhodní uživatelé neměli mít práva k vytváření svazků.

příklad

Samostatný Vetka PMEM-CSI obsahuje všechny potřebné změny ke spuštění clusteru Kubernetes 1.19 uvnitř virtuálních počítačů QEMU se všemi funkcemi ve fázi alfa. Kód ovladače se nezměnil, změnilo se pouze nasazení.

Na vhodném stroji (Linux, běžný uživatel může použít přístavní dělník, Koukni se zde podrobnosti) tyto příkazy vyvolají cluster a nainstalují ovladač 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

Jakmile vše funguje, výstup bude obsahovat návod k použití:

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 -

Objekty CSIStorageCapacity nejsou určeny ke čtení lidmi, takže je vyžadováno určité zpracování. Filtry šablon Golang zobrazí třídy úložiště, tento příklad ukáže název, topologii a kapacitu:

$ 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

Jeden objekt má následující obsah:

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

Zkusme vytvořit demo aplikaci s jediným pomíjivým svazkem pro obecné účely. Obsah souboru 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

Po vytvoření, jak je znázorněno ve výše uvedených pokynech, nyní máme další pod a 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

Vlastník PVC - pod:

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

Očekávaně aktualizované informace pro 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

Pokud jiná aplikace potřebuje více než 26620Mi, nebude plánovač brát v úvahu pmem-csi-pmem-govm-worker1 v každém případě.

Co bude dál?

Obě funkce jsou stále ve vývoji. Během alfa testování bylo otevřeno několik aplikací. Odkazy na návrh vylepšení dokumentují práci, kterou je třeba vykonat pro přechod do beta fáze, a také to, které alternativy již byly zváženy a zamítnuty:

Zdroj: www.habr.com

Přidat komentář