Container Storage Interface (CSI) ass eng vereenegt Interface tëscht Kubernetes a Späichersystemer. Mir hu schonn kuerz doriwwer geschwat
Den Artikel liwwert richteg, awer liicht vereinfacht Beispiller fir d'Wahrnehmung einfach ze maachen. Mir betruechten net d'Installatioun an d'Konfiguratioun vun Ceph a Kubernetes Cluster.
Frot Dir Iech wéi et funktionnéiert?
Also, Dir hutt e Kubernetes Stärekoup op Äre Fangerspëtzen, ofgebaut, zum Beispill,
Wann Dir dëst alles hutt, loosst eis goen!
Als éischt, loosst eis op ee vun de Ceph Cluster Node goen a kucken ob alles an der Rei ass:
ceph health
ceph -s
Als nächst wäerte mir direkt e Pool fir RBD Disks erstellen:
ceph osd pool create kube 32
ceph osd pool application enable kube rbd
Loosst eis op de Kubernetes Cluster goen. Do wäerte mir als éischt de Ceph CSI Treiber fir RBD installéieren. Mir installéieren, wéi erwaart, duerch Helm.
Mir addéieren e Repository mat engem Diagramm, mir kréien eng Rei Variabelen fir de ceph-csi-rbd Diagramm:
helm repo add ceph-csi https://ceph.github.io/csi-charts
helm inspect values ceph-csi/ceph-csi-rbd > cephrbd.yml
Elo musst Dir d'cephrbd.yml Datei ausfëllen. Fir dëst ze maachen, entdeckt d'Cluster ID an d'IP Adresse vu Monitore am Ceph:
ceph fsid # так мы узнаем clusterID
ceph mon dump # а так увидим IP-адреса мониторов
Mir gitt déi kritt Wäerter an der cephrbd.yml Datei. Zur selwechter Zäit aktivéiere mir d'Schafe vu PSP Politiken (Pod Security Policies). Optiounen an Rubriken nodeplugin и provisor schonn an der Datei, kënne se korrigéiert ginn wéi hei ënnendrënner:
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
Als nächst bleift alles fir eis d'Diagramm am Kubernetes Cluster z'installéieren.
helm upgrade -i ceph-csi-rbd ceph-csi/ceph-csi-rbd -f cephrbd.yml -n ceph-csi-rbd --create-namespace
Super, de RBD Chauffer funktionnéiert!
Loosst eis eng nei StorageClass zu Kubernetes erstellen. Dëst erfuerdert erëm e bëssen mat Ceph.
Mir kreéieren en neie Benotzer am Ceph a ginn him Rechter fir an de Pool ze schreiwen Kube:
ceph auth get-or-create client.rbdkube mon 'profile rbd' osd 'profile rbd pool=kube'
Loosst eis elo kucken datt den Zougangsschlëssel nach ëmmer do ass:
ceph auth get-key client.rbdkube
De Kommando wäert esou eppes ausginn:
AQCO9NJbhYipKRAAMqZsnqqS/T8OYQX20xIa9A==
Loosst eis dëse Wäert op Secret am Kubernetes Cluster addéieren - wou mir et brauchen BenotzerKey:
---
apiVersion: v1
kind: Secret
metadata:
name: csi-rbd-secret
namespace: ceph-csi-rbd
stringData:
# Значения ключей соответствуют имени пользователя и его ключу, как указано в
# кластере Ceph. ID юзера должен иметь доступ к пулу,
# указанному в storage class
userID: rbdkube
userKey: <user-key>
A mir kreéieren eist Geheimnis:
kubectl apply -f secret.yaml
Als nächst brauche mir e StorageClass Manifest eppes wéi dat:
---
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
Muss ausgefëllt ginn ClusterID, déi mir scho vun der Equipe geléiert hunn ceph fsid, an applizéiert dëse Manifest op de Kubernetes Cluster:
kubectl apply -f storageclass.yaml
Fir ze kontrolléieren wéi d'Cluster zesumme schaffen, loosst eis de folgende PVC erstellen (Persistent Volume Claim):
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: rbd-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: csi-rbd-sc
Loosst eis direkt kucken wéi Kubernetes de ugefrote Volumen am Ceph erstallt huet:
kubectl get pvc
kubectl get pv
Alles schéngt super ze sinn! Wéi gesäit dat op der Ceph Säit aus?
Mir kréien eng Lëscht vu Bänn am Pool a kucken Informatiounen iwwer eise Volume:
rbd ls -p kube
rbd -p kube info csi-vol-eb3d257d-8c6c-11ea-bff5-6235e7640653 # тут, конечно же, будет другой ID тома, который выдала предыдущая команда
Loosst eis elo kucken wéi d'Gréisst vun engem RBD Volumen funktionnéiert.
Ännert d'Volumengréisst am pvc.yaml Manifest op 2Gi an gëlt et:
kubectl apply -f pvc.yaml
Loosst eis waarden bis d'Ännerungen a Kraaft trieden a kucken d'Volumengréisst nach eng Kéier.
rbd -p kube info csi-vol-eb3d257d-8c6c-11ea-bff5-6235e7640653
kubectl get pv
kubectl get pvc
Mir gesinn datt d'Gréisst vum PVC net geännert huet. Fir erauszefannen firwat, kënnt Dir Kubernetes ufroen fir eng YAML Beschreiwung vum PVC:
kubectl get pvc rbd-pvc -o yaml
Hei ass de Problem:
Message: Waart op de Benotzer fir e Pod (nei) unzefänken fir d'Gréisst vum Volumen um Node fäerdeg ze maachen. Typ: FileSystemResizePending
Dat ass, d'Disk ass gewuess, awer de Dateiesystem op et ass net.
Fir de Dateiesystem ze wuessen, musst Dir de Volume montéieren. An eisem Land gëtt de geschaafte PVC / PV de Moment op kee Fall benotzt.
Mir kënnen en Test Pod erstellen, zum Beispill esou:
---
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
An elo kucke mer op PVC:
kubectl get pvc
D'Gréisst ass geännert, alles ass gutt.
Am éischten Deel hu mir mam RBD Blockapparat geschafft (et steet fir Rados Block Device), awer dëst kann net gemaach ginn wann verschidde Mikroservicer gläichzäiteg mat dëser Disk musse schaffen. CephFS ass vill besser gëeegent fir mat Dateien ze schaffen anstatt Disk Biller.
Mat dem Beispill vu Ceph a Kubernetes Cluster konfiguréiere mir CSI an aner noutwendeg Entitéite fir mat CephFS ze schaffen.
Loosst eis d'Wäerter vun der neier Helm Chart kréien, déi mir brauchen:
helm inspect values ceph-csi/ceph-csi-cephfs > cephfs.yml
Erëm musst Dir d'cephfs.yml Datei ausfëllen. Wéi virdrun, Ceph Kommandoen hëllefen:
ceph fsid
ceph mon dump
Fëllt d'Datei mat Wäerter aus wéi dës:
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
Notéiert w.e.g. datt d'Iwwerwaachungsadressen an der einfacher Form Adress:port uginn. Fir Cephfs op engem Node ze montéieren, ginn dës Adressen un de Kernelmodul iwwerginn, deen nach net weess wéi et mam v2 Monitor Protokoll funktionnéiert.
Mir änneren den Hafen fir httpMetrics (Prometheus wäert dohinner goen fir Metriken ze iwwerwaachen) sou datt et net mat nginx-Proxy ass, dee vu Kubespray installéiert ass. Dir braucht dat vläicht net.
Installéiert d'Helm Chart am Kubernetes Cluster:
helm upgrade -i ceph-csi-cephfs ceph-csi/ceph-csi-cephfs -f cephfs.yml -n ceph-csi-cephfs --create-namespace
Loosst eis an de Ceph Dategeschäft goen fir e separate Benotzer do ze kreéieren. D'Dokumentatioun seet datt de CephFS Provider Cluster Administrateur Zougangsrechter erfuerdert. Mä mir wäerten eng separat Benotzer schafen fs mat limitéierten Rechter:
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'
A loosst eis direkt säin Zougangsschlëssel kucken, mir brauchen et méi spéit:
ceph auth get-key client.fs
Loosst eis separat Secret a StorageClass erstellen.
Näischt Neies, mir hunn dat schonn am Beispill vu RBD gesinn:
---
apiVersion: v1
kind: Secret
metadata:
name: csi-cephfs-secret
namespace: ceph-csi-cephfs
stringData:
# Необходимо для динамически создаваемых томов
adminID: fs
adminKey: <вывод предыдущей команды>
Uwendung vum Manifest:
kubectl apply -f secret.yaml
An elo - eng separat StorageClass:
---
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
Loosst eis et hei ausfëllen ClusterID an applicabel an Kubernetes:
kubectl apply -f storageclass.yaml
Inspektioun
Fir ze kontrolléieren, wéi am virege Beispill, loosst eis e PVC erstellen:
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: csi-cephfs-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
storageClassName: csi-cephfs-sc
A kontrolléiert d'Präsenz vu PVC / PV:
kubectl get pvc
kubectl get pv
Wann Dir Dateien a Verzeichnisser am CephFS kucke wëllt, kënnt Dir dëse Dateiesystem iergendwou montéieren. Zum Beispill wéi hei ënnendrënner.
Loosst eis op ee vun de Ceph Cluster Node goen an déi folgend Aktiounen ausféieren:
# Точка монтирования
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
Natierlech ass de Montage FS op engem Ceph Node wéi dëst nëmme gëeegent fir Trainingszwecker, dat ass wat mir op eisem
A schliisslech, loosst eis kucken wéi d'Saachen funktionnéieren mat der Gréisst vun der Gréisst am Fall vu CephFS. Loosst eis zréck op Kubernetes an änneren eise Manifest fir PVC - vergréissert d'Gréisst do, zum Beispill, op 7Gi.
Loosst eis déi geännert Datei uwenden:
kubectl apply -f pvc.yaml
Loosst eis de montéierte Verzeechnes kucken fir ze kucken wéi d'Quote geännert huet:
getfattr -n ceph.quota.max_bytes <каталог-с-данными>
Fir dëst Kommando ze schaffen, musst Dir vläicht de Package op Ärem System installéieren attr.
D'Ae fäerten, awer d'Hänn maachen
All dës Zauber a laang YAML Manifestatiounen schéngen op der Uewerfläch komplizéiert ze sinn, awer an der Praxis kréien d'Slurm Studenten zimlech séier d'Hänn.
An dësem Artikel si mir net déif an den Dschungel gaang - et gëtt offiziell Dokumentatioun dofir. Wann Dir un d'Detailer interesséiert sidd fir d'Ceph Storage mat engem Kubernetes Cluster opzestellen, dës Linken hëllefen:
Op der Slurm Course
A wann Dir méi un Datelagerung interesséiert sidd, da mellt Iech un
Auteur vum Artikel: Alexander Shvalov, praktizéierend Ingenieur
Source: will.com