Container Storage Interface (CSI) je jednotné rozhranie medzi Kubernetes a úložnými systémami. Krátko sme o tom už hovorili
Článok poskytuje skutočné, aj keď mierne zjednodušené príklady pre ľahšie vnímanie. Neuvažujeme o inštalácii a konfigurácii klastrov Ceph a Kubernetes.
Zaujíma vás, ako to funguje?
Takže máte na dosah klaster Kubernetes, nasadený napr.
Ak toto všetko máte, poďme na to!
Najprv poďme do jedného z uzlov klastra Ceph a skontrolujte, či je všetko v poriadku:
ceph health
ceph -s
Ďalej okamžite vytvoríme fond pre disky RBD:
ceph osd pool create kube 32
ceph osd pool application enable kube rbd
Prejdime na klaster Kubernetes. Najprv tam nainštalujeme ovládač Ceph CSI pre RBD. Nainštalujeme podľa očakávania cez Helm.
Pridáme úložisko s grafom, získame množinu premenných pre graf ceph-csi-rbd:
helm repo add ceph-csi https://ceph.github.io/csi-charts
helm inspect values ceph-csi/ceph-csi-rbd > cephrbd.yml
Teraz musíte vyplniť súbor cephrbd.yml. Ak to chcete urobiť, zistite ID klastra a IP adresy monitorov v Ceph:
ceph fsid # так мы узнаем clusterID
ceph mon dump # а так увидим IP-адреса мониторов
Získané hodnoty zadáme do súboru cephrbd.yml. Zároveň umožňujeme tvorbu PSP politík (Pod Security Policies). Možnosti v sekciách nodeplugin и proviant už v súbore, môžu byť opravené, 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 nám ostáva už len nainštalovať graf do klastra Kubernetes.
helm upgrade -i ceph-csi-rbd ceph-csi/ceph-csi-rbd -f cephrbd.yml -n ceph-csi-rbd --create-namespace
Skvelé, ovládač RBD funguje!
Poďme vytvoriť novú triedu StorageClass v Kubernetes. To si opäť vyžaduje trochu pohrať sa s Cephom.
Vytvoríme nového používateľa v Ceph a dáme mu práva na zápis do fondu kocka:
ceph auth get-or-create client.rbdkube mon 'profile rbd' osd 'profile rbd pool=kube'
Teraz sa pozrime, že prístupový kľúč stále existuje:
ceph auth get-key client.rbdkube
Príkaz vypíše niečo takéto:
AQCO9NJbhYipKRAAMqZsnqqS/T8OYQX20xIa9A==
Pridajme túto hodnotu do Secret v klastri Kubernetes – tam, kde ju potrebujeme používateľský kľúč:
---
apiVersion: v1
kind: Secret
metadata:
name: csi-rbd-secret
namespace: ceph-csi-rbd
stringData:
# Значения ключей соответствуют имени пользователя и его ключу, как указано в
# кластере Ceph. ID юзера должен иметь доступ к пулу,
# указанному в storage class
userID: rbdkube
userKey: <user-key>
A vytvárame naše tajomstvo:
kubectl apply -f secret.yaml
Ďalej potrebujeme manifest StorageClass niečo ako toto:
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: csi-rbd-sc
provisioner: rbd.csi.ceph.com
parameters:
clusterID: <cluster-id>
pool: kube
imageFeatures: layering
# Эти секреты должны содержать данные для авторизации
# в ваш пул.
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:
- discard
Je potrebné vyplniť clusterID, čo sme sa už dozvedeli tým ceph fsida aplikujte tento manifest na klaster Kubernetes:
kubectl apply -f storageclass.yaml
Ak chcete skontrolovať, ako klastre spolupracujú, vytvorte nasledujúci PVC (Persistent Volume Claim):
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: rbd-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: csi-rbd-sc
Okamžite sa pozrime, ako Kubernetes vytvoril požadovaný zväzok v Ceph:
kubectl get pvc
kubectl get pv
Všetko sa zdá byť skvelé! Ako to vyzerá na strane Ceph?
Získame zoznam objemov v fonde a zobrazíme informácie o našom objeme:
rbd ls -p kube
rbd -p kube info csi-vol-eb3d257d-8c6c-11ea-bff5-6235e7640653 # тут, конечно же, будет другой ID тома, который выдала предыдущая команда
Teraz sa pozrime, ako funguje zmena veľkosti zväzku RBD.
Zmeňte veľkosť objemu v manifeste pvc.yaml na 2Gi a použite ju:
kubectl apply -f pvc.yaml
Počkajme, kým sa zmeny prejavia a znova sa pozrime na veľkosť zväzku.
rbd -p kube info csi-vol-eb3d257d-8c6c-11ea-bff5-6235e7640653
kubectl get pv
kubectl get pvc
Vidíme, že veľkosť PVC sa nezmenila. Ak chcete zistiť prečo, môžete požiadať Kubernetes o popis YAML PVC:
kubectl get pvc rbd-pvc -o yaml
Tu je problém:
správa: Čaká sa, kým používateľ (re-)spustí modul, aby dokončil zmenu veľkosti zväzku súborového systému na uzle. typ: FileSystemResizePending
To znamená, že disk narástol, ale súborový systém na ňom nie.
Ak chcete rozšíriť súborový systém, musíte pripojiť zväzok. U nás sa vytvorené PVC/PV v súčasnosti nijako nepoužíva.
Môžeme vytvoriť testovací modul, 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: false
A teraz sa pozrime na PVC:
kubectl get pvc
Veľkosť sa zmenila, všetko je v poriadku.
V prvej časti sme pracovali s blokovým zariadením RBD (skratka pre Rados Block Device), ale to sa nedá urobiť, ak s týmto diskom musia súčasne pracovať rôzne mikroslužby. CephFS je oveľa vhodnejší na prácu so súbormi ako s obrazmi diskov.
Na príklade klastrov Ceph a Kubernetes nakonfigurujeme CSI a ďalšie potrebné entity na prácu s CephFS.
Poďme získať hodnoty z nového grafu Helm, ktoré potrebujeme:
helm inspect values ceph-csi/ceph-csi-cephfs > cephfs.yml
Opäť musíte vyplniť súbor cephfs.yml. Rovnako ako predtým, príkazy Ceph pomôžu:
ceph fsid
ceph mon dump
Vyplňte súbor s hodnotami, ako je tento:
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: true
Upozorňujeme, že adresy monitorov sú uvedené v jednoduchom tvare adresa:port. Na pripojenie cephfs na uzol sa tieto adresy prenesú do modulu jadra, ktorý ešte nevie pracovať s protokolom monitora v2.
Zmeníme port pre httpMetrics (Prometheus tam pôjde na sledovanie metrík), aby nebol v konflikte s nginx-proxy, ktorý inštaluje Kubespray. Možno to nebudete potrebovať.
Nainštalujte graf Helm v klastri Kubernetes:
helm upgrade -i ceph-csi-cephfs ceph-csi/ceph-csi-cephfs -f cephfs.yml -n ceph-csi-cephfs --create-namespace
Poďme do úložiska údajov Ceph a vytvorte tam samostatného používateľa. Dokumentácia uvádza, že poskytovateľ CephFS vyžaduje prístupové práva správcu klastra. 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 pozrime na jeho prístupový kľúč, budeme ho potrebovať neskôr:
ceph auth get-key client.fs
Vytvorme oddelené 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:
# Необходимо для динамически создаваемых томов
adminID: fs
adminKey: <вывод предыдущей команды>
Použitie manifestu:
kubectl apply -f secret.yaml
A teraz - samostatná trieda Storage:
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: csi-cephfs-sc
provisioner: cephfs.csi.ceph.com
parameters:
clusterID: <cluster-id>
# Имя файловой системы CephFS, в которой будет создан том
fsName: cephfs
# (необязательно) Пул Ceph, в котором будут храниться данные тома
# pool: cephfs_data
# (необязательно) Разделенные запятыми опции монтирования для Ceph-fuse
# например:
# fuseMountOptions: debug
# (необязательно) Разделенные запятыми опции монтирования CephFS для ядра
# См. man mount.ceph чтобы узнать список этих опций. Например:
# kernelMountOptions: readdir_max_bytes=1048576,norbytes
# Секреты должны содержать доступы для админа и/или юзера 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
# (необязательно) Драйвер может использовать либо ceph-fuse (fuse),
# либо ceph kernelclient (kernel).
# Если не указано, будет использоваться монтирование томов по умолчанию,
# это определяется поиском ceph-fuse и mount.ceph
# mounter: kernel
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:
- debug
Vyplníme to tu clusterID a použiteľné v Kubernetes:
kubectl apply -f storageclass.yaml
Проверка
Na kontrolu, ako v predchádzajúcom príklade, vytvorte PVC:
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: csi-cephfs-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
storageClassName: csi-cephfs-sc
A skontrolujte prítomnosť PVC/PV:
kubectl get pvc
kubectl get pv
Ak si chcete pozrieť súbory a adresáre v CephFS, môžete tento súborový systém niekde pripojiť. Napríklad, ako je uvedené nižšie.
Poďme do jedného z klastrových uzlov Ceph a vykonajte nasledujúce akcie:
# Точка монтирования
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/cephfs
Samozrejme, montáž FS na uzol Ceph ako je tento je vhodná len na tréningové účely, čo robíme na našich
A nakoniec sa pozrime, ako veci fungujú so zmenou veľkosti zväzkov v prípade CephFS. Vráťme sa ku Kubernetes a upravme náš manifest pre PVC – zväčšite tam veľkosť napríklad na 7Gi.
Použime upravený súbor:
kubectl apply -f pvc.yaml
Pozrime sa na pripojený adresár, aby sme videli, ako sa kvóta zmenila:
getfattr -n ceph.quota.max_bytes <каталог-с-данными>
Aby tento príkaz fungoval, možno budete musieť nainštalovať balík do vášho systému attr.
Oči sa boja, ale ruky áno
Všetky tieto kúzla a dlhé YAML prejavy sa na prvý pohľad zdajú komplikované, ale v praxi ich študenti zo Slurm veľmi rýchlo zorientujú.
V tomto článku sme nešli hlboko do džungle – existuje na to oficiálna dokumentácia. Ak vás zaujímajú podrobnosti o nastavení úložiska Ceph s klastrom Kubernetes, tieto odkazy vám pomôžu:
Na kurze Slurm
A ak vás viac zaujíma ukladanie dát, tak sa prihláste
Autor článku: Alexander Shvalov, praktický inžinier
Zdroj: hab.com