Container Storage Interface (CSI) Àr ett enhetligt grÀnssnitt för interaktion mellan Kubernetes och lagringssystem. Kortfattat har vi redan , men idag kommer vi att titta nÀrmare pÄ kopplingen mellan CSI och Ceph: vi kommer att visa hur till Kubernetes-klustret.
Artikeln innehÄller verkliga, Àven om de Àr nÄgot förenklade för att underlÀtta förstÄelsen exempel. Installationen och konfigurationen av Ceph- och Kubernetes-kluster kommer vi inte att ta upp.
Ăr du nyfiken pĂ„ hur det fungerar?

SĂ„, du har ett Kubernetes-kluster tillgĂ€ngligt, till exempel . Bredvid det körs ett Ceph-kluster â det kan ocksĂ„ installeras, till exempel med detta . Jag hoppas att det inte behöver nĂ€mnas att det mellan dem i produktion bör finnas ett nĂ€tverk med en bandbredd pĂ„ minst 10 Gbit/s.
Om du har allt detta, dÄ kör vi!
Först gÄr vi in pÄ en av noderna i Ceph-klustret och kontrollerar att allt stÄr rÀtt till:
ceph health
ceph -sDÀrefter skapar vi direkt en pool för RBD-diskar:
ceph osd pool create kube 32
ceph osd pool application enable kube rbdVi gÄr till Kubernetes-klustret. DÀr installerar vi först Ceph CSI-drivrutinen för RBD. Vi kommer att installera det, som vi ska, via Helm.
Vi lÀgger till ett repository med diagrammet och fÄr en uppsÀttning diagramvariabler för ceph-csi-rbd:
helm repo add ceph-csi https://ceph.github.io/csi-charts
helm inspect values ceph-csi/ceph-csi-rbd > cephrbd.ymlNu mÄste vi fylla i filen cephrbd.yml. För detta tar vi reda pÄ ID för klustret och IP-adresserna till monitorerna i Ceph:
ceph fsid # sÄ fÄr vi clusterID
ceph mon dump # sÄ ser vi IP-adresserna till monitorernaDe erhÄllna vÀrdena förs in i filen cephrbd.yml. Samtidigt aktiverar vi skapandet av PSP-policyer (Pod Security Policies). Alternativen i avsnitt nodeplugin och provisioner finns redan i filen, de kan Àndras som visas nedan:
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: trueDÀrefter Àr allt vi har kvar att göra att installera diagrammet i Kubernetes-klustret.
helm upgrade -i ceph-csi-rbd ceph-csi/ceph-csi-rbd -f cephrbd.yml -n ceph-csi-rbd --create-namespacePerfekt, RBD-drivrutinen fungerar!
LÄt oss skapa en ny StorageClass i Kubernetes. För detta kommer vi Äterigen att behöva arbeta lite med Ceph.
Vi skapar en ny anvÀndare i Ceph och ger den rÀttigheter att skriva till poolen kube:
ceph auth get-or-create client.rbdkube mon 'profile rbd' osd 'profile rbd pool=kube'Och nu kan vi se Ätkomstnyckeln dÀr:
ceph auth get-key client.rbdkubeKommandot kommer att ge nÄgot liknande:
AQCO9NJbhYipKRAAMqZsnqqS/T8OYQX20xIa9A==Vi kommer att lĂ€gga detta vĂ€rde i Secret i Kubernetes-klustret â dit dĂ€r det behövs userKey:
---
apiVersion: v1
kind: Secret
metadata:
name: csi-rbd-secret
namespace: ceph-csi-rbd
stringData:
# VÀrdena för nycklarna motsvarar anvÀndarnamn och dess nyckel, som angivits i
# Ceph-klustret. AnvÀndarens ID mÄste ha Ätkomst till poolen,
# som anges i lagringsklassen
userID: rbdkube
userKey:Och vi skapar vÄr hemlighet:
kubectl apply -f secret.yamlDÀrefter behöver vi en sÄdan manifest för StorageClass:
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: csi-rbd-sc
provisioner: rbd.csi.ceph.com
parameters:
clusterID:
pool: kube
imageFeatures: layering
# Dessa hemligheter mÄste innehÄlla data för autentisering
# mot din pool.
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:
- discardDet mÄste fyllas i clusterID, som vi redan har fÄtt veta med kommandot ceph fsid, och vi ska tillÀmpa denna manifest i Kubernetes-klustret:
kubectl apply -f storageclass.yamlFör att kontrollera hur kluster fungerar tillsammans, lÄt oss skapa en sÄdan PVC (Persistent Volume Claim):
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: rbd-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: csi-rbd-scLÄt oss genast se hur Kubernetes skapade den begÀrda volymen i Ceph:
kubectl get pvc
kubectl get pvSer ut som allt Àr bra! Men hur ser det ut pÄ Ceph-sidan?
Vi fÄr en lista över volymer i poolen och ser information om vÄr volym:
rbd ls -p kube
rbd -p kube info csi-vol-eb3d257d-8c6c-11ea-bff5-6235e7640653 # hÀr kommer givetvis ett annat volym-ID som gavs av föregÄende kommandoLÄt oss nu se hur storleksÀndringen av RBD-volymen fungerar.
Vi Àndrar storleken pÄ volymen i manifestet pvc.yaml till 2Gi och tillÀmpar det:
kubectl apply -f pvc.yamlLÄt oss vÀnta pÄ att Àndringarna trÀder i kraft och se pÄ storleken pÄ volymen igen.
rbd -p kube info csi-vol-eb3d257d-8c6c-11ea-bff5-6235e7640653
kubectl get pv
kubectl get pvcVi ser att storleken pÄ PVC inte har Àndrats. För att ta reda pÄ orsaken kan vi be Kubernetes beskriva PVC:n i YAML-format:
kubectl get pvc rbd-pvc -o yamlOch hÀr Àr problemet:
message: Waiting for user to (re-)start a pod to finish file system resize of volume on node. type: FileSystemResizePending
Det vill sÀga att disken har ökat, men filsystemet pÄ den har inte.
För att öka filsystemet mÄste volymen monteras. VÄr skapade PVC/PV anvÀnds varken nu.
Vi kan skapa en test-Pod, till exempel sÄ hÀr:
---
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: falseOch nu lÄt oss titta pÄ PVC:
kubectl get pvcStorleken har Àndrats, allt Àr i sin ordning.
I den första delen arbetade vi med RBD-blockenheten (det stÄr för Rados Block Device), men det gÄr inte att göra sÄ om olika mikrotjÀnster behöver arbeta med denna disk samtidigt. För att hantera filer, istÀllet för diskavbildningar, Àr CephFS mycket bÀttre lÀmpad.
Vi kommer att konfigurera CSI och andra nödvÀndiga enheter för att arbeta med CephFS i Exempel pÄ Ceph- och Kubernetes-kluster.
Vi fÄr vÀrden frÄn den nödvÀndiga nya Helm-diagrammet:
helm inspect values ceph-csi/ceph-csi-cephfs > cephfs.ymlDet Àr Äterigen nödvÀndigt att fylla i filen cephfs.yml. Precis som tidigare kommer Ceph-kommandon att hjÀlpa:
ceph fsid
ceph mon dumpVi fyller i filen med vÀrden ungefÀr sÄ hÀr:
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: trueObservera att monitoradresserna anges i enkel form address:port. För att montera cephfs pÄ noden skickas dessa adresser till kÀrnmodulen, som Ànnu inte kan hantera v2-monitorprotokollet.
Porten för httpMetrics (dÀr Prometheus kommer att hÀmta metrics för övervakning) Àndrar vi sÄ att den inte konflikterar med nginx-proxy, som installeras av Kubespray. Du kanske inte behöver göra detta.
Vi installerar Helm-diagrammet i Kubernetes-klustret:
helm upgrade -i ceph-csi-cephfs ceph-csi/ceph-csi-cephfs -f cephfs.yml -n ceph-csi-cephfs --create-namespaceVi gÄr till Ceph-lagringen för att skapa en separat anvÀndare dÀr. Dokumentationen anger att CephFS-provisioneraren behöver admin-rÀttigheter till klustret. Men vi kommer att skapa en separat anvÀndare fs med begrÀnsade rÀttigheter:
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'Och lÄt oss omedelbart titta pÄ dess Ätkomstnyckel, den kommer att vara anvÀndbar för oss senare:
ceph auth get-key client.fsVi skapar separata Secret och StorageClass.
Inget nytt, vi har redan sett detta pÄ exempelvis RBD:
---
apiVersion: v1
kind: Secret
metadata:
name: csi-cephfs-secret
namespace: ceph-csi-cephfs
stringData:
# NödvÀndigt för dynamiskt skapade volymer
adminID: fs
adminKey:Vi tillÀmpar manifestet:
kubectl apply -f secret.yamlOch nu â en separat StorageClass:
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: csi-cephfs-sc
provisioner: cephfs.csi.ceph.com
parameters:
clusterID:
# Namn pÄ CephFS-filsystemet dÀr volymen kommer att skapas
fsName: cephfs
# (valfritt) Ceph-pool dÀr data för volymen kommer att lagras
# pool: cephfs_data
# (valfritt) Komma-separerade monteringsalternativ för Ceph-fuse
# exempel:
# fuseMountOptions: debug
# (valfritt) Komma-separerade monteringsalternativ för CephFS för kÀrnan
# Se man mount.ceph för att se listan över dessa alternativ. Till exempel:
# kernelMountOptions: readdir_max_bytes=1048576,norbytes
# Hemligheterna mÄste innehÄlla behörigheter för admin och/eller Ceph-anvÀndare.
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
# (valfritt) Drivrutinen kan anvÀnda antingen ceph-fuse (fuse),
# eller ceph kernelclient (kernel).
# Om det inte anges, kommer standardmontage av volymer att anvÀndas,
# detta bestÀms genom att söka efter ceph-fuse och mount.ceph
# mounter: kernel
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:
- debugLÄt oss fylla i det hÀr clusterID och tillÀmpa det i Kubernetes:
kubectl apply -f storageclass.yamlKontroll
För att kontrollera, precis som i det föregÄende exemplet, skapar vi en PVC:
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: csi-cephfs-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
storageClassName: csi-cephfs-scOch vi kontrollerar förekomsten av PVC/PV:
kubectl get pvc
kubectl get pvOm du vill titta pÄ filer och kataloger i CephFS kan du montera detta filsystem nÄgonstans. Till exempel, som visas nedan.
Vi gÄr till en av Ceph-klusterknutpunkterna och utför följande ÄtgÀrder:
# ĐąĐŸŃĐșа ĐŒĐŸĐœŃĐžŃĐŸĐČĐ°ĐœĐžŃ
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/cephfsSjÀlvklart, denna montering av FS pÄ en Ceph-nod Àr endast lÀmplig för utbildningssyften, vilket vi sysslar med pÄ vÄra . Jag tror inte att nÄgon skulle göra detta i produktion, risken för att av misstag skriva över viktiga filer Àr stor.
Och sista men inte minst, lÄt oss kontrollera hur det stÄr till med storleksÀndring av volymer i CephFS. Vi ÄtervÀnder till Kubernetes och redigerar vÄrt manifest för PVC - vi ökar storleken till exempel till 7Gi.
Vi tillÀmpar den redigerade filen:
kubectl apply -f pvc.yamlVi kollar pÄ den monterade katalogen, hur kvoten har förÀndrats:
getfattr -n ceph.quota.max_bytesFör att köra detta kommando kan du behöva installera paketet attr.
Ăgonen Ă€r rĂ€dda, men hĂ€nderna gör jobbet
Vid ytan kan alla dessa trollformler och lÄnga YAML-manifest som verkar komplicerade, men i praktiken förstÄr eleverna pÄ Slurm dem ganska snabbt.
I den hĂ€r artikeln gĂ„r vi inte in pĂ„ detaljer â det finns officiell dokumentation för det. Om du Ă€r intresserad av detaljer kring konfiguration av Ceph-lagring tillsammans med Kubernetes-klustret, kan dessa lĂ€nkar vara till hjĂ€lp:
PÄ Slurm-kursen kan du gÄ ett steg lÀngre och implementera en verklig applikation i Kubernetes som anvÀnder CephFS som lagring för filer. Genom GET/POST-förfrÄgningar kan du överföra filer och hÀmta dem frÄn Ceph.
Och om du Àr mer intresserad av datalagring, anmÀl dig till . Under betatestningen kan kursen fÄs till rabatterat pris och pÄverka innehÄllet.
Artikelns författare: Alexander Shvalov, praktiserande ingenjör , Certifierad Kubernetes-administratör, författare och utvecklare av Slurm-kurser.
KĂ€lla: habr.com
