ڪيف تي ٻڌل اسٽوريج کي ڪبرنيٽس ڪلستر سان ڳنڍڻ جو هڪ عملي مثال

ڪنٽينر اسٽوريج انٽرفيس (CSI) Kubernetes ۽ اسٽوريج سسٽم جي وچ ۾ هڪ متحد انٽرفيس آهي. اسان اڳ ۾ ئي مختصر طور تي ان بابت ڳالهايو آهي ٻڌايو، ۽ اڄ اسان CSI ۽ Ceph جي ميلاپ تي وڌيڪ ويجھو نظر وجهنداسين: اسان ڏيکارينداسين ته ڪيئن Ceph اسٽوريج سان ڳنڍيو Kubernetes ڪلستر ڏانهن.
مضمون مهيا ڪري ٿو حقيقي، جيتوڻيڪ تصور جي آسانيء لاء ٿورو آسان مثال. اسان ڪيف ۽ ڪبرنيٽس ڪلستر کي انسٽال ڪرڻ ۽ ترتيب ڏيڻ تي غور نه ڪندا آهيون.

ڇا توهان حيران ٿي رهيا آهيو ته اهو ڪيئن ڪم ڪري ٿو؟

ڪيف تي ٻڌل اسٽوريج کي ڪبرنيٽس ڪلستر سان ڳنڍڻ جو هڪ عملي مثال

تنهن ڪري، توهان وٽ توهان جي آڱرين تي ڪبرنيٽس ڪلستر آهي، ترتيب ڏنل، مثال طور، ڪب اسپري. اتي ويجھي ڪيف ڪلستر ڪم ڪري ٿو - توھان پڻ ان کي انسٽال ڪري سگھو ٿا، مثال طور، ھن سان راندين جي ڪتابن جو هڪ سيٽ. مون کي اميد آهي ته اهو ذڪر ڪرڻ جي ڪا ضرورت ناهي ته انهن جي وچ ۾ پيداوار لاء گهٽ ۾ گهٽ 10 Gbit / s جي بينڊوڊٿ سان نيٽ ورڪ هجڻ گهرجي.

جيڪڏهن توهان وٽ اهو سڀ ڪجهه آهي، ته اچو!

پهرين، اچو ته ڪيف ڪلستر نوڊس مان هڪ ڏانهن وڃو ۽ چيڪ ڪريو ته هر شي ترتيب ۾ آهي:

ceph health
ceph -s

اڳيون، اسان فوري طور تي آر بي ڊي ڊسڪ لاء هڪ تلاء ٺاهي سگهنداسين:

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 فائل ڀرڻ جي ضرورت آهي. هن کي ڪرڻ لاء، مانيٽر جي ڪلستر ID ۽ IP پتي کي ڳوليو Ceph ۾:

ceph fsid  # так мы узнаем clusterID
ceph mon dump  # а так увидим IP-адреса мониторов

اسان حاصل ڪيل قيمتن کي cephrbd.yml فائل ۾ داخل ڪيو. ساڳئي وقت، اسان PSP پاليسين (Pod Security Policies) ٺاهڻ کي فعال ڪريون ٿا. سيڪشن ۾ اختيارن nodeplugin и روزي ڏيندڙ اڳ ۾ ئي فائل ۾، انهن کي درست ڪري سگهجي ٿو جيئن هيٺ ڏيکاريل آهي:

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

عظيم، آر بي ڊي ڊرائيور ڪم ڪري ٿو!
اچو ته Kubernetes ۾ هڪ نئون StorageClass ٺاهيون. اهو وري ڪيف سان گڏ ٿورڙي ٽڪرائڻ جي ضرورت آهي.

اسان ڪيف ۾ هڪ نئون صارف ٺاهيو ۽ کيس پول ڏانهن لکڻ جا حق ڏيو ڪڇ:

ceph auth get-or-create client.rbdkube mon 'profile rbd' osd 'profile rbd pool=kube'

هاڻي اچو ته ڏسو ته رسائي جي چيڪ اڃا تائين موجود آهي:

ceph auth get-key client.rbdkube

حڪم هن طرح ڪجهه ڪڍي ڇڏيندو:

AQCO9NJbhYipKRAAMqZsnqqS/T8OYQX20xIa9A==

اچو ته هن قيمت کي ڪبرنيٽس ڪلستر ۾ راز ۾ شامل ڪريون - جتي اسان کي ان جي ضرورت آهي 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، ۽ هن پڌري کي ڪبرنيٽس ڪلستر تي لاڳو ڪريو:

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 manifest ۾ حجم جي سائيز کي 2Gi ۾ تبديل ڪريو ۽ ان کي لاڳو ڪريو:

kubectl apply -f pvc.yaml

اچو ته تبديلين کي اثر انداز ٿيڻ جو انتظار ڪريون ۽ حجم جي سائيز کي ٻيهر ڏسو.

rbd -p kube info csi-vol-eb3d257d-8c6c-11ea-bff5-6235e7640653

kubectl get pv
kubectl get pvc

اسان ڏسون ٿا ته پي وي سي جي سائيز تبديل نه ڪئي وئي آهي. معلوم ڪرڻ لاءِ ڇو، توھان پڇي سگھوٿا Kubernetes PVC جي YAML وضاحت لاءِ:

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

سائيز تبديل ٿي وئي آهي، هر شيء ٺيڪ آهي.

پهرين حصي ۾، اسان آر بي ڊي بلاڪ ڊيوائس سان ڪم ڪيو (اهو ريڊس بلاڪ ڊيوائس لاءِ بيٺو آهي)، پر اهو نه ٿو ڪري سگهجي جيڪڏهن مختلف مائڪرو سروسز کي هن ڊسڪ سان گڏ ڪم ڪرڻ جي ضرورت آهي. CephFS ڊسڪ تصويرن جي بجاءِ فائلن سان ڪم ڪرڻ لاءِ وڌيڪ موزون آهي.
Ceph ۽ Kubernetes ڪلستر جو مثال استعمال ڪندي، اسان CSI ۽ ٻين ضروري ادارن کي ترتيب ڏينداسين CephFS سان ڪم ڪرڻ لاءِ.

اچو ته نئين هيلم چارٽ مان قيمتون حاصل ڪريون جنهن جي اسان کي ضرورت آهي:

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

مهرباني ڪري نوٽ ڪريو ته مانيٽر ايڊريس بيان ڪيا ويا آهن سادي فارم پتي ۾: پورٽ. ڪيفف کي نوڊ تي مائونٽ ڪرڻ لاءِ، ھي ايڊريس ڪرنل ماڊل ڏانھن منتقل ڪيا ويا آھن، جيڪي اڃا تائين نه ڄاڻندا آھن ته ڪيئن ڪم ڪجي 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

اچو ته ڪيف ڊيٽا اسٽور ڏانھن وڃو اتي ھڪڙو الڳ صارف ٺاھيو. دستاويزن ۾ چيو ويو آهي ته سيف ايف ايس فراهم ڪندڙ کي ڪلسٽر ايڊمنسٽريٽر جي رسائي جي حقن جي ضرورت آهي. پر اسان هڪ الڳ صارف ٺاهينداسين 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

۽ هاڻي - هڪ الڳ 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

جي چڪاس

چيڪ ڪرڻ لاء، جيئن پوئين مثال ۾، اچو ته هڪ پي وي سي ٺاهي:

---
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 ۾ فائلن ۽ ڊائريڪٽرن کي ڏسڻ چاهيو ٿا، ته توهان هن فائل سسٽم کي ڪٿي نصب ڪري سگهو ٿا. مثال طور جيئن هيٺ ڏيکاريل آهي.

اچو ته ڪيف ڪلستر نوڊس مان ھڪڙي ڏانھن وڃو ۽ ھيٺيون عمل ڪريو.

# Точка монтирования
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 کي سيف نوڊ تي چڙهڻ صرف تربيتي مقصدن لاءِ موزون آهي، جيڪو اسان اسان تي ڪندا آهيون. سلم ڪورس. مان نه ٿو سمجهان ته ڪو به اهو پيداوار ۾ ڪندو؛ اتي اهم فائلن کي حادثي سان ختم ڪرڻ جو وڏو خطرو آهي.

۽ آخرڪار، اچو ته چيڪ ڪريو ته شيون ڪيئن ڪم ڪن ٿيون حجم کي ٻيهر ڪرڻ سان CephFS جي صورت ۾. اچو ته Kubernetes ڏانهن واپس وڃو ۽ PVC لاءِ اسان جي منشور کي ايڊٽ ڪريو - اتي سائيز وڌايو، مثال طور، 7Gi تائين.

اچو ته تبديل ٿيل فائل کي لاڳو ڪريو:

kubectl apply -f pvc.yaml

اچو ته نصب ٿيل ڊاريڪٽري کي ڏسو ته ڏسو ته ڪوٽا ڪيئن بدلجي ويو آهي:

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

ھن حڪم کي ڪم ڪرڻ لاء، توھان کي توھان جي سسٽم تي پيڪيج کي انسٽال ڪرڻ جي ضرورت پوندي attr.

اکيون ڊڄنديون آهن، پر هٿ ڪندا آهن

اهي سڀئي منتر ۽ ڊگها YAML ظاهري سطح تي پيچيده نظر اچن ٿا، پر عملي طور تي، سلرم شاگردن کي انهن مان جلدي جلدي حاصل ٿئي ٿي.
هن مقالي ۾ اسان جهنگ ۾ گهيرو نه ڪيو آهي - ان لاء سرڪاري دستاويز موجود آهي. جيڪڏهن توهان ڪيف اسٽوريج قائم ڪرڻ جي تفصيل ۾ دلچسپي رکو ٿا ڪبرنيٽس ڪلستر سان، اهي لنڪ مدد ڪندا:

حجم سان ڪم ڪندڙ Kubernetes جا عام اصول
آر بي ڊي دستاويز
سيف جي نقطه نظر کان آر بي ڊي ۽ ڪبرنيٽس کي گڏ ڪرڻ
CSI نقطه نظر کان آر بي ڊي ۽ ڪبرنيٽس کي گڏ ڪرڻ
جنرل CephFS دستاويز
هڪ CSI نقطه نظر کان CephFS ۽ Kubernetes کي ضم ڪرڻ

Slurm ڪورس تي ڪبرنيٽس جو بنياد توھان ٿورو اڳتي وڃي سگھوٿا ۽ Kubernetes ۾ ھڪڙي حقيقي ايپليڪيشن کي ترتيب ڏيو جيڪو CephFS کي فائل اسٽوريج طور استعمال ڪندو. GET / POST درخواستن ذريعي توهان فائلن کي منتقل ڪرڻ جي قابل هوندا ۽ انهن کي ڪيف کان وصول ڪندا.

۽ جيڪڏهن توهان ڊيٽا اسٽوريج ۾ وڌيڪ دلچسپي وٺندا آهيو، پوء سائن اپ ڪريو Ceph تي نئون ڪورس. جڏهن ته بيٽا ٽيسٽ جاري آهي، ڪورس حاصل ڪري سگهجي ٿو رعايت تي ۽ توهان ان جي مواد کي متاثر ڪري سگهو ٿا.

مضمون جو ليکڪ: اليگزينڊر شوالوف، انجنيئر انجنيئر سائبربر, تصديق ٿيل ڪبرنيٽس ايڊمنسٽريٽر، ليکڪ ۽ ڊولپر Slurm ڪورسز جو.

جو ذريعو: www.habr.com