Container Storage Interface (CSI) hè una interfaccia unificata trà Kubernetes è sistemi di almacenamento. L'avemu digià parlatu brevemente
L'articulu furnisce esempi reali, ma ligeramente simplificati per facilità di percepzioni. Ùn avemu micca cunsideratu installà è cunfigurà cluster Ceph è Kubernetes.
Vi dumandate cumu funziona?
Dunque, avete un cluster Kubernetes à a vostra manu, implementatu, per esempiu,
Sì avete tuttu questu, andemu !
Prima, andemu à unu di i nodi di cluster Ceph è verificate chì tuttu hè in ordine:
ceph health
ceph -s
In seguitu, creeremu immediatamente una piscina per i dischi RBD:
ceph osd pool create kube 32
ceph osd pool application enable kube rbd
Passemu à u cluster Kubernetes. Quì, prima di tuttu, installemu u driver Ceph CSI per RBD. Stallaremu, cum'è previstu, attraversu Helm.
Aghjunghjemu un repository cù un graficu, avemu un settore di variàbili per u graficu ceph-csi-rbd:
helm repo add ceph-csi https://ceph.github.io/csi-charts
helm inspect values ceph-csi/ceph-csi-rbd > cephrbd.yml
Avà vi tocca à compie u schedariu cephrbd.yml. Per fà questu, scopre l'ID di cluster è l'indirizzi IP di i monitori in Ceph:
ceph fsid # так мы узнаем clusterID
ceph mon dump # а так увидим IP-адреса мониторов
Insememu i valori ottenuti in u schedariu cephrbd.yml. À u listessu tempu, attivemu a creazione di pulitiche PSP (Pod Security Policies). Opzioni in sezzioni nodeplugin и prestatore digià in u schedariu, ponu esse curretti cum'è mostra quì sottu:
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
In seguitu, tuttu ciò chì ferma per noi hè di installà u graficu in u cluster Kubernetes.
helm upgrade -i ceph-csi-rbd ceph-csi/ceph-csi-rbd -f cephrbd.yml -n ceph-csi-rbd --create-namespace
Grande, u driver RBD funziona!
Creemu una nova StorageClass in Kubernetes. Questu hè ancu bisognu di un pocu di tinkering cù Ceph.
Creemu un novu utilizatore in Ceph è li dete i diritti per scrive à a piscina cubu:
ceph auth get-or-create client.rbdkube mon 'profile rbd' osd 'profile rbd pool=kube'
Avà vedemu chì a chjave d'accessu hè sempre quì:
ceph auth get-key client.rbdkube
U cumandimu hà da pruduce qualcosa cum'è questu:
AQCO9NJbhYipKRAAMqZsnqqS/T8OYQX20xIa9A==
Aghjunghjemu stu valore à Secret in u cluster Kubernetes - induve avemu bisognu UserKey:
---
apiVersion: v1
kind: Secret
metadata:
name: csi-rbd-secret
namespace: ceph-csi-rbd
stringData:
# Значения ключей соответствуют имени пользователя и его ключу, как указано в
# кластере Ceph. ID юзера должен иметь доступ к пулу,
# указанному в storage class
userID: rbdkube
userKey: <user-key>
E creemu u nostru sicretu:
kubectl apply -f secret.yaml
Dopu, avemu bisognu di un manifestu StorageClass qualcosa cum'è questu:
---
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
Hè bisognu à esse cumpletu clusterID, chì avemu digià amparatu da a squadra ceph fsid, è applicà stu manifestu à u cluster Kubernetes:
kubectl apply -f storageclass.yaml
Per verificà cumu i clusters funzionanu inseme, creemu u seguente PVC (Persistent Volume Claim):
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: rbd-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: csi-rbd-sc
Videmu immediatamente cumu Kubernetes hà creatu u voluminu dumandatu in Ceph:
kubectl get pvc
kubectl get pv
Tuttu pare esse grande! Chì pare questu da u latu di Ceph?
Avemu una lista di volumi in a piscina è vede l'infurmazioni nantu à u nostru voluminu:
rbd ls -p kube
rbd -p kube info csi-vol-eb3d257d-8c6c-11ea-bff5-6235e7640653 # тут, конечно же, будет другой ID тома, который выдала предыдущая команда
Avà vedemu cumu resize un voluminu RBD funziona.
Cambia a dimensione di u voluminu in u manifestu pvc.yaml à 2Gi è appricà:
kubectl apply -f pvc.yaml
Aspittemu chì i cambiamenti sò efficaci è fighjemu di novu a dimensione di u voluminu.
rbd -p kube info csi-vol-eb3d257d-8c6c-11ea-bff5-6235e7640653
kubectl get pv
kubectl get pvc
Avemu vistu chì a dimensione di PVC ùn hà micca cambiatu. Per sapè perchè, pudete dumandà à Kubernetes una descrizzione YAML di u PVC:
kubectl get pvc rbd-pvc -o yaml
Eccu u prublema:
missaghju: Aspittendu chì l'utilizatore (ri) principia un pod per finisce u ridimensionamentu di u sistema di fugliale di u voluminu nantu à u node. tipu: FileSystemResizePending
Vale à dì, u discu hè crisciutu, ma u sistema di schedari ùn hà micca.
Per fà cresce u sistema di fugliale, avete bisognu di muntà u voluminu. In u nostru paese, u PVC / PV creatu ùn hè micca usatu in ogni modu.
Pudemu creà un Pod di prova, per esempiu cusì:
---
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
E ora fighjemu u PVC:
kubectl get pvc
A taglia hè cambiata, tuttu hè bè.
In a prima parte, avemu travagliatu cù u dispositivu di bloccu RBD (suppone Rados Block Device), ma questu ùn pò micca esse fattu se diversi microservizii anu bisognu di travaglià cù stu discu simultaneamente. CephFS hè assai megliu adattatu per travaglià cù i schedari piuttostu chè l'imaghjini di discu.
Utilizendu l'esempiu di i cluster Ceph è Kubernetes, cunfiguremu CSI è altre entità necessarie per travaglià cù CephFS.
Pigliamu i valori da u novu graficu Helm chì avemu bisognu:
helm inspect values ceph-csi/ceph-csi-cephfs > cephfs.yml
In novu, avete bisognu à riempie u schedariu cephfs.yml. Cum'è prima, i cumandamenti Ceph aiutanu:
ceph fsid
ceph mon dump
Riempite u schedariu cù valori cum'è questu:
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
Per piacè nutate chì l'indirizzi di u monitoru sò specificati in a forma simplice indirizzu:port. Per muntà cephfs nantu à un node, questi indirizzi sò passati à u modulu di u kernel, chì ùn sapi ancu cumu travaglià cù u protocolu di monitor v2.
Cambiamu u portu per httpMetrics (Prometheus andarà quì per monitorà metriche) per ùn cunflittu cù nginx-proxy, chì hè stallatu da Kubespray. Ùn pudete micca bisognu di questu.
Installa u graficu Helm in u cluster Kubernetes:
helm upgrade -i ceph-csi-cephfs ceph-csi/ceph-csi-cephfs -f cephfs.yml -n ceph-csi-cephfs --create-namespace
Andemu à a tenda di dati Ceph per creà un utilizatore separatu. A documentazione dichjara chì u CephFS furnisce i diritti di accessu di l'amministratore di u cluster. Ma avemu da creà un utilizatore separatu fs cù diritti limitati:
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'
È fighjemu subitu à a so chjave d'accessu, avemu bisognu dopu:
ceph auth get-key client.fs
Creemu Secret è StorageClass separati.
Nunda di novu, avemu digià vistu questu in l'esempiu di RBD:
---
apiVersion: v1
kind: Secret
metadata:
name: csi-cephfs-secret
namespace: ceph-csi-cephfs
stringData:
# Необходимо для динамически создаваемых томов
adminID: fs
adminKey: <вывод предыдущей команды>
Applicà u manifestu:
kubectl apply -f secret.yaml
È avà - una StorageClass separata:
---
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
Fighjemu quì clusterID è applicabile in Kubernetes:
kubectl apply -f storageclass.yaml
pirmittennu
Per verificà, cum'è in l'esempiu precedente, creamu un PVC:
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: csi-cephfs-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
storageClassName: csi-cephfs-sc
È verificate a presenza di PVC / PV:
kubectl get pvc
kubectl get pv
Se vulete guardà i fugliali è i cartulari in CephFS, pudete muntà stu sistema di fugliale in qualchì locu. Per esempiu, cum'è mostra sottu.
Andemu à unu di i nodi di cluster Ceph è eseguite e seguenti azzioni:
# Точка монтирования
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
Di sicuru, a muntagna FS nantu à un node Ceph cum'è questu hè adattatu solu per scopi di furmazione, chì hè ciò chì facemu nantu à u nostru
È infine, cuntrollemu cumu si travaglianu e cose cù volumi di ridimensionamentu in u casu di CephFS. Riturnemu à Kubernetes è edità u nostru manifestu per PVC - cresce a dimensione quì, per esempiu, à 7Gi.
Applichemu u schedariu editatu:
kubectl apply -f pvc.yaml
Fighjemu u cartulare muntatu per vede cumu a quota hà cambiatu:
getfattr -n ceph.quota.max_bytes <каталог-с-данными>
Per fà stu cumandamentu, pudete bisognu di stallà u pacchettu in u vostru sistema attr.
L'ochji anu a paura, ma e mani
Tutti questi incantesimi è longu manifesti YAML parenu cumplicati nantu à a superficia, ma in pratica, i studienti di Slurm li piglianu abbastanza rapidamente.
In questu articulu ùn avemu micca andatu in a jungla - ci hè una documentazione ufficiale per quessa. Sè site interessatu in i dettagli di a cunfigurazione di l'almacenamiento Ceph cù un cluster Kubernetes, sti ligami aiutanu:
Nantu à u corsu Slurm
È s'è vo site più interessatu in u almacenamentu di dati, allora iscrive
Autore di l 'articulu: Alexander Shvalov, ingegnere praticanti
Source: www.habr.com