رابط ذخیره سازی کانتینر (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 را پر کنید. برای انجام این کار، شناسه خوشه و آدرس 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 کار می کند!
بیایید یک 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 برای توضیح YAML از PVC سوال کنید:
kubectl get pvc rbd-pvc -o yaml
مشکل اینجاست:
پیام: در انتظار کاربر برای (دوباره) راهاندازی یک پاد برای تکمیل تغییر اندازه حجم فایل سیستم در گره. نوع: FileSystemResizePending
یعنی دیسک رشد کرده است، اما سیستم فایل روی آن رشد نکرده است.
برای رشد سیستم فایل، باید حجم را نصب کنید. در کشور ما، PVC/PV ایجاد شده در حال حاضر به هیچ وجه استفاده نمی شود.
ما می توانیم یک Test 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 را تغییر می دهیم (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
البته، نصب FS بر روی گره Ceph مانند این فقط برای اهداف آموزشی مناسب است، کاری که ما روی خود انجام می دهیم.
و در نهایت، بیایید بررسی کنیم که چگونه کارها با تغییر اندازه حجم در مورد CephFS کار می کنند. بیایید به Kubernetes برگردیم و مانیفست خود را برای PVC ویرایش کنیم - برای مثال، اندازه را در آنجا به 7Gi افزایش دهید.
بیایید فایل ویرایش شده را اعمال کنیم:
kubectl apply -f pvc.yaml
بیایید به دایرکتوری نصب شده نگاه کنیم تا ببینیم سهمیه چگونه تغییر کرده است:
getfattr -n ceph.quota.max_bytes <каталог-с-данными>
برای اینکه این دستور کار کند، ممکن است لازم باشد بسته را روی سیستم خود نصب کنید جذب کنند.
چشم ها می ترسند، اما دست ها انجام می دهند
همه این طلسمها و مانیفستهای طولانی YAML در ظاهر پیچیده به نظر میرسند، اما در عمل، دانشآموزان Slurm خیلی سریع از آنها استفاده میکنند.
در این مقاله ما به عمق جنگل نرفتیم - اسناد رسمی برای آن وجود دارد. اگر به جزئیات راه اندازی ذخیره سازی Ceph با یک خوشه Kubernetes علاقه مند هستید، این پیوندها به شما کمک می کند:
در دوره Slurm
و اگر بیشتر به ذخیره سازی داده ها علاقه دارید، در آن ثبت نام کنید
نویسنده مقاله: الکساندر شوالوف، مهندس شاغل
منبع: www.habr.com