Ndërfaqja e ruajtjes së kontejnerëve (CSI) është një ndërfaqe e unifikuar midis Kubernetes dhe sistemeve të ruajtjes. Ne kemi folur tashmë për të shkurtimisht
Artikulli ofron shembuj realë, megjithëse pak të thjeshtuar për lehtësinë e perceptimit. Ne nuk e konsiderojmë instalimin dhe konfigurimin e grupeve Ceph dhe Kubernetes.
A po pyesni veten se si funksionon?
Pra, ju keni një grup Kubernetes në majë të gishtave tuaj, të vendosur, për shembull,
Nëse i keni të gjitha këto, le të shkojmë!
Së pari, le të shkojmë në një nga nyjet e grupit Ceph dhe të kontrollojmë nëse gjithçka është në rregull:
ceph health
ceph -s
Më pas, ne do të krijojmë menjëherë një pishinë për disqet RBD:
ceph osd pool create kube 32
ceph osd pool application enable kube rbd
Le të kalojmë te grupi Kubernetes. Atje, para së gjithash, ne do të instalojmë drejtuesin Ceph CSI për RBD. Ne do të instalojmë, siç pritej, përmes Helm.
Shtojmë një depo me një grafik, marrim një grup variablash për grafikun ceph-csi-rbd:
helm repo add ceph-csi https://ceph.github.io/csi-charts
helm inspect values ceph-csi/ceph-csi-rbd > cephrbd.yml
Tani duhet të plotësoni skedarin cephrbd.yml. Për ta bërë këtë, zbuloni ID-në e grupit dhe adresat IP të monitorëve në Ceph:
ceph fsid # так мы узнаем clusterID
ceph mon dump # а так увидим IP-адреса мониторов
Ne futim vlerat e marra në skedarin cephrbd.yml. Në të njëjtën kohë, ne mundësojmë krijimin e politikave PSP (Pod Security Policies). Opsionet në seksione nodeplugin и ofrues tashmë në skedar, ato mund të korrigjohen siç tregohet më poshtë:
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
Tjetra, gjithçka që na mbetet është të instalojmë grafikun në grupin Kubernetes.
helm upgrade -i ceph-csi-rbd ceph-csi/ceph-csi-rbd -f cephrbd.yml -n ceph-csi-rbd --create-namespace
E shkëlqyeshme, drejtuesi i RBD funksionon!
Le të krijojmë një StorageClass të ri në Kubernetes. Kjo kërkon përsëri një grindje me Ceph.
Ne krijojmë një përdorues të ri në Ceph dhe i japim atij të drejtën për të shkruar në pishinë Kub:
ceph auth get-or-create client.rbdkube mon 'profile rbd' osd 'profile rbd pool=kube'
Tani le të shohim se çelësi i hyrjes është ende atje:
ceph auth get-key client.rbdkube
Komanda do të nxjerrë diçka si kjo:
AQCO9NJbhYipKRAAMqZsnqqS/T8OYQX20xIa9A==
Le ta shtojmë këtë vlerë tek Secret në grupin Kubernetes - aty ku na nevojitet çelësi i përdoruesit:
---
apiVersion: v1
kind: Secret
metadata:
name: csi-rbd-secret
namespace: ceph-csi-rbd
stringData:
# Значения ключей соответствуют имени пользователя и его ключу, как указано в
# кластере Ceph. ID юзера должен иметь доступ к пулу,
# указанному в storage class
userID: rbdkube
userKey: <user-key>
Dhe ne krijojmë sekretin tonë:
kubectl apply -f secret.yaml
Më pas, na duhet një manifest StorageClass diçka si kjo:
---
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
Duhet të plotësohet ClusterID, të cilën e kemi mësuar tashmë nga ekipi ceph fsid, dhe zbatoni këtë manifest në grupimin Kubernetes:
kubectl apply -f storageclass.yaml
Për të kontrolluar se si grupet funksionojnë së bashku, le të krijojmë PVC-në e mëposhtme (Pretendimi i Vëllimit të Përhershëm):
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: rbd-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: csi-rbd-sc
Le të shohim menjëherë se si Kubernetes krijoi vëllimin e kërkuar në Ceph:
kubectl get pvc
kubectl get pv
Gjithçka duket se është e mrekullueshme! Si duket kjo në anën e Cefit?
Ne marrim një listë të vëllimeve në pishinë dhe shohim informacione rreth vëllimit tonë:
rbd ls -p kube
rbd -p kube info csi-vol-eb3d257d-8c6c-11ea-bff5-6235e7640653 # тут, конечно же, будет другой ID тома, который выдала предыдущая команда
Tani le të shohim se si funksionon ndryshimi i madhësisë së një vëllimi RBD.
Ndryshoni madhësinë e volumit në manifestin pvc.yaml në 2Gi dhe aplikojeni:
kubectl apply -f pvc.yaml
Le të presim që ndryshimet të hyjnë në fuqi dhe të shikojmë përsëri madhësinë e volumit.
rbd -p kube info csi-vol-eb3d257d-8c6c-11ea-bff5-6235e7640653
kubectl get pv
kubectl get pvc
Ne shohim se madhësia e PVC nuk ka ndryshuar. Për të zbuluar pse, mund të kërkoni Kubernetes për një përshkrim YAML të PVC:
kubectl get pvc rbd-pvc -o yaml
Këtu është problemi:
mesazhi: Në pritje që përdoruesi të (ri-)nisë një pod për të përfunduar ndryshimin e madhësisë së volumit të sistemit të skedarëve në nyje. lloji: FileSystemResizePending
Kjo do të thotë, disku është rritur, por sistemi i skedarëve në të jo.
Për të rritur sistemin e skedarëve, duhet të montoni volumin. Në vendin tonë, PVC/PV e krijuar aktualisht nuk përdoret në asnjë mënyrë.
Ne mund të krijojmë një Pod testimi, për shembull si ky:
---
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
Dhe tani le të shohim PVC:
kubectl get pvc
Madhësia ka ndryshuar, gjithçka është në rregull.
Në pjesën e parë, ne kemi punuar me pajisjen e bllokut RBD (ai qëndron për Rados Block Device), por kjo nuk mund të bëhet nëse mikroshërbime të ndryshme duhet të punojnë me këtë disk njëkohësisht. CephFS është shumë më i përshtatshëm për të punuar me skedarë sesa me imazhe të diskut.
Duke përdorur shembullin e grupeve Ceph dhe Kubernetes, ne do të konfigurojmë CSI dhe entitete të tjera të nevojshme për të punuar me CephFS.
Le të marrim vlerat nga grafiku i ri Helm që na nevojitet:
helm inspect values ceph-csi/ceph-csi-cephfs > cephfs.yml
Përsëri duhet të plotësoni skedarin cephfs.yml. Si më parë, komandat e Ceph do të ndihmojnë:
ceph fsid
ceph mon dump
Plotësoni skedarin me vlera si kjo:
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
Ju lutemi vini re se adresat e monitorit janë të specifikuara në formularin e thjeshtë adresa:port. Për të montuar cephfs në një nyje, këto adresa transferohen në modulin e kernelit, i cili ende nuk di të punojë me protokollin e monitorit v2.
Ne ndryshojmë portin për httpMetrics (Prometheus do të shkojë atje për metrikat e monitorimit) në mënyrë që të mos bie ndesh me nginx-proxy, i cili është i instaluar nga Kubespray. Ju mund të mos keni nevojë për këtë.
Instaloni grafikun Helm në grupin Kubernetes:
helm upgrade -i ceph-csi-cephfs ceph-csi/ceph-csi-cephfs -f cephfs.yml -n ceph-csi-cephfs --create-namespace
Le të shkojmë në dyqanin e të dhënave Ceph për të krijuar një përdorues të veçantë atje. Dokumentacioni thotë se ofruesi i CephFS kërkon të drejtat e aksesit të administratorit të grupit. Por ne do të krijojmë një përdorues të veçantë fs me të drejta të kufizuara:
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'
Dhe le të shohim menjëherë çelësin e tij të hyrjes, do të na duhet më vonë:
ceph auth get-key client.fs
Le të krijojmë Secret dhe StorageClass të veçantë.
Asgjë e re, ne e kemi parë tashmë këtë në shembullin e RBD:
---
apiVersion: v1
kind: Secret
metadata:
name: csi-cephfs-secret
namespace: ceph-csi-cephfs
stringData:
# Необходимо для динамически создаваемых томов
adminID: fs
adminKey: <вывод предыдущей команды>
Zbatimi i manifestit:
kubectl apply -f secret.yaml
Dhe tani - një StorageClass më vete:
---
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
Le ta plotësojmë këtu ClusterID dhe i zbatueshëm në Kubernetes:
kubectl apply -f storageclass.yaml
Проверка
Për të kontrolluar, si në shembullin e mëparshëm, le të krijojmë një PVC:
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: csi-cephfs-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
storageClassName: csi-cephfs-sc
Dhe kontrolloni praninë e PVC/PV:
kubectl get pvc
kubectl get pv
Nëse dëshironi të shikoni skedarët dhe drejtoritë në CephFS, mund ta montoni këtë sistem skedari diku. Për shembull siç tregohet më poshtë.
Le të shkojmë në një nga nyjet e grupit Ceph dhe të kryejmë veprimet e mëposhtme:
# Точка монтирования
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
Sigurisht, montimi i FS në një nyje Ceph si kjo është i përshtatshëm vetëm për qëllime trajnimi, gjë që bëjmë në
Dhe së fundi, le të kontrollojmë se si funksionojnë gjërat me ndryshimin e madhësisë së vëllimeve në rastin e CephFS. Le të kthehemi te Kubernetes dhe të modifikojmë manifestin tonë për PVC - rrisni madhësinë atje, për shembull, në 7Gi.
Le të aplikojmë skedarin e redaktuar:
kubectl apply -f pvc.yaml
Le të shohim drejtorinë e montuar për të parë se si ka ndryshuar kuota:
getfattr -n ceph.quota.max_bytes <каталог-с-данными>
Që kjo komandë të funksionojë, mund t'ju duhet të instaloni paketën në sistemin tuaj attr.
Sytë kanë frikë, por duart kanë
Të gjitha këto magji dhe manifestime të gjata YAML duken të ndërlikuara në sipërfaqe, por në praktikë, studentët Slurm i kuptojnë shumë shpejt.
Në këtë artikull ne nuk hymë thellë në xhungël - ka dokumentacion zyrtar për këtë. Nëse jeni të interesuar për detajet e konfigurimit të ruajtjes së Ceph me një grup Kubernetes, këto lidhje do t'ju ndihmojnë:
Në kursin Slurm
Dhe nëse jeni më të interesuar për ruajtjen e të dhënave, atëherë regjistrohuni
Autori i artikullit: Alexander Shvalov, inxhinier praktik
Burimi: www.habr.com