Kiolesura cha Kuhifadhi Kontena (CSI) ni kiolesura kilichounganishwa kati ya Kubernetes na mifumo ya kuhifadhi. Tayari tumezungumza juu yake kwa ufupi
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,
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 -s
Ifuatayo, tutaunda mara moja dimbwi la diski za RBD:
ceph osd pool create kube 32
ceph osd pool application enable kube rbd
Wacha 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.yml
Sasa 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: true
Ifuatayo, 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-namespace
Kubwa, 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.rbdkube
Amri 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.yaml
Ifuatayo, 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:
- discard
Inahitajika kujazwa clusterID, ambayo tayari tumejifunza na timu ceph fsid, na utumie faili hii ya maelezo kwa nguzo ya Kubernetes:
kubectl apply -f storageclass.yaml
Ili 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-sc
Wacha tuone mara moja jinsi Kubernetes aliunda kiasi kilichoombwa katika Ceph:
kubectl get pvc
kubectl get pv
Kila 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.yaml
Wacha 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 pvc
Tunaona 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 yaml
Hili 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: false
Na sasa hebu tuangalie PVC:
kubectl get pvc
Ukubwa 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.yml
Tena unahitaji kujaza faili ya cephfs.yml. Kama hapo awali, amri za Ceph zitasaidia:
ceph fsid
ceph mon dump
Jaza 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: true
Tafadhali 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-namespace
Wacha 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.fs
Wacha 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.yaml
Na 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:
- debug
Hebu 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-sc
Na angalia uwepo wa PVC/PV:
kubectl get pvc
kubectl get pv
Ikiwa 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/cephfs
Kwa kweli, kuweka FS kwenye nodi ya Ceph kama hii inafaa tu kwa madhumuni ya mafunzo, ambayo ndio tunafanya kwenye yetu.
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.yaml
Wacha 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
Na ikiwa una nia zaidi ya kuhifadhi data, basi jiandikishe
Mwandishi wa makala: Alexander Shvalov, mhandisi wa mazoezi
Chanzo: mapenzi.com