Container Storage Interface (CSI) միասնական ինտերֆեյս է Kubernetes-ի և պահեստավորման համակարգերի միջև: Հակիրճ նրա մասին մենք արդեն
Հոդվածը պարունակում է իրական, թեև փոքր-ինչ պարզեցված օրինակներ ընկալման հեշտության համար: Մենք չենք դիտարկում Ceph և Kubernetes կլաստերների տեղադրումն ու կազմաձևումը:
Ձեզ հետաքրքրում է, թե ինչպես է այն աշխատում:
Այսպիսով, դուք ձեռքի տակ ունեք Kubernetes կլաստեր, որը տեղակայված է, օրինակ,
Եթե ունես այս ամենը, գնանք։
Նախ, եկեք գնանք Ceph կլաստերի հանգույցներից մեկը և ստուգենք, որ ամեն ինչ կարգին է.
ceph health
ceph -s
Հաջորդը, մենք անմիջապես կստեղծենք լողավազան RBD սկավառակների համար.
ceph osd pool create kube 32
ceph osd pool application enable kube rbd
Եկեք գնանք Kubernetes կլաստերին: Այնտեղ, առաջին հերթին, մենք կտեղադրենք Ceph CSI դրայվերը RBD-ի համար։ Մենք կտեղադրենք, ինչպես և սպասվում էր, Helm-ի միջոցով:
Ավելացրեք շտեմարան գծապատկերով, ստացեք ceph-csi-rbd գծապատկերների փոփոխականների մի շարք.
helm repo add ceph-csi https://ceph.github.io/csi-charts
helm inspect values ceph-csi/ceph-csi-rbd > cephrbd.yml
Այժմ դուք պետք է լրացնեք cephrbd.yml ֆայլը: Դա անելու համար մենք պարզում ենք Ceph-ում մոնիտորների կլաստերի ID-ն և IP հասցեները.
ceph fsid # так мы узнаем clusterID
ceph mon dump # а так увидим IP-адреса мониторов
Ստացված արժեքները մուտքագրվում են cephrbd.yml ֆայլում: Ճանապարհին մենք հնարավորություն ենք տալիս ստեղծել PSP քաղաքականության (Pod Security Policies): Բաժնի Ընտրանքներ հանգույցի պլագին и մատակարարող արդեն ֆայլում, դրանք կարող են ուղղվել, ինչպես ցույց է տրված ստորև.
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
Այնուհետև մեզ մնում է աղյուսակը տեղադրել Kubernetes կլաստերում:
helm upgrade -i ceph-csi-rbd ceph-csi/ceph-csi-rbd -f cephrbd.yml -n ceph-csi-rbd --create-namespace
Գերազանց, RBD վարորդն աշխատում է:
Եկեք ստեղծենք նոր StorageClass Kubernetes-ում: Սա կրկին պահանջում է որոշակի աշխատանք Ceph-ի հետ:
Ստեղծեք նոր օգտվող Ceph-ում և թույլ տվեք նրան գրել լողավազանին կուբե:
ceph auth get-or-create client.rbdkube mon 'profile rbd' osd 'profile rbd pool=kube'
Եվ հիմա տեսնենք, որ մուտքի բանալին դեռ կա.
ceph auth get-key client.rbdkube
Հրամանը դուրս կգա այսպիսի մի բան.
AQCO9NJbhYipKRAAMqZsnqqS/T8OYQX20xIa9A==
Եկեք այս արժեքը դնենք Secret-ում Kubernetes կլաստերում, որտեղ այն մեզ անհրաժեշտ է userKey:
---
apiVersion: v1
kind: Secret
metadata:
name: csi-rbd-secret
namespace: ceph-csi-rbd
stringData:
# Значения ключей соответствуют имени пользователя и его ключу, как указано в
# кластере Ceph. ID юзера должен иметь доступ к пулу,
# указанному в storage class
userID: rbdkube
userKey: <user-key>
Եվ մենք ստեղծում ենք մեր գաղտնիքը.
kubectl apply -f secret.yaml
Հաջորդը, մեզ պետք է նման բան StorageClass մանիֆեստի:
---
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
Պետք է լրացնել clusterID, որը մենք արդեն տեղեկացել ենք թիմից ceph fsid, և կիրառեք այս մանիֆեստը Kubernetes կլաստերի վրա.
kubectl apply -f storageclass.yaml
Կլաստերների աշխատանքը փաթեթում ստուգելու համար եկեք ստեղծենք հետևյալ PVC-ը (Հաստատուն ծավալի պահանջ).
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: rbd-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: csi-rbd-sc
Եկեք անմիջապես տեսնենք, թե ինչպես Kubernetes-ը ստեղծեց պահանջվող ծավալը Ceph-ում.
kubectl get pvc
kubectl get pv
Ամեն ինչ, կարծես, հիանալի է: Իսկ ինչպիսի՞ն է այն Ceph-ի կողմից:
Մենք ստանում ենք լողավազանի հատորների ցանկը և դիտում ենք մեր ծավալի մասին տեղեկությունները.
rbd ls -p kube
rbd -p kube info csi-vol-eb3d257d-8c6c-11ea-bff5-6235e7640653 # тут, конечно же, будет другой ID тома, который выдала предыдущая команда
Այժմ տեսնենք, թե ինչպես է աշխատում RBD ծավալի չափափոխումը:
Փոխեք ձայնի չափը pvc.yaml մանիֆեստում 2Gi-ի և կիրառեք այն.
kubectl apply -f pvc.yaml
Սպասենք, որ փոփոխություններն ուժի մեջ մտնեն և ևս մեկ անգամ նայենք ծավալի չափին:
rbd -p kube info csi-vol-eb3d257d-8c6c-11ea-bff5-6235e7640653
kubectl get pv
kubectl get pvc
Մենք տեսնում ենք, որ PVC-ի չափը չի փոխվել: Դուք կարող եք Kubernetes-ից խնդրել PVC-ի նկարագրությունը YAML ձևաչափով՝ պարզելու, թե ինչու.
kubectl get pvc rbd-pvc -o yaml
Եվ ահա խնդիրը.
Հաղորդագրություն. Սպասում է, որ օգտատերը (վեր)սկսի պատիճը, որպեսզի ավարտի ֆայլային համակարգի ծավալի չափը հանգույցի վրա: տեսակը՝ FileSystemResizePending
Այսինքն՝ սկավառակն աճել է, իսկ դրա վրա գտնվող ֆայլային համակարգը՝ ոչ։
Ֆայլային համակարգը ընդլայնելու համար անհրաժեշտ է միացնել ձայնը: Մեր դեպքում ստեղծված PVC/PV-ն այժմ ոչ մի կերպ չի օգտագործվում:
Մենք կարող ենք ստեղծել թեստային pod հետևյալ կերպ.
---
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
Եվ հիմա եկեք նայենք PVC-ին.
kubectl get pvc
Չափը փոխվել է, ամեն ինչ կարգին է։
Առաջին մասում մենք աշխատել ենք RBD բլոկ սարքի հետ (այն նշանակում է Rados Block Device), բայց դա հնարավոր չէ անել, եթե ցանկանում եք միաժամանակ աշխատել տարբեր միկրոծառայությունների այս սկավառակի հետ։ Ֆայլերի հետ աշխատելու համար, քան սկավառակի պատկերով, CephFS-ը շատ ավելի հարմար է:
Օգտագործելով Ceph և Kubernetes կլաստերների օրինակը՝ մենք կկազմաձևենք CSI-ն և այլ անհրաժեշտ սուբյեկտները՝ CephFS-ի հետ աշխատելու համար:
Եկեք ստանանք արժեքները նոր Helm աղյուսակից, որը մեզ անհրաժեշտ է.
helm inspect values ceph-csi/ceph-csi-cephfs > cephfs.yml
Կրկին, դուք պետք է լրացնեք cephfs.yml ֆայլը: Ինչպես նախկինում, Ceph հրամանները կօգնեն.
ceph fsid
ceph mon dump
Մենք ֆայլը լրացնում ենք հետևյալ արժեքներով.
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
Նկատի ունեցեք, որ մոնիտորի հասցեները նշված են պարզ ձևի հասցե:port: Հոսթի վրա cephfs տեղադրելու համար այս հասցեները փոխանցվում են միջուկի մոդուլին, որը դեռ չգիտի, թե ինչպես աշխատել մոնիտորինգի արձանագրության v2-ի հետ:
Մենք փոխում ենք պորտը httpMetrics-ի համար (Prometheus-ը կգնա այնտեղ՝ մոնիտորինգի չափումների համար), որպեսզի այն չհակասի nginx-proxy-ին, որը տեղադրված է Kubespray-ի կողմից։ Հնարավոր է՝ սա ձեզ պետք չէ։
Տեղադրեք Helm աղյուսակը Kubernetes կլաստերում.
helm upgrade -i ceph-csi-cephfs ceph-csi/ceph-csi-cephfs -f cephfs.yml -n ceph-csi-cephfs --create-namespace
Եկեք անցնենք Ceph տվյալների խանութին՝ այնտեղ առանձին օգտվող ստեղծելու համար: Փաստաթղթում նշվում է, որ CephFS մատակարարին անհրաժեշտ են կլաստերի ադմինիստրատորի մուտքի իրավունքներ: Բայց մենք կստեղծենք առանձին օգտվող fs սահմանափակ իրավունքներով.
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'
Եվ անմիջապես եկեք տեսնենք դրա մուտքի բանալին, այն օգտակար կլինի մեզ հետագա.
ceph auth get-key client.fs
Եկեք ստեղծենք առանձին Secret և StorageClass:
Ոչ մի նոր բան, մենք դա արդեն տեսել ենք RBD-ի օրինակով.
---
apiVersion: v1
kind: Secret
metadata:
name: csi-cephfs-secret
namespace: ceph-csi-cephfs
stringData:
# Необходимо для динамически создаваемых томов
adminID: fs
adminKey: <вывод предыдущей команды>
Մանիֆեստի կիրառում.
kubectl apply -f secret.yaml
Եվ հիմա՝ առանձին 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
Լրացրե՛ք այստեղ clusterID և կիրառելի է Kubernetes-ում.
kubectl apply -f storageclass.yaml
Проверка
Ստուգելու համար, ինչպես նախորդ օրինակում, եկեք ստեղծենք PVC.
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: csi-cephfs-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
storageClassName: csi-cephfs-sc
Եվ ստուգեք PVC/PV.
kubectl get pvc
kubectl get pv
Եթե ցանկանում եք դիտել CephFS-ի ֆայլերը և գրացուցակները, կարող եք տեղադրել այս ֆայլային համակարգը ինչ-որ տեղ: Օրինակ, ինչպես ցույց է տրված ստորև:
Մենք գնում ենք Ceph կլաստերի հանգույցներից մեկը և կատարում հետևյալ գործողությունները.
# Точка монтирования
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
Իհարկե, Ceph հանգույցի վրա նման FS տեղադրումը հարմար է միայն ուսումնական նպատակների համար, ինչը մենք անում ենք մեր
Եվ վերջապես, եկեք ստուգենք, թե ինչպես են գործերը աշխատում ծավալի չափափոխման դեպքում CephFS-ի դեպքում: Մենք վերադառնում ենք Kubernetes և խմբագրում ենք մեր մանիֆեստը PVC-ի համար. մենք այնտեղ չափը մեծացնում ենք, օրինակ, մինչև 7Gi:
Կիրառել խմբագրված ֆայլը.
kubectl apply -f pvc.yaml
Տեսնենք, թե ինչպես է փոխվել քվոտան տեղադրված գրացուցակում.
getfattr -n ceph.quota.max_bytes <каталог-с-данными>
Որպեսզի այս հրամանն աշխատի, գուցե անհրաժեշտ լինի տեղադրել փաթեթը attr.
Աչքերը վախենում են, բայց ձեռքերը վախենում են
Արտաքնապես, այս բոլոր կախարդանքները և երկարատև YAML դրսևորումները բարդ են թվում, բայց գործնականում Slurm-ի ուսանողները բավականին արագ են վերաբերվում դրանց:
Այս հոդվածում մենք չենք խորացել վայրի բնության մեջ, դրա համար պաշտոնական փաստաթղթեր կան: Եթե ձեզ հետաքրքրում է Kubernetes կլաստերի միջոցով Ceph պահեստը կարգավորելու մանրամասները, այս հղումները կօգնեն.
Դասընթացի վրա Slurm
Եվ եթե դուք ավելի շատ հետաքրքրված եք տվյալների պահպանման հարցում, ապա գրանցվեք
Հոդվածի հեղինակ՝ Ալեքսանդր Շվալով, պրակտիկ ինժեներ
Source: www.habr.com