Container Storage Interface (CSI) is 'n verenigde koppelvlak tussen Kubernetes en bergingstelsels. Ons het reeds kortliks daaroor gepraat , en vandag gaan ons die kombinasie van CSI en Ceph van nader bekyk: ons sal wys hoe na die Kubernetes-kluster.
Die artikel verskaf werklike, hoewel effens vereenvoudigde voorbeelde vir gemak van persepsie. Ons oorweeg dit nie om Ceph- en Kubernetes-klusters te installeer en op te stel nie.
Wonder jy hoe dit werk?

So, jy het 'n Kubernetes-kluster by jou vingers, ontplooi, byvoorbeeld, . Daar is 'n Ceph-kluster wat naby werk - jy kan dit byvoorbeeld ook hiermee installeer . Ek hoop dit is nie nodig om te noem dat daar vir produksie tussen hulle 'n netwerk met 'n bandwydte van minstens 10 Gbit/s moet wees nie.
As jy dit alles het, laat ons gaan!
Kom ons gaan eers na een van die Ceph-cluster nodusse en kyk of alles in orde is:
ceph health
ceph -s
Vervolgens sal ons onmiddellik 'n poel vir RBD-skywe skep:
ceph osd pool create kube 32
ceph osd pool application enable kube rbd
Kom ons gaan aan na die Kubernetes-groepering. Daar sal ons eerstens die Ceph CSI-bestuurder vir RBD installeer. Ons sal, soos verwag, deur Helm installeer.
Ons voeg 'n bewaarplek by met 'n grafiek, ons kry 'n stel veranderlikes vir die ceph-csi-rbd grafiek:
helm repo add ceph-csi https://ceph.github.io/csi-charts
helm inspect values ceph-csi/ceph-csi-rbd > cephrbd.yml
Nou moet jy die cephrbd.yml-lΓͺer invul. Om dit te doen, vind die groep-ID en IP-adresse van monitors in Ceph uit:
ceph fsid # ΡΠ°ΠΊ ΠΌΡ ΡΠ·Π½Π°Π΅ΠΌ clusterID
ceph mon dump # Π° ΡΠ°ΠΊ ΡΠ²ΠΈΠ΄ΠΈΠΌ IP-Π°Π΄ΡΠ΅ΡΠ° ΠΌΠΎΠ½ΠΈΡΠΎΡΠΎΠ²
Ons voer die verkryde waardes in die cephrbd.yml-lΓͺer in. Terselfdertyd maak ons ββdie skepping van PSP-beleide (Pod Security Policies) moontlik. Opsies in afdelings nodeplugin ΠΈ voorsiener reeds in die lΓͺer, kan hulle reggestel word soos hieronder getoon:
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
Volgende, al wat vir ons oorbly, is om die grafiek in die Kubernetes-kluster te installeer.
helm upgrade -i ceph-csi-rbd ceph-csi/ceph-csi-rbd -f cephrbd.yml -n ceph-csi-rbd --create-namespace
Groot, die RBD-bestuurder werk!
Kom ons skep 'n nuwe StorageClass in Kubernetes. Dit verg weer 'n bietjie peuter met Ceph.
Ons skep 'n nuwe gebruiker in Ceph en gee hom regte om na die swembad te skryf Kubus:
ceph auth get-or-create client.rbdkube mon 'profile rbd' osd 'profile rbd pool=kube'
Kom ons kyk nou dat die toegangsleutel nog daar is:
ceph auth get-key client.rbdkube
Die opdrag sal iets soos hierdie uitvoer:
AQCO9NJbhYipKRAAMqZsnqqS/T8OYQX20xIa9A==
Kom ons voeg hierdie waarde by Secret in die Kubernetes-groepering β waar ons dit nodig het gebruikerssleutel:
---
apiVersion: v1
kind: Secret
metadata:
name: csi-rbd-secret
namespace: ceph-csi-rbd
stringData:
# ΠΠ½Π°ΡΠ΅Π½ΠΈΡ ΠΊΠ»ΡΡΠ΅ΠΉ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈ Π΅Π³ΠΎ ΠΊΠ»ΡΡΡ, ΠΊΠ°ΠΊ ΡΠΊΠ°Π·Π°Π½ΠΎ Π²
# ΠΊΠ»Π°ΡΡΠ΅ΡΠ΅ Ceph. ID ΡΠ·Π΅ΡΠ° Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅ΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΏΡΠ»Ρ,
# ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡ Π² storage class
userID: rbdkube
userKey: <user-key>
En ons skep ons geheim:
kubectl apply -f secret.yaml
Vervolgens benodig ons 'n StorageClass-manifes iets soos hierdie:
---
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
Moet ingevul word clusterID, wat ons reeds deur die span geleer het ceph fsid, en pas hierdie manifes toe op die Kubernetes-kluster:
kubectl apply -f storageclass.yaml
Om te kyk hoe die trosse saamwerk, kom ons skep die volgende PVC (Persistent Volume Claim):
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: rbd-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: csi-rbd-sc
Kom ons kyk dadelik hoe Kubernetes die gevraagde volume in Ceph geskep het:
kubectl get pvc
kubectl get pv
Alles blyk wonderlik te wees! Hoe lyk dit aan die Ceph-kant?
Ons kry 'n lys van volumes in die swembad en bekyk inligting oor ons volume:
rbd ls -p kube
rbd -p kube info csi-vol-eb3d257d-8c6c-11ea-bff5-6235e7640653 # ΡΡΡ, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ ΠΆΠ΅, Π±ΡΠ΄Π΅Ρ Π΄ΡΡΠ³ΠΎΠΉ ID ΡΠΎΠΌΠ°, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠ΄Π°Π»Π° ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π°
Kom ons kyk nou hoe die grootte van 'n RBD-volume werk.
Verander die volumegrootte in die pvc.yaml-manifes na 2Gi en pas dit toe:
kubectl apply -f pvc.yaml
Kom ons wag vir die veranderinge om in werking te tree en kyk weer na die volume grootte.
rbd -p kube info csi-vol-eb3d257d-8c6c-11ea-bff5-6235e7640653
kubectl get pv
kubectl get pvc
Ons sien dat die grootte van PVC nie verander het nie. Om uit te vind hoekom, kan jy Kubernetes navraag doen vir 'n YAML-beskrywing van die PVC:
kubectl get pvc rbd-pvc -o yaml
Hier is die probleem:
boodskap: Wag vir gebruiker om 'n peul te (her-)begin om lΓͺerstelselgrootte van volume op nodus te voltooi. tipe: FileSystemResizePending
Dit wil sΓͺ, die skyf het gegroei, maar die lΓͺerstelsel daarop het nie.
Om die lΓͺerstelsel te laat groei, moet jy die volume monteer. In ons land word die geskepde PVC/PV tans op geen manier gebruik nie.
Ons kan 'n toetspod skep, byvoorbeeld soos volg:
---
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
En kom ons kyk nou na PVC:
kubectl get pvc
Die grootte het verander, alles is in orde.
In die eerste deel het ons met die RBD-bloktoestel gewerk (dit staan ββvir Rados Block Device), maar dit kan nie gedoen word as verskillende mikrodienste gelyktydig met hierdie skyf moet werk nie. CephFS is baie beter geskik om met lΓͺers te werk eerder as skyfbeelde.
Deur die voorbeeld van Ceph- en Kubernetes-klusters te gebruik, sal ons CSI en ander nodige entiteite konfigureer om met CephFS te werk.
Kom ons kry die waardes uit die nuwe Helm-kaart wat ons nodig het:
helm inspect values ceph-csi/ceph-csi-cephfs > cephfs.yml
Weereens moet jy die cephfs.yml-lΓͺer invul. Soos voorheen, sal Ceph-opdragte help:
ceph fsid
ceph mon dump
Vul die lΓͺer in met waardes soos hierdie:
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
Neem asseblief kennis dat monitor adresse gespesifiseer word in die eenvoudige vorm adres:poort. Om cephfs op 'n nodus te monteer, word hierdie adresse na die kernmodule oorgedra, wat nog nie weet hoe om met die v2-monitorprotokol te werk nie.
Ons verander die poort vir httpMetrics (Prometheus sal daarheen gaan vir monitering van metrieke) sodat dit nie bots met nginx-proxy, wat deur Kubespray geΓ―nstalleer word nie. Jy het dit dalk nie nodig nie.
Installeer die Helm-kaart in die Kubernetes-groepering:
helm upgrade -i ceph-csi-cephfs ceph-csi/ceph-csi-cephfs -f cephfs.yml -n ceph-csi-cephfs --create-namespace
Kom ons gaan na die Ceph-datawinkel om 'n aparte gebruiker daar te skep. Die dokumentasie verklaar dat die CephFS-voorsiener toegangsregte vir groepadministrateur vereis. Maar ons sal 'n aparte gebruiker skep fs met beperkte regte:
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'
En kom ons kyk dadelik na sy toegangsleutel, ons sal dit later nodig hΓͺ:
ceph auth get-key client.fs
Kom ons skep aparte Secret en StorageClass.
Niks nuuts nie, ons het dit reeds in die voorbeeld van RBD gesien:
---
apiVersion: v1
kind: Secret
metadata:
name: csi-cephfs-secret
namespace: ceph-csi-cephfs
stringData:
# ΠΠ΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π»Ρ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ ΡΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΡΡ
ΡΠΎΠΌΠΎΠ²
adminID: fs
adminKey: <Π²ΡΠ²ΠΎΠ΄ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ>
Pas die manifes toe:
kubectl apply -f secret.yaml
En nou - 'n aparte bergingsklas:
---
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
Kom ons vul dit hier in clusterID en van toepassing in Kubernetes:
kubectl apply -f storageclass.yaml
ΠΡΠΎΠ²Π΅ΡΠΊΠ°
Om te kontroleer, soos in die vorige voorbeeld, kom ons skep 'n PVC:
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: csi-cephfs-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
storageClassName: csi-cephfs-sc
En kyk na die teenwoordigheid van PVC/PV:
kubectl get pvc
kubectl get pv
As jy na lΓͺers en gidse in CephFS wil kyk, kan jy hierdie lΓͺerstelsel iewers monteer. Byvoorbeeld soos hieronder getoon.
Kom ons gaan na een van die Ceph cluster nodusse en voer die volgende aksies uit:
# Π’ΠΎΡΠΊΠ° ΠΌΠΎΠ½ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ
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
Natuurlik is die montering van FS op 'n Ceph-knoop soos hierdie slegs geskik vir opleidingsdoeleindes, en dit is wat ons op ons . Ek dink nie iemand sal dit in produksie doen nie; daar is 'n hoΓ« risiko om belangrike lΓͺers per ongeluk uit te vee.
En laastens, kom ons kyk hoe dinge werk met die grootte van volumes in die geval van CephFS. Kom ons keer terug na Kubernetes en wysig ons manifes vir PVC - vergroot die grootte daar, byvoorbeeld, na 7Gi.
Kom ons pas die geredigeerde lΓͺer toe:
kubectl apply -f pvc.yaml
Kom ons kyk na die gemonteerde gids om te sien hoe die kwota verander het:
getfattr -n ceph.quota.max_bytes <ΠΊΠ°ΡΠ°Π»ΠΎΠ³-Ρ-Π΄Π°Π½Π½ΡΠΌΠΈ>
Vir hierdie opdrag om te werk, moet jy dalk die pakket op jou stelsel installeer attr.
Die oΓ« is bang, maar die hande wel
Al hierdie towerspreuke en lang YAML-manifeste lyk op die oog af ingewikkeld, maar in die praktyk kry Slurm-studente hulle redelik vinnig onder die knie.
In hierdie artikel het ons nie diep in die oerwoud ingegaan nie β daar is amptelike dokumentasie daarvoor. As jy belangstel in die besonderhede van die opstel van Ceph-berging met 'n Kubernetes-kluster, sal hierdie skakels help:
Op die Slurm-kursus jy kan 'n bietjie verder gaan en 'n regte toepassing in Kubernetes ontplooi wat CephFS as lΓͺerberging sal gebruik. Deur GET/POS-versoeke sal jy lΓͺers kan oordra na en dit van Ceph ontvang.
En as jy meer belangstel in databerging, teken dan aan vir . Terwyl die beta-toets aan die gang is, kan die kursus teen 'n afslag verkry word en jy kan die inhoud daarvan beΓ―nvloed.
Skrywer van die artikel: Alexander Shvalov, praktiserende ingenieur , Gesertifiseerde Kubernetes-administrateur, skrywer en ontwikkelaar van Slurm-kursusse.
Bron: will.com
