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 кластер руу шилжье. Тэнд юуны түрүүнд бид RBD-д зориулсан Ceph CSI драйверийг суулгана. Бид хүлээгдэж буйгаар 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
Дараа нь бидний хувьд Кубернетес кластерт диаграм суулгах л үлдлээ.
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==
Энэ утгыг Кубернетес кластер дахь нууцад хэрэгтэй газар нэмье Хэрэглэгчийн түлхүүр:
---
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
Бөглөх шаардлагатай кластер ID, үүнийг бид аль хэдийн багийнхан сурсан 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
Бүх зүйл гайхалтай байх шиг байна! Энэ нь Цефийн талд ямар харагдаж байна вэ?
Бид усан сан дахь ботьуудын жагсаалтыг авч, эзлэхүүний талаарх мэдээллийг харна уу:
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-ийн хэмжээ өөрчлөгдөөгүй байгааг бид харж байна. Шалтгааныг мэдэхийн тулд та PVC-ийн YAML тайлбарыг Kubernetes-ээс асууж болно.
kubectl get pvc rbd-pvc -o yaml
Энд асуудал байна:
зурвас: Зангилааны файлын системийн хэмжээг өөрчлөхийн тулд хэрэглэгчийг pod-ыг (дахин) эхлүүлэхийг хүлээж байна. төрөл: 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 дэлгэцийн протоколтой хэрхэн ажиллахаа хараахан мэдэхгүй байна.
Бид Kubespray-ийн суулгасан nginx-proxy-тэй зөрчилдөхгүйн тулд httpMetrics портыг өөрчилдөг (Prometheus хэмжигдэхүүнийг хянахын тулд тэнд очно). Энэ танд хэрэггүй байж магадгүй.
Kubernetes кластерт Helm диаграмыг суулгана уу:
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
Энд бөглөөд үзье кластер ID болон 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-ийн хувьд эзлэхүүний хэмжээг өөрчлөх нь хэрхэн ажилладагийг шалгацгаая. Кубернетес рүү буцаж очоод PVC-д зориулсан манифестээ засъя - тэнд байгаа хэмжээг, жишээлбэл, 7Gi болгож нэмэгдүүлье.
Засварласан файлыг ашиглацгаая:
kubectl apply -f pvc.yaml
Квот хэрхэн өөрчлөгдсөнийг харахын тулд суулгасан лавлахыг харцгаая:
getfattr -n ceph.quota.max_bytes <каталог-с-данными>
Энэ тушаалыг ажиллуулахын тулд та багцыг систем дээрээ суулгах шаардлагатай байж магадгүй attr.
Нүд айдаг ч гар айдаг
Эдгээр бүх шившлэгүүд болон урт YAML илрэлүүд нь өнгөн дээрээ төвөгтэй мэт боловч практик дээр Slurm оюутнууд тэдгээрийг маш хурдан ойлгодог.
Энэ нийтлэлд бид ширэнгэн ой руу гүнзгий ороогүй - үүнд зориулсан албан ёсны баримт бичиг байдаг. Хэрэв та Kubernetes кластертай Ceph хадгалах санг тохируулах талаар дэлгэрэнгүй сонирхож байгаа бол эдгээр холбоосууд туслах болно:
Slurm курс дээр
Хэрэв та өгөгдөл хадгалахыг илүү сонирхож байгаа бол бүртгүүлнэ үү
Өгүүллийн зохиогч: Александр Швалов, дадлагажигч инженер
Эх сурвалж: www.habr.com