Интерфейси нигаҳдории контейнер (CSI) интерфейси ягонаи байни Kubernetes ва системаҳои нигоҳдорӣ мебошад. Мо аллакай дар ин бора ба таври мухтасар сухан ронда будем
Дар мақола мисолҳои воқеӣ, ҳарчанд каме соддакардашуда барои осонии дарк оварда шудаанд. Мо насб ва конфигуратсияи кластерҳои Ceph ва Kubernetes-ро баррасӣ намекунем.
Оё шумо ҳайронед, ки он чӣ гуна кор мекунад?
Ҳамин тавр, шумо кластери Kubernetes дар сарангушти худ доред, ки ҷойгир карда шудааст, масалан,
Агар шумо ин ҳама дошта бошед, биёед!
Аввалан, биёед ба яке аз гиреҳҳои кластери Ceph равем ва санҷед, ки ҳама чиз дуруст аст:
ceph health
ceph -s
Минбаъд, мо фавран барои дискҳои RBD ҳавз эҷод мекунем:
ceph osd pool create kube 32
ceph osd pool application enable kube rbd
Биёед ба кластери Кубернетес гузарем. Дар он ҷо, пеш аз ҳама, мо драйвери 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 -ро пур кунед. Барои ин кор, ID кластер ва IP суроғаҳои мониторҳоро дар Ceph пайдо кунед:
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 кор мекунад!
Биёед дар Kubernetes StorageClass нав эҷод кунем. Ин боз як каме кор кардан бо Сефро талаб мекунад.
Мо дар 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
Биёед фавран бубинем, ки чӣ тавр Кубернетес ҳаҷми дархостшударо дар 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 тағйир наёфтааст. Барои фаҳмидани сабаб, шумо метавонед аз Кубернетес барои тавсифи YAML-и PVC пурсед:
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
Лутфан таваҷҷӯҳ намоед, ки суроғаҳои монитор дар шакли оддии суроғаи: порт нишон дода шудаанд. Барои насб кардани cephfs дар гиреҳ, ин суроғаҳо ба модули ядро мегузаранд, ки он ҳанӯз намедонад, ки чӣ тавр бо протоколи монитор v2 кор кунад.
Мо портро барои httpMetrics иваз мекунем (Прометей ба он ҷо барои мониторинги ченакҳо меравад) то он бо 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
Албатта, насб кардани FS дар гиреҳи Ceph ба монанди ин танҳо барои мақсадҳои омӯзишӣ мувофиқ аст, ки мо он чизеро, ки мо дар худ мекунем.
Ва дар ниҳоят, биёед бубинем, ки корҳо бо тағир додани андозаи ҳаҷмҳо дар сурати CephFS чӣ гуна кор мекунанд. Биёед ба Кубернетес баргардем ва манифести худро барои PVC таҳрир кунем - андозаи он ҷоро, масалан, то 7Gi зиёд кунед.
Биёед файли таҳриршударо татбиқ кунем:
kubectl apply -f pvc.yaml
Биёед ба феҳристи насбшуда назар андозем, то бубинем, ки квота чӣ гуна тағир ёфтааст:
getfattr -n ceph.quota.max_bytes <каталог-с-данными>
Барои кор кардани ин фармон, шумо бояд бастаро дар системаи худ насб кунед аттр.
Чашм метарсад, аммо дастҳо метарсанд
Ҳамаи ин имлоҳо ва зуҳуроти тӯлонии YAML дар рӯи замин мураккаб ба назар мерасанд, аммо дар амал, донишҷӯёни Slurm онҳоро хеле зуд ба даст меоранд.
Дар ин мақола мо ба ҷангал амиқ нарафтем - барои ин ҳуҷҷатҳои расмӣ мавҷуданд. Агар шумо ба тафсилоти таъсиси нигаҳдории Ceph бо кластери Kubernetes таваҷҷӯҳ дошта бошед, ин истинодҳо кӯмак хоҳанд кард:
Дар рафти Slurm
Ва агар шумо бештар ба нигоҳдории маълумот таваҷҷӯҳ дошта бошед, пас ба қайд гиред
Муаллифи макола: Александр Швалов, инженери амалкунанда
Манбаъ: will.com