ProHoster > Blog > administracja > Woluminy efemeryczne ze śledzeniem pojemności pamięci: pusty katalog na sterydach
Woluminy efemeryczne ze śledzeniem pojemności pamięci: pusty katalog na sterydach
Niektóre aplikacje również muszą przechowywać dane, ale są całkiem wygodne z faktem, że dane nie zostaną zapisane po ponownym uruchomieniu.
Na przykład usługi buforowania są ograniczone przez pamięć RAM, ale mogą również przenosić rzadko używane dane do pamięci wolniejszej niż pamięć RAM, z niewielkim wpływem na ogólną wydajność. Inne aplikacje muszą mieć świadomość, że w plikach mogą znajdować się dane wejściowe tylko do odczytu, takie jak ustawienia lub tajne klucze.
Kubernetes ma już kilka typów tomy efemeryczne, ale ich funkcjonalność jest ograniczona do tego, co zaimplementowano w K8.
Efemeryczny Tomy CSI umożliwiło rozszerzenie Kubernetesa o sterowniki CSI w celu zapewnienia obsługi lekkich woluminów lokalnych. W ten sposób można skorzystać dowolne struktury: ustawienia, sekrety, dane identyfikacyjne, zmienne i tak dalej. Sterowniki CSI muszą zostać zmodyfikowane, aby obsługiwały tę funkcję Kubernetes, ponieważ nie oczekuje się, że zwykłe standardowe sterowniki będą działać, ale oczekuje się, że takich woluminów będzie można używać w dowolnym węźle wybranym dla poda.
Może to stanowić problem w przypadku woluminów zużywających znaczne zasoby hosta lub w przypadku pamięci masowej dostępnej tylko na niektórych hostach. Dlatego Kubernetes 1.19 wprowadza dwie nowe funkcje woluminów testowych alfa, które koncepcyjnie są podobne do woluminów PustegoDir:
tomy efemeryczne ogólnego przeznaczenia;
Śledzenie pojemności pamięci CSI.
Zalety nowego podejścia:
przechowywanie może być lokalne lub połączone za pośrednictwem sieci;
woluminy mogą mieć określony rozmiar, którego aplikacja nie może przekroczyć;
współpracuje z dowolnymi sterownikami CSI, które obsługują udostępnianie trwałych woluminów i (w celu obsługi śledzenia wydajności) implementują wywołanie GetCapacity;
woluminy mogą zawierać pewne dane początkowe w zależności od sterownika i ustawień;
obsługiwane są wszystkie standardowe operacje na woluminie (tworzenie migawki, zmiana rozmiaru itp.);
woluminów można używać z dowolnym kontrolerem aplikacji, który akceptuje specyfikację modułu lub woluminu;
Harmonogram Kubernetes sam wybiera odpowiednie węzły, więc nie ma już potrzeby udostępniania i konfigurowania rozszerzeń harmonogramu ani modyfikowania webhooków.
aplikacje
Dlatego woluminy efemeryczne ogólnego przeznaczenia nadają się do następujących zastosowań:
Pamięć trwała jako zamiennik pamięci RAM dla memcached
Najnowsze wersje memcached dodał wsparcie korzystanie z pamięci trwałej (Intel Optane itp., około. tłumacz) zamiast zwykłej pamięci RAM. Podczas wdrażania memcached za pośrednictwem kontrolera aplikacji można użyć woluminów efemerycznych ogólnego przeznaczenia, aby na przykład zażądać przydzielenia woluminu o danym rozmiarze z PMEM za pomocą sterownika CSI PMEM-CSI.
Lokalna pamięć masowa LVM jako obszar roboczy
Aplikacje współpracujące z danymi większymi niż pamięć RAM mogą wymagać lokalnego magazynu o rozmiarze lub wskaźnikach wydajności, których nie są w stanie zapewnić zwykłe woluminy DesertDir z Kubernetes. Na przykład w tym celu został napisany TopoLVM.
Dostęp tylko do odczytu dla woluminów danych
Alokacja woluminu może skutkować utworzeniem woluminu pełnego, gdy:
Woluminy te można zamontować w trybie tylko do odczytu.
Jak to działa
Tomy efemeryczne ogólnego przeznaczenia
Kluczową cechą woluminów efemerycznych ogólnego przeznaczenia jest nowe źródło woluminów, EphemeralVolumeSource, zawierający wszystkie pola umożliwiające utworzenie żądania woluminu (historycznie zwanego trwałym żądaniem woluminu, PVC). Nowy kontroler w kube-controller-manager sprawdza pody, które tworzą takie źródło wolumenu, a następnie tworzy plik PVC dla tych podów. W przypadku sterownika CSI to żądanie wygląda tak samo jak pozostałe, więc nie jest tutaj potrzebne żadne specjalne wsparcie.
Dopóki takie kanały PVC istnieją, można ich używać jak innych żądań w wolumenie. W szczególności można się do nich odwoływać jako do źródła danych podczas kopiowania woluminu lub tworzenia migawki z woluminu. Obiekt PVC zawiera także bieżący stan woluminu.
Nazwy automatycznie tworzonych obwodów PVC są predefiniowane: stanowią kombinację nazwy pod i nazwy woluminu oddzielonych łącznikiem. Predefiniowane nazwy ułatwiają interakcję z PVC, ponieważ nie trzeba go szukać, jeśli znasz nazwę pod i nazwę woluminu. Minusem jest to, że nazwa może być już używana, co jest wykrywane przez Kubernetes i w rezultacie uruchomienie poda jest zablokowane.
Aby mieć pewność, że wolumin zostanie usunięty wraz z zasobnikiem, kontroler wysyła żądanie do woluminu należącego do właściciela. Po usunięciu poda działa standardowy mechanizm zbierania elementów bezużytecznych, który usuwa zarówno żądanie, jak i wolumin.
Żądania są dopasowywane przez sterownik pamięci masowej za pomocą normalnego mechanizmu klasy pamięci. Chociaż klasy z natychmiastowym i późnym wiązaniem (aka WaitForFirstConsumer) są obsługiwane, w przypadku woluminów efemerycznych sensowne jest użycie WaitForFirstConsumer, podczas wybierania węzła osoba planująca może uwzględnić zarówno wykorzystanie węzła, jak i dostępność pamięci. Pojawia się tutaj nowa funkcja.
Śledzenie pojemności pamięci
Zazwyczaj osoba planująca nie ma wiedzy o tym, gdzie sterownik CSI utworzy wolumin. Osoba planująca nie ma również możliwości bezpośredniego skontaktowania się z kierowcą w celu uzyskania tych informacji. Dlatego też program planujący odpytuje węzły, aż znajdzie taki, w którym można uzyskać dostęp do woluminów (późne wiązanie) lub pozostawia wybór lokalizacji całkowicie sterownikowi (natychmiastowe wiązanie).
nowy APICSIStorageCapacity, który jest w fazie alfa, pozwala na przechowywanie niezbędnych danych w etcd, tak aby były dostępne dla planisty. W odróżnieniu od obsługi woluminów tymczasowych ogólnego przeznaczenia, podczas wdrażania sterownika należy włączyć śledzenie pojemności pamięci: external-provisioner powinien publikować informacje o przepustowości otrzymane od kierowcy w trybie normalnym GetCapacity.
Jeśli program planujący musi wybrać węzeł dla zasobnika z niepowiązanym woluminem, który korzysta z późnego wiązania, a sterownik włączył tę funkcję podczas wdrażania, ustawiając flagę CSIDriver.storageCapacity, węzły, które nie mają wystarczającej pojemności, zostaną automatycznie odrzucone. Działa to zarówno w przypadku woluminów efemerycznych, jak i trwałych ogólnego przeznaczenia, ale nie w przypadku woluminów efemerycznych CSI, ponieważ Kubernetes nie może odczytać ich parametrów.
Jak zwykle, przed zaplanowaniem podów tworzone są natychmiast połączone woluminy, a ich rozmieszczenie jest wybierane przez sterownik pamięci masowej, więc podczas konfigurowania external-provisioner Domyślnie pomijane są klasy pamięci z natychmiastowym wiązaniem, ponieważ te dane i tak nie będą używane.
Ponieważ program planujący Kubernetes jest zmuszony pracować z potencjalnie nieaktualnymi informacjami, nie ma gwarancji, że pojemność będzie dostępna w każdym przypadku podczas tworzenia woluminu, ale mimo to zwiększa się szansa, że zostanie on utworzony bez ponownych prób.
NB Możesz uzyskać bardziej szczegółowe informacje, a także bezpiecznie „poćwiczyć na stoisku dla kotów”, a w przypadku całkowicie niezrozumiałej sytuacji otrzymać wykwalifikowaną pomoc techniczną na intensywnych kursach - Baza Kubernetesa odbędzie się w dniach 28-30 września, a dla bardziej zaawansowanych specjalistów Kubernetes Mega 14–16 października.
bezpieczeństwo
Pojemność magazynu CSIS
Obiekty CSIStorageCapacity znajdują się w przestrzeniach nazw; podczas wdrażania każdego sterownika CSI w jego własnej przestrzeni nazw zaleca się ograniczenie praw RBAC do CSIStorageCapacity w tej przestrzeni, ponieważ jest oczywiste, skąd pochodzą dane. Kubernetes i tak tego nie sprawdza, a zazwyczaj sterowniki umieszczane są w tej samej przestrzeni nazw, więc ostatecznie oczekuje się, że sterowniki będą działać i nie publikować nieprawidłowych danych (i tu zawiodła moja karta, około. tłumacz oparty na brodatym dowcipie)
Tomy efemeryczne ogólnego przeznaczenia
Jeśli użytkownicy mają uprawnienia do tworzenia podów (bezpośrednio lub pośrednio), będą mogli także tworzyć woluminy efemeryczne ogólnego przeznaczenia, nawet jeśli nie mają uprawnień do tworzenia żądań na woluminie. Dzieje się tak, ponieważ kontrole uprawnień RBAC dotyczą kontrolera tworzącego obwód PVC, a nie użytkownika. To jest główna zmiana, którą należy dodać na Twoje konto, przed włączeniem tej funkcji w klastrach, w których niezaufani użytkownicy nie powinni mieć uprawnień do tworzenia woluminów.
Przykład
Oddzielny gałąź PMEM-CSI zawiera wszystkie niezbędne zmiany do uruchomienia klastra Kubernetes 1.19 na maszynach wirtualnych QEMU ze wszystkimi funkcjami w fazie alfa. Kod sterownika nie uległ zmianie, zmieniło się jedynie wdrożenie.
Na odpowiedniej maszynie (Linux, zwykły użytkownik może używać Doker, Widzieć tutaj szczegóły) te polecenia wywołają klaster i zainstalują sterownik 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
Gdy wszystko zadziała, dane wyjściowe będą zawierać instrukcje użytkowania:
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 -
Obiekty CSIStorageCapacity nie są przeznaczone do odczytu przez ludzi, dlatego wymagane jest pewne przetwarzanie. Filtry szablonów Golang pokażą klasy pamięci, ten przykład pokaże nazwę, topologię i pojemność:
Spróbujmy stworzyć aplikację demonstracyjną z jednym woluminem efemerycznym ogólnego przeznaczenia. Zawartość pliku 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 utworzeniu zgodnie z instrukcją powyżej mamy teraz dodatkowy zasobnik i PCV:
$ 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
Jeśli inna aplikacja potrzebuje więcej niż 26620Mi, harmonogram nie weźmie pod uwagę pmem-csi-pmem-govm-worker1 w każdym przypadku.
Co dalej?
Obie funkcje są wciąż w fazie rozwoju. Podczas testów alfa otwarto kilka aplikacji. Linki do propozycji ulepszeń dokumentują pracę, którą należy wykonać, aby przejść do etapu beta, a także to, które alternatywy zostały już rozważone i odrzucone: