Ceph پر مبنی اسٹوریج کو Kubernetes کلسٹر سے جوڑنے کی ایک عملی مثال

کنٹینر سٹوریج انٹرفیس (CSI) Kubernetes اور سٹوریج سسٹم کے درمیان ایک متحد انٹرفیس ہے۔ ہم پہلے ہی اس کے بارے میں مختصراً بات کر چکے ہیں۔ کہا، اور آج ہم CSI اور Ceph کے امتزاج پر گہری نظر ڈالیں گے: ہم دکھائیں گے کہ کیسے Ceph اسٹوریج کو مربوط کریں۔ کوبرنیٹس کلسٹر تک۔
یہ مضمون حقیقی، اگرچہ قدرے آسان مثالیں فراہم کرتا ہے تاکہ ادراک میں آسانی ہو۔ ہم Ceph اور Kubernetes کلسٹرز کو انسٹال اور کنفیگر کرنے پر غور نہیں کرتے ہیں۔

کیا آپ سوچ رہے ہیں کہ یہ کیسے کام کرتا ہے؟

Ceph پر مبنی اسٹوریج کو Kubernetes کلسٹر سے جوڑنے کی ایک عملی مثال

لہذا، آپ کی انگلی پر ایک Kubernetes کلسٹر ہے، جو تعینات ہے، مثال کے طور پر، kubespray. قریب ہی ایک Ceph کلسٹر کام کر رہا ہے - آپ اسے انسٹال بھی کر سکتے ہیں، مثال کے طور پر، اس کے ساتھ پلے بکس کا ایک سیٹ. مجھے امید ہے کہ یہ بتانے کی ضرورت نہیں ہے کہ ان کے درمیان پیداوار کے لیے کم از کم 10 Gbit/s کی بینڈوتھ والا نیٹ ورک ہونا چاہیے۔

اگر آپ کے پاس یہ سب ہے تو چلیں!

پہلے، آئیے Ceph کلسٹر نوڈس میں سے کسی ایک پر جائیں اور چیک کریں کہ سب کچھ ترتیب میں ہے:

ceph health
ceph -s

اگلا، ہم فوری طور پر آر بی ڈی ڈسک کے لیے ایک پول بنائیں گے:

ceph osd pool create kube 32
ceph osd pool application enable kube rbd

آئیے Kubernetes کلسٹر کی طرف چلتے ہیں۔ وہاں، سب سے پہلے، ہم RBD کے لیے Ceph CSI ڈرائیور انسٹال کریں گے۔ ہم ہیلم کے ذریعے، توقع کے مطابق انسٹال کریں گے۔
ہم چارٹ کے ساتھ ایک ذخیرہ شامل کرتے ہیں، ہمیں 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 میں مانیٹر کے کلسٹر آئی ڈی اور آئی پی ایڈریس معلوم کریں:

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 میں ایک نیا صارف بناتے ہیں اور اسے پول میں لکھنے کے حقوق دیتے ہیں۔ کیوب:

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

بھرنے کی ضرورت ہے۔ کلسٹر آئی ڈی، جو ہم ٹیم کے ذریعہ پہلے ہی سیکھ چکے ہیں۔ 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

آئیے فوری طور پر دیکھتے ہیں کہ کبرنیٹس نے سیف میں مطلوبہ حجم کیسے بنایا:

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 کی YAML تفصیل کے لیے Kubernetes سے استفسار کر سکتے ہیں:

kubectl get pvc rbd-pvc -o yaml

مسئلہ یہ ہے:

پیغام: نوڈ پر فائل سسٹم کے حجم کا سائز تبدیل کرنے کے لیے صارف کا پوڈ (دوبارہ) شروع کرنے کا انتظار ہے۔ قسم: FileSystemResizePending

یعنی ڈسک بڑھ گئی ہے لیکن اس پر موجود فائل سسٹم نہیں ہے۔
فائل سسٹم کو بڑھانے کے لیے، آپ کو حجم کو ماؤنٹ کرنے کی ضرورت ہے۔ ہمارے ملک میں، تخلیق کردہ PVC/PV فی الحال کسی بھی طرح استعمال نہیں ہوتا ہے۔

ہم ایک ٹیسٹ پوڈ بنا سکتے ہیں، مثال کے طور پر اس طرح:

---
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

اور اب پیویسی کو دیکھتے ہیں:

kubectl get pvc

سائز بدل گیا ہے، سب کچھ ٹھیک ہے.

پہلے حصے میں، ہم نے RBD بلاک ڈیوائس کے ساتھ کام کیا (اس کا مطلب Rados بلاک ڈیوائس ہے)، لیکن اگر مختلف مائیکرو سروسز کو بیک وقت اس ڈسک کے ساتھ کام کرنے کی ضرورت ہو تو ایسا نہیں کیا جا سکتا۔ CephFS ڈسک امیجز کے بجائے فائلوں کے ساتھ کام کرنے کے لیے زیادہ موزوں ہے۔
Ceph اور Kubernetes کلسٹرز کی مثال استعمال کرتے ہوئے، ہم CephFS کے ساتھ کام کرنے کے لیے CSI اور دیگر ضروری اداروں کو ترتیب دیں گے۔

آئیے نئے ہیلم چارٹ سے اقدار حاصل کریں جس کی ہمیں ضرورت ہے:

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 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

آئیے الگ الگ سیکرٹ اور سٹوریج کلاس بنائیں۔
کوئی نئی بات نہیں، ہم اسے پہلے ہی RBD کی مثال میں دیکھ چکے ہیں:

---
apiVersion: v1
kind: Secret
metadata:
  name: csi-cephfs-secret
  namespace: ceph-csi-cephfs
stringData:
  # Необходимо для динамически создаваемых томов
  adminID: fs
  adminKey: <вывод предыдущей команды>

مینی فیسٹ کو لاگو کرنا:

kubectl apply -f secret.yaml

اور اب - ایک علیحدہ اسٹوریج کلاس:

---
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

آئیے اسے یہاں بھرتے ہیں۔ کلسٹر آئی ڈی اور 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

بلاشبہ، اس طرح کے سیف نوڈ پر ایف ایس لگانا صرف تربیتی مقاصد کے لیے موزوں ہے، جو ہم اپنے سلم کورسز. مجھے نہیں لگتا کہ کوئی بھی یہ پروڈکشن میں کرے گا؛ اہم فائلوں کے حادثاتی طور پر مٹ جانے کا بہت زیادہ خطرہ ہے۔

اور آخر میں، آئیے چیک کریں کہ CephFS کے معاملے میں حجم کو تبدیل کرنے کے ساتھ چیزیں کیسے کام کرتی ہیں۔ آئیے Kubernetes پر واپس جائیں اور PVC کے لیے اپنے مینی فیسٹ میں ترمیم کریں - وہاں سائز بڑھائیں، مثال کے طور پر، 7Gi تک۔

آئیے ترمیم شدہ فائل کو لاگو کریں:

kubectl apply -f pvc.yaml

آئیے ماونٹڈ ڈائرکٹری کو دیکھیں کہ کوٹہ کیسے تبدیل ہوا ہے:

getfattr -n ceph.quota.max_bytes <каталог-с-данными>

اس کمانڈ کے کام کرنے کے لیے، آپ کو اپنے سسٹم پر پیکیج انسٹال کرنے کی ضرورت پڑسکتی ہے۔ attr.

آنکھیں ڈرتی ہیں لیکن ہاتھ ڈرتے ہیں۔

یہ تمام منتر اور طویل YAML منشور سطح پر پیچیدہ معلوم ہوتے ہیں، لیکن عملی طور پر، Slurm کے طلباء ان کو بہت جلد پکڑ لیتے ہیں۔
اس مضمون میں ہم جنگل کی گہرائی میں نہیں گئے - اس کے لیے سرکاری دستاویزات موجود ہیں۔ اگر آپ کوبرنیٹس کلسٹر کے ساتھ سیف اسٹوریج ترتیب دینے کی تفصیلات میں دلچسپی رکھتے ہیں، تو یہ لنکس مدد کریں گے:

حجم کے ساتھ کام کرنے والے Kubernetes کے عمومی اصول
آر بی ڈی دستاویزات
Ceph نقطہ نظر سے RBD اور Kubernetes کو مربوط کرنا
CSI کے نقطہ نظر سے RBD اور Kubernetes کو مربوط کرنا
جنرل CephFS دستاویزات
CSI کے نقطہ نظر سے CephFS اور Kubernetes کو یکجا کرنا

سلرم کورس پر کبرنیٹس بیس آپ تھوڑا آگے جا کر Kubernetes میں ایک حقیقی ایپلی کیشن تعینات کر سکتے ہیں جو CephFS کو فائل اسٹوریج کے طور پر استعمال کرے گی۔ GET/POST درخواستوں کے ذریعے آپ فائلوں کو Ceph میں منتقل کرنے اور وصول کرنے کے قابل ہو جائیں گے۔

اور اگر آپ ڈیٹا اسٹوریج میں زیادہ دلچسپی رکھتے ہیں، تو سائن اپ کریں۔ سیف پر نیا کورس. جبکہ بیٹا ٹیسٹ جاری ہے، کورس رعایت پر حاصل کیا جا سکتا ہے اور آپ اس کے مواد کو متاثر کر سکتے ہیں۔

مضمون کے مصنف: الیگزینڈر شوالوف، پریکٹس انجینئر ساؤتھ برج, مصدقہ Kubernetes ایڈمنسٹریٹر، Slurm کورسز کے مصنف اور ڈویلپر۔

ماخذ: www.habr.com