Kiolesura cha Kuhifadhi Kontena (CSI) ni kiolesura kilichounganishwa kati ya Kubernetes na mifumo ya kuhifadhi. Tayari tumezungumza juu yake kwa ufupi , na leo tutaangalia kwa karibu mchanganyiko wa CSI na Ceph: tutaonyesha jinsi gani kwa nguzo ya Kubernetes.
Nakala hiyo inatoa mifano halisi, ingawa iliyorahisishwa kidogo kwa urahisi wa utambuzi. Hatuzingatii kusakinisha na kusanidi makundi ya Ceph na Kubernetes.
Je, unashangaa jinsi inavyofanya kazi?

Kwa hivyo, unayo nguzo ya Kubernetes kwenye vidole vyako, iliyotumwa, kwa mfano, . Kuna nguzo ya Ceph inayofanya kazi karibu - unaweza pia kuiweka, kwa mfano, na hii . Natumaini hakuna haja ya kutaja kwamba kwa ajili ya uzalishaji kati yao lazima iwe na mtandao na bandwidth ya angalau 10 Gbit / s.
Ikiwa unayo haya yote, twende!
Kwanza, wacha tuende kwenye moja ya nodi za nguzo za Ceph na angalia ikiwa kila kitu kiko sawa:
ceph health
ceph -sIfuatayo, tutaunda mara moja dimbwi la diski za RBD:
ceph osd pool create kube 32
ceph osd pool application enable kube rbdWacha tuendelee kwenye nguzo ya Kubernetes. Huko, kwanza kabisa, tutaweka dereva wa Ceph CSI kwa RBD. Tutasakinisha, kama inavyotarajiwa, kupitia Helm.
Tunaongeza hazina na chati, tunapata seti ya vigeu vya chati ya ceph-csi-rbd:
helm repo add ceph-csi https://ceph.github.io/csi-charts
helm inspect values ceph-csi/ceph-csi-rbd > cephrbd.ymlSasa unahitaji kujaza faili ya cephrbd.yml. Ili kufanya hivyo, tafuta kitambulisho cha nguzo na anwani za IP za wachunguzi katika Ceph:
ceph fsid # так мы узнаем clusterID
ceph mon dump # а так увидим IP-адреса мониторовTunaingiza maadili yaliyopatikana kwenye faili ya cephrbd.yml. Wakati huo huo, tunawezesha uundaji wa sera za PSP (Sera za Usalama wa Pod). Chaguzi katika sehemu nodeplugin и mtoaji tayari kwenye faili, zinaweza kusahihishwa kama inavyoonyeshwa hapa chini:
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: trueIfuatayo, kilichobaki kwetu ni kusakinisha chati katika nguzo ya Kubernetes.
helm upgrade -i ceph-csi-rbd ceph-csi/ceph-csi-rbd -f cephrbd.yml -n ceph-csi-rbd --create-namespaceKubwa, dereva wa RBD anafanya kazi!
Hebu tuunde Darasa jipya la Hifadhi katika Kubernetes. Hii inahitaji tena kuchezea Ceph.
Tunaunda mtumiaji mpya katika Ceph na kumpa haki ya kuandika kwenye bwawa Mchemraba:
ceph auth get-or-create client.rbdkube mon 'profile rbd' osd 'profile rbd pool=kube'Sasa hebu tuone ufunguo wa ufikiaji bado upo:
ceph auth get-key client.rbdkubeAmri itatoa kitu kama hiki:
AQCO9NJbhYipKRAAMqZsnqqS/T8OYQX20xIa9A==Wacha tuongeze dhamana hii kwa Siri katika nguzo ya Kubernetes - ambapo tunaihitaji ufunguo wa mtumiaji:
---
apiVersion: v1
kind: Secret
metadata:
name: csi-rbd-secret
namespace: ceph-csi-rbd
stringData:
# Значения ключей соответствуют имени пользователя и его ключу, как указано в
# кластере Ceph. ID юзера должен иметь доступ к пулу,
# указанному в storage class
userID: rbdkube
userKey: <user-key>Na tunaunda siri yetu:
kubectl apply -f secret.yamlIfuatayo, tunahitaji dhihirisho la StorageClass kitu kama hiki:
---
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:
- discardInahitajika kujazwa clusterID, ambayo tayari tumejifunza na timu ceph fsid, na utumie faili hii ya maelezo kwa nguzo ya Kubernetes:
kubectl apply -f storageclass.yamlIli kuangalia jinsi vishada vinavyofanya kazi pamoja, hebu tuunde PVC ifuatayo (Madai ya Kiasi Kinachoendelea):
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: rbd-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: csi-rbd-scWacha tuone mara moja jinsi Kubernetes aliunda kiasi kilichoombwa katika Ceph:
kubectl get pvc
kubectl get pvKila kitu kinaonekana kuwa nzuri! Je, hii inaonekanaje kwa upande wa Ceph?
Tunapata orodha ya juzuu kwenye dimbwi na kutazama habari kuhusu kiasi chetu:
rbd ls -p kube
rbd -p kube info csi-vol-eb3d257d-8c6c-11ea-bff5-6235e7640653 # тут, конечно же, будет другой ID тома, который выдала предыдущая командаSasa hebu tuone jinsi kubadilisha ukubwa wa kiasi cha RBD kunavyofanya kazi.
Badilisha ukubwa wa sauti katika faili ya maelezo ya pvc.yaml hadi 2Gi na uitumie:
kubectl apply -f pvc.yamlWacha tusubiri mabadiliko yaanze na tuangalie saizi ya sauti tena.
rbd -p kube info csi-vol-eb3d257d-8c6c-11ea-bff5-6235e7640653
kubectl get pv
kubectl get pvcTunaona kwamba ukubwa wa PVC haujabadilika. Ili kujua ni kwa nini, unaweza kuuliza Kubernetes kwa maelezo ya YAML ya PVC:
kubectl get pvc rbd-pvc -o yamlHili hapa tatizo:
ujumbe: Inasubiri mtumiaji (re-) kuanzisha ganda ili kumaliza urekebishaji wa mfumo wa faili wa kiasi kwenye nodi. aina: FileSystemResizePending
Hiyo ni, disk imeongezeka, lakini mfumo wa faili juu yake haujawa.
Ili kukuza mfumo wa faili, unahitaji kuweka kiasi. Katika nchi yetu, PVC/PV iliyoundwa haitumiwi sasa kwa njia yoyote.
Tunaweza kuunda Pod ya majaribio, kwa mfano kama hii:
---
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: falseNa sasa hebu tuangalie PVC:
kubectl get pvcUkubwa umebadilika, kila kitu ni sawa.
Katika sehemu ya kwanza, tulifanya kazi na kifaa cha kuzuia RBD (inasimama kwa Rados Block Device), lakini hii haiwezi kufanyika ikiwa microservices tofauti zinahitaji kufanya kazi na diski hii wakati huo huo. CephFS inafaa zaidi kwa kufanya kazi na faili badala ya picha za diski.
Kwa kutumia mfano wa makundi ya Ceph na Kubernetes, tutasanidi CSI na huluki nyingine muhimu ili kufanya kazi na CephFS.
Wacha tupate maadili kutoka kwa chati mpya ya Helm tunayohitaji:
helm inspect values ceph-csi/ceph-csi-cephfs > cephfs.ymlTena unahitaji kujaza faili ya cephfs.yml. Kama hapo awali, amri za Ceph zitasaidia:
ceph fsid
ceph mon dumpJaza faili na maadili kama haya:
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: trueTafadhali kumbuka kuwa anwani za ufuatiliaji zimebainishwa katika fomu rahisi ya anwani:bandari. Kuweka cephfs kwenye nodi, anwani hizi huhamishiwa kwenye moduli ya kernel, ambayo bado haijui jinsi ya kufanya kazi na itifaki ya kufuatilia v2.
Tunabadilisha bandari kwa ajili ya httpMetrics (Prometheus itaenda huko kwa vipimo vya ufuatiliaji) ili isipingane na seva mbadala ya nginx, ambayo imesakinishwa na Kubespray. Huenda usihitaji hili.
Sakinisha chati ya Helm katika nguzo ya Kubernetes:
helm upgrade -i ceph-csi-cephfs ceph-csi/ceph-csi-cephfs -f cephfs.yml -n ceph-csi-cephfs --create-namespaceWacha tuende kwenye duka la data la Ceph ili kuunda mtumiaji tofauti hapo. Nyaraka zinasema kuwa mtoaji wa CephFS anahitaji haki za ufikiaji wa msimamizi wa nguzo. Lakini tutaunda mtumiaji tofauti fs na haki chache:
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'Na wacha tuangalie mara moja ufunguo wake wa ufikiaji, tutauhitaji baadaye:
ceph auth get-key client.fsWacha tuunde Siri tofauti na Darasa la Hifadhi.
Hakuna jipya, tayari tumeona hili kwa mfano wa RBD:
---
apiVersion: v1
kind: Secret
metadata:
name: csi-cephfs-secret
namespace: ceph-csi-cephfs
stringData:
# Необходимо для динамически создаваемых томов
adminID: fs
adminKey: <вывод предыдущей команды>Utumiaji wa faili ya maelezo:
kubectl apply -f secret.yamlNa sasa - StorageClass tofauti:
---
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:
- debugHebu tujaze hapa clusterID na inatumika katika Kubernetes:
kubectl apply -f storageclass.yamlПроверка
Kuangalia, kama katika mfano uliopita, wacha tuunda PVC:
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: csi-cephfs-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
storageClassName: csi-cephfs-scNa angalia uwepo wa PVC/PV:
kubectl get pvc
kubectl get pvIkiwa unataka kuangalia faili na saraka katika CephFS, unaweza kuweka mfumo huu wa faili mahali fulani. Kwa mfano kama inavyoonyeshwa hapa chini.
Wacha tuende kwenye moja ya nodi za nguzo za Ceph na tufanye vitendo vifuatavyo:
# Точка монтирования
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/cephfsKwa kweli, kuweka FS kwenye nodi ya Ceph kama hii inafaa tu kwa madhumuni ya mafunzo, ambayo ndio tunafanya kwenye yetu. . Sidhani kama mtu yeyote angefanya hivi katika toleo la umma; kuna hatari kubwa ya kufuta faili muhimu kwa bahati mbaya.
Na mwishowe, wacha tuangalie jinsi mambo yanavyofanya kazi na kurekebisha ukubwa katika kesi ya CephFS. Hebu turejee Kubernetes na kuhariri faili yetu ya maelezo ya PVC - ongeza saizi hapo, kwa mfano, hadi 7Gi.
Wacha tutumie faili iliyohaririwa:
kubectl apply -f pvc.yamlWacha tuangalie saraka iliyowekwa ili kuona jinsi upendeleo umebadilika:
getfattr -n ceph.quota.max_bytes <каталог-с-данными>Ili amri hii ifanye kazi, huenda ukahitaji kusakinisha kifurushi kwenye mfumo wako attr.
Macho yanaogopa, lakini mikono hufanya hivyo
Taharuki hizi zote na maonyesho marefu ya YAML yanaonekana kuwa magumu kwenye uso, lakini kiutendaji, wanafunzi wa Slurm huzipata kwa haraka sana.
Katika nakala hii hatukuingia ndani kabisa ya msitu - kuna nyaraka rasmi za hiyo. Ikiwa una nia ya maelezo ya kusanidi hifadhi ya Ceph na nguzo ya Kubernetes, viungo hivi vitasaidia:
Kwenye kozi ya Slurm unaweza kwenda mbele kidogo na kupeleka programu-tumizi halisi katika Kubernetes ambayo itatumia CephFS kama hifadhi ya faili. Kupitia maombi ya GET/POST utaweza kuhamisha faili hadi na kuzipokea kutoka kwa Ceph.
Na ikiwa una nia zaidi ya kuhifadhi data, basi jiandikishe . Wakati jaribio la beta likiendelea, kozi inaweza kupatikana kwa punguzo na unaweza kuathiri maudhui yake.
Mwandishi wa makala: Alexander Shvalov, mhandisi wa mazoezi , Msimamizi Aliyeidhinishwa wa Kubernetes, mwandishi na msanidi wa kozi za Slurm.
Chanzo: mapenzi.com
