Container Storage Interface (CSI) is 'n verenigde koppelvlak tussen Kubernetes en bergingstelsels. Ons het reeds kortliks daaroor gepraat
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,
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
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
En as jy meer belangstel in databerging, teken dan aan vir
Skrywer van die artikel: Alexander Shvalov, praktiserende ingenieur
Bron: will.com