Kontejnerové úložisko interface (CSI) je jednotný rozhraní pre interakciu Kubernetes a systémov úložiska. Krátko o ňom sme už , a dnes podrobne preskúmame spojenie CSI a Ceph: ukážeme, ako k klastru Kubernetes.
V článku sú prezentované skutočné, aj keď trochu zjednodušené príklady na lepšie pochopenie. Inštaláciu a nastavenie klastra Ceph a Kubernetes neberieme do úvahy.
Zaujíma vás, ako to funguje?

Takže máte po ruke klaster Kubernetes, nasadený napríklad . Vedľa pracuje klaster Ceph – ten môžete tiež nainštalovať, napríklad touto . Dúfam, že netreba spomínať, že pre produkciu by medzi nimi mala byť sieť s priepustnosťou najmenej 10 Gbit/s.
Ak máte toto všetko, poďme na to!
Najprv sa prihlásime na jednu z nód klastra Ceph a overíme, že je všetko v poriadku:
ceph health
ceph -sĎalej tu ihneď vytvoríme bazén pre RBD disky:
ceph osd pool create kube 32
ceph osd pool application enable kube rbdPrejdeme do klastra Kubernetes. Tam najprv nainštalujeme Ceph CSI ovládač pre RBD. Inštalácia sa bude robiť, ako sa patrí, prostredníctvom Helm.
Pridáme repozitár s chartom, dostaneme súbor premenných chartu ceph-csi-rbd:
helm repo add ceph-csi https://ceph.github.io/csi-charts
helm inspect values ceph-csi/ceph-csi-rbd > cephrbd.ymlTeraz je potrebné vyplniť súbor cephrbd.yml. Na to zistíme ID klastra a IP adresy monitorov v Ceph:
ceph fsid # tak zistíme clusterID
ceph mon dump # a tak uvidíme IP adresy monitorovZískané hodnoty vložíme do súboru cephrbd.yml. Zároveň povolíme vytváranie politík PSP (Pod Security Policies). Možnosti v sekciách nodeplugin a provisioner už sú v súbore, dajú sa upraviť tak, ako je uvedené nižšie:
csiConfig:
- clusterID: "bcd0d202-fba8-4352-b25d-75c89258d5ab"
monitors:
- "v2:172.18.8.5:3300/0,v1:172.18.8.5:6789/0"
- "v2:172.18.8.6:3300/0,v1:172.18.8.6:6789/0"
- "v2:172.18.8.7:3300/0,v1:172.18.8.7:6789/0"
nodeplugin:
podSecurityPolicy:
enabled: true
provisioner:
podSecurityPolicy:
enabled: trueĎalej, čo nám ostáva, je nainštalovať chart do klastra Kubernetes.
helm upgrade -i ceph-csi-rbd ceph-csi/ceph-csi-rbd -f cephrbd.yml -n ceph-csi-rbd --create-namespaceSkvele, RBD ovládač funguje!
Vytvorme v Kubernetes novú StorageClass. Na to opäť bude potrebné trochu pracovať s Ceph.
Vytvoríme nového používateľa v Ceph a poskytneme mu práva na zápis do bazéna kube:
ceph auth get-or-create client.rbdkube mon 'profile rbd' osd 'profile rbd pool=kube'A teraz sa pozrime na prístupový kľúč, všetko tam isté:
ceph auth get-key client.rbdkubePríkaz vyprodukuje niečo podobné:
AQCO9NJbhYipKRAAMqZsnqqS/T8OYQX20xIa9A==Zaznamenáme túto hodnotu do Secret v klastri Kubernetes – tam, kde je potrebná userKey:
---
apiVersion: v1
kind: Secret
metadata:
name: csi-rbd-secret
namespace: ceph-csi-rbd
stringData:
# Hodnoty kľúčov zodpovedajú používateľskému menu a jeho kľúču, ako je uvedené v
# klastre Ceph. ID užívateľa by malo mať prístup k bazénu,
# uvedenému v storage class
userID: rbdkube
userKey:A vytvoríme náš tajný kód:
kubectl apply -f secret.yamlĎalej potrebujeme približne takýto manifest StorageClass:
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: csi-rbd-sc
provisioner: rbd.csi.ceph.com
parameters:
clusterID:
pool: kube
imageFeatures: layering
# Tieto tajné kódy by mali obsahovať údaje na autorizáciu
# do vášho bazénu.
csi.storage.k8s.io/provisioner-secret-name: csi-rbd-secret
csi.storage.k8s.io/provisioner-secret-namespace: ceph-csi-rbd
csi.storage.k8s.io/controller-expand-secret-name: csi-rbd-secret
csi.storage.k8s.io/controller-expand-secret-namespace: ceph-csi-rbd
csi.storage.k8s.io/node-stage-secret-name: csi-rbd-secret
csi.storage.k8s.io/node-stage-secret-namespace: ceph-csi-rbd
csi.storage.k8s.io/fstype: ext4
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:
- discardJe potrebné vyplniť clusterID, ktorý sme už zistili príkazom ceph fsid, a aplikovať tento manifest v klastri Kubernetes:
kubectl apply -f storageclass.yamlAby sme skontrolovali prácu klastrov v súlade, vytvoríme takýto PVC (Persistent Volume Claim):
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: rbd-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: csi-rbd-scIhneď sa pozrieme, ako Kubernetes vytvoril v Ceph požadovaný objem:
kubectl get pvc
kubectl get pvVyzerá to skvele! A ako to vyzerá na strane Ceph?
Získame zoznam objemov v bazéne a prezerieme si informácie o našom objeme:
rbd ls -p kube
rbd -p kube info csi-vol-eb3d257d-8c6c-11ea-bff5-6235e7640653 # tu, samozrejme, bude iné ID objemu, ktoré vydala predchádzajúca командаTeraz sa poďme pozrieť, ako funguje zmena veľkosti objemu RBD.
Zmeníme veľkosť objemu v manifeste pvc.yaml na 2Gi a aplikujeme ho:
kubectl apply -f pvc.yamlPočkajme, kým sa zmeny prejavia, a pozrime sa znova na veľkosť objemu.
rbd -p kube info csi-vol-eb3d257d-8c6c-11ea-bff5-6235e7640653
kubectl get pv
kubectl get pvcVidíme, že veľkosť PVC sa nezmenila. Aby sme zistili, prečo, môžeme požiadať Kubernetes o popis PVC vo formáte YAML:
kubectl get pvc rbd-pvc -o yamlA tu je problém:
message: Waiting for user to (re-)start a pod to finish file system resize of volume on node. type: FileSystemResizePending
To znamená, že disk sa zväčšil, ale súborový systém na ňom nie.
Aby sme zväčšili súborový systém, musíme pripojiť objem. Náš vytvorený PVC/PV sa teraz nikam nepoužíva.
Môžeme vytvoriť testovací Pod, napríklad takto:
---
apiVersion: v1
kind: Pod
metadata:
name: csi-rbd-demo-pod
spec:
containers:
- name: web-server
image: nginx:1.17.6
volumeMounts:
- name: mypvc
mountPath: /data
volumes:
- name: mypvc
persistentVolumeClaim:
claimName: rbd-pvc
readOnly: falseA teraz sa pozrime na PVC:
kubectl get pvcVeľkosť sa zmenila, všetko je v poriadku.
V prvej časti sme pracovali s blokovým zariadením RBD (čo je skratka pre Rados Block Device), ale to takto nemôžeme robiť, ak potrebujeme, aby rôzne mikroslužby súčasne pracovali s týmto diskom. Pre prácu s súbormi, a nie s obrazom disku, je oveľa lepšie použiť CephFS.
Na príklade klastra Ceph a Kubernetes nastavíme CSI a ostatné potrebné entity pre prácu s CephFS.
Získame hodnoty z požadovaného nového Helm grafu:
helm inspect values ceph-csi/ceph-csi-cephfs > cephfs.ymlZnova je potrebné vyplniť súbor cephfs.yml. Ako predtým, pomôžu príkazy Ceph:
ceph fsid
ceph mon dumpVyplňujeme súbor s hodnotami približne takto:
csiConfig:
- clusterID: "bcd0d202-fba8-4352-b25d-75c89258d5ab"
monitors:
- "172.18.8.5:6789"
- "172.18.8.6:6789"
- "172.18.8.7:6789"
nodeplugin:
httpMetrics:
enabled: true
containerPort: 8091
podSecurityPolicy:
enabled: true
provisioner:
replicaCount: 1
podSecurityPolicy:
enabled: trueVšimnite si, že adresy monitorov sú uvedené v jednoduchom formáte adresa:port. Pre montovanie cephfs na uzle sú tieto adresy predávané do jadrového modulu, ktorý ešte nevie pracovať s protokolom monitorov v2.
Port pre httpMetrics (kam sa bude Prometheus chodiť po metriky na monitorovanie) meníme, aby nekolidoval s nginx-proxy, ktorý sa inštaluje pomocou Kubespray. Možno to nebudete potrebovať.
Inštalujeme Helm graf do klastra Kubernetes:
helm upgrade -i ceph-csi-cephfs ceph-csi/ceph-csi-cephfs -f cephfs.yml -n ceph-csi-cephfs --create-namespacePrejdeme do úložiska Ceph, aby sme tam vytvorili osobitného používateľa. V dokumentácii je uvedené, že provisioner pre CephFS potrebuje administrátorské prístupové práva k clustru. Ale vytvoríme samostatného používateľa fs s obmedzenými právami:
ceph auth get-or-create client.fs mon 'allow r' mgr 'allow rw' mds 'allow rws' osd 'allow rw pool=cephfs_data, allow rw pool=cephfs_metadata'A hneď sa pozrieme na jeho prístupový kľúč, ktorý využijeme neskôr:
ceph auth get-key client.fsVytvoríme samostatné Secret a StorageClass.
Nič nové, už sme to videli na príklade RBD:
---
apiVersion: v1
kind: Secret
metadata:
name: csi-cephfs-secret
namespace: ceph-csi-cephfs
stringData:
# Potrebné pre dynamicky vytvorené objemy
adminID: fs
adminKey:Používame manifest:
kubectl apply -f secret.yamlA teraz – samostatný StorageClass:
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: csi-cephfs-sc
provisioner: cephfs.csi.ceph.com
parameters:
clusterID:
# Názov CephFS súborového systému, v ktorom bude vytvorený objem
fsName: cephfs
# (voliteľné) Pool Ceph, v ktorom budú uložené dáta objemu
# pool: cephfs_data
# (voliteľné) Možnosti pripojenia oddelené čiarkou pre Ceph-fuse
# napríklad:
# fuseMountOptions: debug
# (voliteľné) Možnosti pripojenia CephFS pre jadro oddelené čiarkou
# Pozri man mount.ceph pre zoznam týchto možností. Napríklad:
# kernelMountOptions: readdir_max_bytes=1048576,norbytes
# Tajomstvá musia obsahovať prístupové údaje pre administrátora a/alebo používateľa Ceph.
csi.storage.k8s.io/provisioner-secret-name: csi-cephfs-secret
csi.storage.k8s.io/provisioner-secret-namespace: ceph-csi-cephfs
csi.storage.k8s.io/controller-expand-secret-name: csi-cephfs-secret
csi.storage.k8s.io/controller-expand-secret-namespace: ceph-csi-cephfs
csi.storage.k8s.io/node-stage-secret-name: csi-cephfs-secret
csi.storage.k8s.io/node-stage-secret-namespace: ceph-csi-cephfs
# (voliteľné) Ovládač môže používať buď ceph-fuse (fuse),
# alebo ceph kernelclient (kernel).
# Ak nie je zadané, bude sa používať predvolené pripojenie objemov,
# ktoré sa určuje hľadaním ceph-fuse a mount.ceph
# mounter: kernel
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:
- debugVyplníme tu clusterID a aplikujeme v Kubernetes:
kubectl apply -f storageclass.yamlKontrola
Na skontrolovanie, ako v predchádzajúcom príklade, vytvoríme PVC:
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: csi-cephfs-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
storageClassName: csi-cephfs-scA skontrolujeme existenciu PVC/PV:
kubectl get pvc
kubectl get pvAk chcete vidieť súbory a adresáre v CephFS, môžete pripojiť tento súborový systém niekam. Napríklad, ako je uvedené nižšie.
Pôjdeme na jeden z uzlov klastru Ceph a vykonáme tieto kroky:
# Точка монтирования
mkdir -p /mnt/cephfs
# Создаём файл с ключом администратора
ceph auth get-key client.admin >/etc/ceph/secret.key
# Добавляем запись в /etc/fstab
# !! Изменяем ip адрес на адрес нашего узла
echo "172.18.8.6:6789:/ /mnt/cephfs ceph name=admin,secretfile=/etc/ceph/secret.key,noatime,_netdev 0 2" >> /etc/fstab
mount /mnt/cephfsSamozrejme, takéto pripojenie FS na uzle Ceph je vhodné výlučne na vzdelávacie účely, čomu sa aj venujeme na našich . Nemyslím si, že by to niekto robil v produkcii, riziko náhodného prepísania dôležitých súborov je vysoké.
A nakoniec si skontrolujme, ako je to v prípade CephFS s menením veľkosti objemu. Vraciam sa do Kubernetes a upravím náš manifest pre PVC — zväčšíme tam veľkosť, napríklad na 7Gi.
Aplikujeme upravený súbor:
kubectl apply -f pvc.yamlPozrieme sa na pripojenom adresári, ako sa zmenila kvóta:
getfattr -n ceph.quota.max_bytesPre túto príkaz môže byť potrebné nainštalovať do systému balík attr.
Oči sa boja, ale ruky robia
Napriek tomu, že tieto zaklínadlá a dlhé manifesty YAML vyzerajú na prvý pohľad zložito, študenti Slovermu si s nimi v praxi celkom rýchlo poradia.
V tomto článku sme sa nepúšťali do hlbokých detailov — na to je oficiálna dokumentácia. Ak vás zaujímajú podrobnosti o nastavení úložiska Ceph v spolupráci s Kubernetes klastrom, pomôžu tieto odkazy:
Na kurze Sloverm môžete ísť ešte trochu ďalej a nasadiť v Kubernetes skutočnú aplikáciu, ktorá bude používať CephFS ako úložisko pre súbory. Pomocou GET/POST požiadaviek budete môcť súbory odosielať a prijímať z Ceph.
A ak vás viac zaujíma ukladanie dát, prihláste sa na . Kým prebieha beta test, môžete získať kurz so zľavou a ovplyvniť jeho obsah.
Autor článku: Alexander Shvalov, praktikujúci inžinier , Certified Kubernetes Administrator, autor a vývojár kurzov Sloverm.
Zdroj: habr.com
