یک مثال عملی از اتصال حافظه مبتنی بر Ceph به یک خوشه Kubernetes

رابط ذخیره سازی کانتینر (CSI) یک رابط یکپارچه بین Kubernetes و سیستم های ذخیره سازی است. قبلاً به طور خلاصه در مورد آن صحبت کرده ایم گفت:، و امروز نگاهی دقیق تر به ترکیب CSI و Ceph خواهیم داشت: نشان خواهیم داد که چگونه ذخیره سازی Ceph را وصل کنید به خوشه Kubernetes.
مقاله مثال‌های واقعی، البته کمی ساده‌شده را برای سهولت درک ارائه می‌کند. ما نصب و پیکربندی خوشه های Ceph و Kubernetes را در نظر نمی گیریم.

آیا شما تعجب می کنید که چگونه کار می کند؟

یک مثال عملی از اتصال حافظه مبتنی بر Ceph به یک خوشه Kubernetes

بنابراین، شما یک خوشه Kubernetes را در نوک انگشتان خود دارید، به عنوان مثال، کوبسپری. یک خوشه Ceph در این نزدیکی کار می کند - شما همچنین می توانید آن را نصب کنید، به عنوان مثال، با این مجموعه ای از کتاب های بازی. امیدوارم نیازی به ذکر نباشد که برای تولید بین آنها باید شبکه ای با پهنای باند حداقل 10 گیگابیت بر ثانیه وجود داشته باشد.

اگر همه اینها را دارید، بریم!

ابتدا، اجازه دهید به یکی از گره های خوشه 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 علاقه مند هستید، این پیوندها به شما کمک می کند:

اصول کلی Kubernetes کار با حجم
اسناد RBD
ادغام RBD و Kubernetes از دیدگاه Ceph
ادغام RBD و Kubernetes از دیدگاه CSI
اسناد عمومی CephFS
ادغام CephFS و Kubernetes از دیدگاه CSI

در دوره Slurm پایگاه کوبرنتیس می توانید کمی جلوتر بروید و یک برنامه واقعی را در Kubernetes مستقر کنید که از CephFS به عنوان ذخیره فایل استفاده می کند. از طریق درخواست‌های GET/POST می‌توانید فایل‌ها را به Ceph منتقل کرده و از آنها دریافت کنید.

و اگر بیشتر به ذخیره سازی داده ها علاقه دارید، در آن ثبت نام کنید دوره جدید در Ceph. در حالی که آزمون بتا در حال انجام است، دوره را می توان با تخفیف دریافت کرد و می توانید بر محتوای آن تأثیر بگذارید.

نویسنده مقاله: الکساندر شوالوف، مهندس شاغل Southbridge، مدیر معتبر Kubernetes، نویسنده و توسعه دهنده دوره های Slurm.

منبع: www.habr.com