Konteyner Saxlama İnterfeysi (CSI) Kubernetes və saxlama sistemləri arasında vahid interfeysdir. Artıq bu barədə qısaca danışdıq
Məqalədə qavrama asanlığı üçün real, bir qədər sadələşdirilmiş nümunələr verilmişdir. Biz Ceph və Kubernetes klasterlərinin quraşdırılmasını və konfiqurasiyasını düşünmürük.
Bunun necə işlədiyini merak edirsiniz?
Beləliklə, barmaqlarınızın ucunda yerləşdirilmiş bir Kubernetes klasteriniz var, məsələn,
Bütün bunlar varsa, gedək!
Əvvəlcə Ceph klaster qovşaqlarından birinə gedək və hər şeyin qaydasında olduğunu yoxlayaq:
ceph health
ceph -s
Sonra dərhal RBD diskləri üçün hovuz yaradacağıq:
ceph osd pool create kube 32
ceph osd pool application enable kube rbd
Gəlin Kubernetes klasterinə keçək. Orada, ilk növbədə, RBD üçün Ceph CSI sürücüsünü quraşdıracağıq. Gözlənildiyi kimi Helm vasitəsilə quraşdıracağıq.
Diaqramla bir depo əlavə edirik, ceph-csi-rbd diaqramı üçün bir sıra dəyişənlər alırıq:
helm repo add ceph-csi https://ceph.github.io/csi-charts
helm inspect values ceph-csi/ceph-csi-rbd > cephrbd.yml
İndi cephrbd.yml faylını doldurmalısınız. Bunu etmək üçün Ceph-də monitorların klaster ID və IP ünvanlarını tapın:
ceph fsid # так мы узнаем clusterID
ceph mon dump # а так увидим IP-адреса мониторов
Alınan dəyərləri cephrbd.yml faylına daxil edirik. Eyni zamanda, biz PSP siyasətlərinin (Pod Security Policies) yaradılmasına imkan veririk. Bölmələrdə seçimlər nodeplugin и təminatçı artıq fayldadır, onlar aşağıda göstərildiyi kimi düzəldilə bilər:
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
Bundan sonra, bizə qalan yalnız Kubernetes klasterində qrafiki quraşdırmaqdır.
helm upgrade -i ceph-csi-rbd ceph-csi/ceph-csi-rbd -f cephrbd.yml -n ceph-csi-rbd --create-namespace
Əla, RBD sürücüsü işləyir!
Gəlin Kubernetes-də yeni StorageClass yaradaq. Bu, yenə Ceph ilə bir az məşğul olmağı tələb edir.
Ceph-də yeni istifadəçi yaradırıq və ona hovuza yazmaq hüququ veririk kub:
ceph auth get-or-create client.rbdkube mon 'profile rbd' osd 'profile rbd pool=kube'
İndi giriş açarının hələ də orada olduğuna baxaq:
ceph auth get-key client.rbdkube
Komanda bu kimi bir şey çıxaracaq:
AQCO9NJbhYipKRAAMqZsnqqS/T8OYQX20xIa9A==
Gəlin bu dəyəri Kubernetes klasterindəki Gizliyə əlavə edək - bizə lazım olan yerdə istifadəçi açarı:
---
apiVersion: v1
kind: Secret
metadata:
name: csi-rbd-secret
namespace: ceph-csi-rbd
stringData:
# Значения ключей соответствуют имени пользователя и его ключу, как указано в
# кластере Ceph. ID юзера должен иметь доступ к пулу,
# указанному в storage class
userID: rbdkube
userKey: <user-key>
Və sirrimizi yaradırıq:
kubectl apply -f secret.yaml
Sonra, bizə belə bir StorageClass manifestinə ehtiyacımız var:
---
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
Doldurmaq lazımdır clusterID, bunu komanda tərəfindən artıq öyrənmişik ceph fsid, və bu manifesti Kubernetes klasterinə tətbiq edin:
kubectl apply -f storageclass.yaml
Klasterlərin birlikdə necə işlədiyini yoxlamaq üçün aşağıdakı PVC-ni yaradaq (Daimi Həcm İddiası):
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: rbd-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: csi-rbd-sc
Gəlin dərhal Kubernetesin Ceph-də tələb olunan həcmi necə yaratdığına baxaq:
kubectl get pvc
kubectl get pv
Hər şey əla görünür! Bu Ceph tərəfində nə kimi görünür?
Hovuzdakı cildlərin siyahısını alırıq və həcmimiz haqqında məlumatlara baxırıq:
rbd ls -p kube
rbd -p kube info csi-vol-eb3d257d-8c6c-11ea-bff5-6235e7640653 # тут, конечно же, будет другой ID тома, который выдала предыдущая команда
İndi gəlin RBD həcminin ölçüsünün dəyişdirilməsinin necə işlədiyini görək.
pvc.yaml manifestindəki səs ölçüsünü 2Gi olaraq dəyişdirin və tətbiq edin:
kubectl apply -f pvc.yaml
Dəyişikliklərin qüvvəyə minməsini gözləyək və yenidən həcm ölçüsünə baxaq.
rbd -p kube info csi-vol-eb3d257d-8c6c-11ea-bff5-6235e7640653
kubectl get pv
kubectl get pvc
PVC-nin ölçüsünün dəyişmədiyini görürük. Səbəbini öyrənmək üçün PVC-nin YAML təsviri üçün Kubernetes-ə müraciət edə bilərsiniz:
kubectl get pvc rbd-pvc -o yaml
Problem budur:
mesaj: İstifadəçinin fayl sisteminin qovşaqdakı həcmin ölçüsünü tamamlamaq üçün podu (yenidən) işə salmasını gözləyir. növü: FileSystemResizePending
Yəni disk böyüdü, ancaq üzərindəki fayl sistemi böyümədi.
Fayl sistemini böyütmək üçün həcmi quraşdırmaq lazımdır. Ölkəmizdə yaradılmış PVC/PV hal-hazırda heç bir şəkildə istifadə edilmir.
Test Pod yarada bilərik, məsələn, bu kimi:
---
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
İndi PVC-yə baxaq:
kubectl get pvc
Ölçü dəyişib, hər şey qaydasındadır.
Birinci hissədə biz RBD blok cihazı ilə işlədik (bu, Rados Blok Cihazı deməkdir), lakin müxtəlif mikroservislərin bu disklə eyni vaxtda işləməsi lazım olduqda bunu etmək mümkün deyil. CephFS disk şəkillərindən daha çox fayllarla işləmək üçün daha uyğundur.
Ceph və Kubernetes klasterlərinin nümunəsindən istifadə edərək, biz CSI və digər zəruri qurumları CephFS ilə işləmək üçün konfiqurasiya edəcəyik.
Bizə lazım olan yeni Helm diaqramından dəyərləri əldə edək:
helm inspect values ceph-csi/ceph-csi-cephfs > cephfs.yml
Yenə cephfs.yml faylını doldurmalısınız. Əvvəlki kimi, Ceph əmrləri kömək edəcək:
ceph fsid
ceph mon dump
Faylı bu kimi dəyərlərlə doldurun:
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
Nəzərə alın ki, monitor ünvanları sadə ünvan formasında göstərilmişdir: port. Cephf-ləri bir node üzərində quraşdırmaq üçün bu ünvanlar v2 monitor protokolu ilə işləməyi hələ bilməyən kernel moduluna köçürülür.
Kubespray tərəfindən quraşdırılmış nginx-proxy ilə ziddiyyət təşkil etməməsi üçün httpMetrics üçün portu dəyişdiririk (Prometheus metrikləri izləmək üçün oraya gedəcək). Bu sizə lazım olmaya bilər.
Kubernetes klasterində Helm diaqramını quraşdırın:
helm upgrade -i ceph-csi-cephfs ceph-csi/ceph-csi-cephfs -f cephfs.yml -n ceph-csi-cephfs --create-namespace
Orada ayrıca istifadəçi yaratmaq üçün Ceph məlumat mağazasına gedək. Sənədlər CephFS provayderinin klaster administratoruna giriş hüquqlarını tələb etdiyini bildirir. Amma biz ayrıca istifadəçi yaradacağıq fs məhdud hüquqlarla:
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'
Dərhal onun giriş açarına baxaq, sonra bizə lazım olacaq:
ceph auth get-key client.fs
Gəlin ayrı Secret və StorageClass yaradaq.
Yeni heç nə yoxdur, biz bunu RBD nümunəsində artıq görmüşük:
---
apiVersion: v1
kind: Secret
metadata:
name: csi-cephfs-secret
namespace: ceph-csi-cephfs
stringData:
# Необходимо для динамически создаваемых томов
adminID: fs
adminKey: <вывод предыдущей команды>
Manifestin tətbiqi:
kubectl apply -f secret.yaml
İndi - ayrı bir 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
Gəlin onu burada dolduraq clusterID və Kubernetesdə tətbiq olunur:
kubectl apply -f storageclass.yaml
Проверка
Yoxlamaq üçün, əvvəlki nümunədə olduğu kimi, PVC yaradaq:
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: csi-cephfs-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
storageClassName: csi-cephfs-sc
Və PVC/PV varlığını yoxlayın:
kubectl get pvc
kubectl get pv
CephFS-də fayl və qovluqlara baxmaq istəyirsinizsə, bu fayl sistemini hardasa quraşdıra bilərsiniz. Məsələn, aşağıda göstərildiyi kimi.
Gəlin Ceph klaster qovşaqlarından birinə keçək və aşağıdakı hərəkətləri yerinə yetirək:
# Точка монтирования
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
Əlbəttə ki, belə bir Ceph node üzərində FS montajı yalnız məşq məqsədləri üçün uyğundur, biz bunu özümüzdə edirik.
Və nəhayət, gəlin CephFS vəziyyətində həcmlərin ölçüsünü dəyişdirməklə işlərin necə işlədiyini yoxlayaq. Kubernetes-ə qayıdaq və PVC üçün manifestimizi redaktə edək - orada ölçüsünü, məsələn, 7Gi-ə qədər artırın.
Redaktə edilmiş faylı tətbiq edək:
kubectl apply -f pvc.yaml
Kvotanın necə dəyişdiyini görmək üçün quraşdırılmış kataloqa baxaq:
getfattr -n ceph.quota.max_bytes <каталог-с-данными>
Bu əmrin işləməsi üçün paketi sisteminizə quraşdırmalı ola bilərsiniz attr.
Gözlər qorxur, amma əllər qorxur
Bütün bu sehrlər və uzun YAML təzahürləri zahirdə mürəkkəb görünür, lakin praktikada Slurm tələbələri onları çox tez mənimsəyir.
Bu yazıda biz cəngəlliyə getmədik - bunun üçün rəsmi sənədlər var. Kubernetes klasteri ilə Ceph yaddaşının qurulmasının təfərrüatları ilə maraqlanırsınızsa, bu bağlantılar kömək edəcək:
Slurm kursunda
Əgər məlumatların saxlanması ilə daha çox maraqlanırsınızsa, qeydiyyatdan keçin
Məqalənin müəllifi: Aleksandr Şvalov, praktik mühəndis
Mənbə: www.habr.com