„Container Storage Interface“ (CSI) yra vieninga „Kubernetes“ ir saugojimo sistemų sąsaja. Mes jau trumpai apie tai kalbėjome , o šiandien atidžiau pažvelgsime į CSI ir Ceph derinį: parodysime, kaip į Kubernetes klasterį.
Straipsnyje pateikiami tikri, nors ir šiek tiek supaprastinti pavyzdžiai, kad būtų lengviau suvokti. Mes nesvarstome įdiegti ir konfigūruoti „Ceph“ ir „Kubernetes“ grupių.
Ar jums įdomu, kaip tai veikia?

Taigi, po ranka turite Kubernetes klasterį, įdiegtą, pavyzdžiui, . Netoliese veikia Ceph klasteris – taip pat galite jį įdiegti, pavyzdžiui, su šiuo . Tikiuosi, nereikia minėti, kad gamybai tarp jų turi būti bent 10 Gbit/s pralaidumo tinklas.
Jei visa tai turi, eime!
Pirmiausia eikime į vieną iš Ceph klasterio mazgų ir patikrinkite, ar viskas tvarkoje:
ceph health
ceph -sTada iš karto sukursime RBD diskų telkinį:
ceph osd pool create kube 32
ceph osd pool application enable kube rbdPereikime prie „Kubernetes“ klasterio. Ten, visų pirma, įdiegsime Ceph CSI tvarkyklę, skirtą RBD. Įdiegsime, kaip ir tikėtasi, per Helm.
Pridedame saugyklą su diagrama, gauname ceph-csi-rbd diagramos kintamųjų rinkinį:
helm repo add ceph-csi https://ceph.github.io/csi-charts
helm inspect values ceph-csi/ceph-csi-rbd > cephrbd.ymlDabar reikia užpildyti cephrbd.yml failą. Norėdami tai padaryti, sužinokite Ceph monitorių klasterio ID ir IP adresus:
ceph fsid # так мы узнаем clusterID
ceph mon dump # а так увидим IP-адреса мониторовGautas reikšmes įvedame į failą cephrbd.yml. Tuo pačiu metu leidžiame kurti PSP politiką (Pod Security Policies). Parinktys skyriuose mazgo įskiepis и aprūpintojas jau faile, juos galima taisyti, kaip parodyta toliau:
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: trueToliau mums belieka įdiegti diagramą Kubernetes klasteryje.
helm upgrade -i ceph-csi-rbd ceph-csi/ceph-csi-rbd -f cephrbd.yml -n ceph-csi-rbd --create-namespacePuiku, RBD tvarkyklė veikia!
Sukurkime naują „StorageClass“ „Kubernetes“. Tam vėl reikia šiek tiek padirbėti su Cefu.
Mes sukuriame naują vartotoją Ceph ir suteikiame jam teises rašyti į telkinį kubas:
ceph auth get-or-create client.rbdkube mon 'profile rbd' osd 'profile rbd pool=kube'Dabar pažiūrėkime, kad prieigos raktas vis dar yra:
ceph auth get-key client.rbdkubeKomanda išves kažką panašaus į tai:
AQCO9NJbhYipKRAAMqZsnqqS/T8OYQX20xIa9A==Pridėkime šią reikšmę prie „Secret“ „Kubernetes“ klasteryje – ten, kur mums jos reikia Naudotojo raktas:
---
apiVersion: v1
kind: Secret
metadata:
name: csi-rbd-secret
namespace: ceph-csi-rbd
stringData:
# Значения ключей соответствуют имени пользователя и его ключу, как указано в
# кластере Ceph. ID юзера должен иметь доступ к пулу,
# указанному в storage class
userID: rbdkube
userKey: <user-key>Ir mes sukuriame savo paslaptį:
kubectl apply -f secret.yamlTada mums reikia „StorageClass“ manifesto, panašaus į šį:
---
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:
- discardReikia užpildyti clusterID, kurių komanda jau išmoko ceph fsid, ir pritaikykite šį manifestą Kubernetes klasteriui:
kubectl apply -f storageclass.yamlNorėdami patikrinti, kaip klasteriai veikia kartu, sukurkime šį PVC (nuolatinį tūrio pareiškimą):
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: rbd-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: csi-rbd-scIš karto pažiūrėkime, kaip Kubernetes sukūrė prašomą tomą Ceph:
kubectl get pvc
kubectl get pvViskas atrodo puiku! Kaip tai atrodo Ceph pusėje?
Gauname baseino tomų sąrašą ir peržiūrime informaciją apie mūsų tomą:
rbd ls -p kube
rbd -p kube info csi-vol-eb3d257d-8c6c-11ea-bff5-6235e7640653 # тут, конечно же, будет другой ID тома, который выдала предыдущая командаDabar pažiūrėkime, kaip veikia RBD tomo dydžio keitimas.
Pakeiskite tomo dydį pvc.yaml apraše į 2Gi ir pritaikykite jį:
kubectl apply -f pvc.yamlPalaukite, kol pakeitimai įsigalios, ir dar kartą pažiūrėkime į garsumo dydį.
rbd -p kube info csi-vol-eb3d257d-8c6c-11ea-bff5-6235e7640653
kubectl get pv
kubectl get pvcMatome, kad PVC dydis nepasikeitė. Norėdami sužinoti, kodėl, galite paprašyti Kubernetes YAML PVC aprašymo:
kubectl get pvc rbd-pvc -o yamlŠtai problema:
pranešimas: Laukiama, kol vartotojas (iš naujo) paleis bloką, kad baigtų failų sistemos apimties keitimą mazge. tipas: FileSystemResizePending
Tai reiškia, kad diskas išaugo, bet jame esanti failų sistema – ne.
Norėdami išplėsti failų sistemą, turite prijungti tomą. Mūsų šalyje sukurtas PVC/PV šiuo metu niekaip nenaudojamas.
Galime sukurti bandomąjį Pod, pavyzdžiui, taip:
---
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: falseO dabar pažvelkime į PVC:
kubectl get pvcDydis pasikeitė, viskas gerai.
Pirmoje dalyje dirbome su RBD blokų įrenginiu (jis reiškia Rados Block Device), tačiau to negalima padaryti, jei su šiuo disku vienu metu turi dirbti skirtingos mikropaslaugos. CephFS daug geriau tinka darbui su failais, o ne su disko vaizdais.
Naudodamiesi Ceph ir Kubernetes klasterių pavyzdžiu, sukonfigūruosime CSI ir kitus būtinus objektus, kad jie veiktų su CephFS.
Paimkime reikšmes iš naujos Helm diagramos, kurių mums reikia:
helm inspect values ceph-csi/ceph-csi-cephfs > cephfs.ymlVėl turite užpildyti cephfs.yml failą. Kaip ir anksčiau, Ceph komandos padės:
ceph fsid
ceph mon dumpUžpildykite failą tokiomis reikšmėmis kaip ši:
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: trueAtkreipkite dėmesį, kad monitoriaus adresai nurodomi paprasta forma adresas:portas. Norint pritvirtinti cephfs mazge, šie adresai perkeliami į branduolio modulį, kuris dar nežino, kaip dirbti su v2 monitoriaus protokolu.
Pakeičiame httpMetrics prievadą (Prometheus eis ten stebėti metriką), kad jis neprieštarautų nginx-proxy, kurį įdiegia Kubespray. Jums to gali neprireikti.
Įdiekite „Helm“ diagramą „Kubernetes“ klasteryje:
helm upgrade -i ceph-csi-cephfs ceph-csi/ceph-csi-cephfs -f cephfs.yml -n ceph-csi-cephfs --create-namespaceEikime į Ceph duomenų parduotuvę, kad sukurtume atskirą vartotoją. Dokumentuose teigiama, kad CephFS teikėjas reikalauja klasterio administratoriaus prieigos teisių. Bet mes sukursime atskirą vartotoją fs su ribotomis teisėmis:
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'Ir iš karto pažvelkime į jo prieigos raktą, jo mums prireiks vėliau:
ceph auth get-key client.fsSukurkime atskirą paslaptį ir saugojimo klasę.
Nieko naujo, tai jau matėme UBR pavyzdyje:
---
apiVersion: v1
kind: Secret
metadata:
name: csi-cephfs-secret
namespace: ceph-csi-cephfs
stringData:
# Необходимо для динамически создаваемых томов
adminID: fs
adminKey: <вывод предыдущей команды>Taikant manifestą:
kubectl apply -f secret.yamlO dabar – atskira StorageClass:
---
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:
- debugUžpildykime čia clusterID ir taikoma Kubernetes:
kubectl apply -f storageclass.yamlПроверка
Norėdami patikrinti, kaip ir ankstesniame pavyzdyje, sukurkime PVC:
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: csi-cephfs-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
storageClassName: csi-cephfs-scIr patikrinkite, ar yra PVC / PV:
kubectl get pvc
kubectl get pvJei norite peržiūrėti failus ir katalogus CephFS, galite kur nors prijungti šią failų sistemą. Pavyzdžiui, kaip parodyta žemiau.
Eikime į vieną iš Ceph klasterio mazgų ir atlikime šiuos veiksmus:
# Точка монтирования
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Žinoma, FS montavimas ant tokio Ceph mazgo tinka tik treniruotėms, ką mes darome . Nemanau, kad kas nors tai darytų gamyboje; yra didelė rizika netyčia ištrinti svarbius failus.
Ir galiausiai, patikrinkime, kaip viskas veikia keičiant apimtis CephFS atveju. Grįžkime į „Kubernetes“ ir redaguokite PVC aprašą – padidinkite dydį, pavyzdžiui, iki 7Gi.
Taikykime redaguotą failą:
kubectl apply -f pvc.yamlPažiūrėkime į prijungtą katalogą, kad pamatytumėte, kaip pasikeitė kvota:
getfattr -n ceph.quota.max_bytes <каталог-с-данными>Kad ši komanda veiktų, gali tekti įdiegti paketą savo sistemoje attr.
Akys bijo, bet rankos bijo
Visi šie burtai ir ilgi YAML apraiškos iš pirmo žvilgsnio atrodo sudėtingos, tačiau praktiškai Slurm studentai gana greitai juos įgyja.
Šiame straipsnyje mes nesigilinome į džiungles – tam yra oficiali dokumentacija. Jei jus domina „Ceph“ saugyklos su „Kubernetes“ grupe nustatymo informacija, šios nuorodos padės:
„Slurm“ kursuose galite eiti šiek tiek toliau ir įdiegti tikrą programą Kubernetes, kuri naudos CephFS kaip failų saugyklą. Naudodami GET/POST užklausas galėsite perkelti failus į ir gauti iš Ceph.
O jei jus labiau domina duomenų saugojimas, registruokitės . Kol vyksta beta versijos testavimas, kursą galima įsigyti su nuolaida ir daryti įtaką jo turiniui.
Straipsnio autorius: Aleksandras Shvalovas, praktikuojantis inžinierius , Sertifikuotas Kubernetes administratorius, Slurm kursų autorius ir kūrėjas.
Šaltinis: www.habr.com
