በሴፍ ላይ የተመሰረተ ማከማቻን ወደ ኩበርኔትስ ክላስተር የማገናኘት ተግባራዊ ምሳሌ

የመያዣ ማከማቻ በይነገጽ (CSI) በኩበርኔትስ እና በማከማቻ ስርዓቶች መካከል የተዋሃደ በይነገጽ ነው። እኛ ስለ እሱ በአጭሩ የተነገረው, እና ዛሬ የ CSI እና Ceph ጥምርን በጥልቀት እንመለከታለን: እንዴት እንደሆነ እናሳያለን የ Ceph ማከማቻ ይጫኑ ወደ ኩበርኔትስ ክላስተር።
ጽሑፉ እውነተኛ ይዟል፣ ምንም እንኳን ለግንዛቤ ምሳሌዎች በትንሹ ቀላል ቢሆንም። የሴፍ እና የኩበርኔትስ ስብስቦችን መጫን እና ማዋቀርን አናስብም።

እንዴት እንደሚሰራ እያሰቡ ነው?

በሴፍ ላይ የተመሰረተ ማከማቻን ወደ ኩበርኔትስ ክላስተር የማገናኘት ተግባራዊ ምሳሌ

ስለዚህ፣ በእጅህ የኩበርኔትስ ዘለላ አለህ፣ የተሰማራ፣ ለምሳሌ፣ kubespray. የሴፍ ክላስተር በአቅራቢያው ይሰራል - እርስዎም ማስቀመጥ ይችላሉ, ለምሳሌ, ከዚህ ጋር የመጫወቻ መጽሐፍት ስብስብ. ለምርት ያንን መጥቀስ አያስፈልገኝም ብዬ ተስፋ አደርጋለሁ በመካከላቸው ቢያንስ 10 Gb/s የመተላለፊያ ይዘት ያለው ኔትወርክ መኖር አለበት።

ይህ ሁሉ ካለህ እንሂድ!

በመጀመሪያ፣ ወደ የሴፍ ክላስተር አንጓዎች እንሂድ እና ሁሉም ነገር በሥርዓት መሆኑን እንፈትሽ።

ceph health
ceph -s

በመቀጠል ወዲያውኑ ለ RBD ዲስኮች ገንዳ እንፈጥራለን-

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

ወደ ኩበርኔትስ ክላስተር እንሂድ። እዚያ፣ በመጀመሪያ፣ የCef CSI ሾፌርን ለ RBD እንጭነዋለን። እንደታሰበው በሄልም በኩል እንጭነዋለን።
ማከማቻ ከገበታ ጋር ያክሉ፣ የ 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 fsid  # так мы узнаем clusterID
ceph mon dump  # а так увидим IP-адреса мониторов

የተገኙት እሴቶች ወደ cephrbd.yml ፋይል ገብተዋል። በመንገዳችን ላይ፣ የፒኤስፒ ፖሊሲዎችን (የፖድ ደህንነት ፖሊሲዎች) መፍጠርን እናነቃለን። ክፍል አማራጮች መስቀለኛ መንገድ ተሰኪ и አቅራቢ ቀድሞውኑ በፋይሉ ውስጥ ፣ ከዚህ በታች እንደሚታየው ሊስተካከሉ ይችላሉ-

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 ሹፌር ይሰራል!
በኩበርኔትስ ውስጥ አዲስ የማከማቻ ክፍል እንፍጠር። ይህ እንደገና ከሴፍ ጋር የተወሰነ ስራ ያስፈልገዋል።

በሴፍ ውስጥ አዲስ ተጠቃሚ ይፍጠሩ እና ወደ ገንዳው እንዲጽፍ ፍቃድ ይስጡት። ኩብ:

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

እና አሁን የመዳረሻ ቁልፉ አሁንም እንዳለ እንይ፡-

ceph auth get-key client.rbdkube

ትዕዛዙ እንደዚህ ያለ ነገር ያወጣል-

AQCO9NJbhYipKRAAMqZsnqqS/T8OYQX20xIa9A==

ይህንን እሴት በ Kubernetes ክላስተር ውስጥ በሚስጥር ውስጥ እናስቀምጠው - በምንፈልገው ቦታ የተጠቃሚ ቁልፍ:

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

በመቀጠል፣ እንደዚህ ያለ የማከማቻ ክፍል ዝርዝር መግለጫ ያስፈልገናል፡-

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

መሙላት ያስፈልጋል ክላስተር መታወቂያ, ቀደም ብለን በቡድኑ የተማርነው ሴፍ 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 መጠኑ እንዳልተለወጠ እናያለን. ለምን እንደሆነ ለማወቅ Kubernetes የ PVC መግለጫን በ YAML ቅርጸት መጠየቅ ይችላሉ፡

kubectl get pvc rbd-pvc -o yaml

እና ችግሩ እዚህ አለ፡-

መልእክት፡ ተጠቃሚው (ዳግም-) ፖድ እስኪጀምር በመጠበቅ ላይ የፋይል ስርዓት በመስቀለኛ ላይ ያለውን የድምጽ መጠን መቀየር። አይነት: FileSystemResize በመጠባበቅ ላይ

ያም ማለት ዲስኩ አድጓል, ነገር ግን በእሱ ላይ ያለው የፋይል ስርዓት አላደረገም.
የፋይል ስርዓቱን ለማስፋት, ድምጹን መጫን ያስፈልግዎታል. በእኛ ሁኔታ, የተፈጠረው 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

እና አሁን PVC እንይ:

kubectl get pvc

መጠኑ ተለውጧል, ሁሉም ነገር በሥርዓት ነው.

በመጀመሪያው ክፍል ከ RBD ማገጃ መሳሪያ ጋር ሠርተናል (ይህ ማለት Rados Block Device ነው), ነገር ግን በዚህ ዲስክ ከተለያዩ ማይክሮ ሰርቪስ ጋር በተመሳሳይ ጊዜ መስራት ከፈለጉ ይህን ማድረግ አይቻልም. ከፋይሎች ጋር ለመስራት, ከዲስክ ምስል ይልቅ, CephFS በጣም የተሻለው ነው.
የሴፍ እና የኩበርኔትስ ስብስቦችን ምሳሌ በመጠቀም፣ CSI እና ሌሎች አስፈላጊ አካላትን ከሴፍኤፍኤስ ጋር እንዲሰሩ እናዋቅራለን።

እሴቶቹን ከምንፈልገው አዲሱ የ Helm ገበታ እናገኝ፡-

helm inspect values ceph-csi/ceph-csi-cephfs > cephfs.yml

በድጋሚ, የ cephfs.yml ፋይል መሙላት ያስፈልግዎታል. ልክ እንደበፊቱ፣ የሴፍ ትዕዛዞች ይረዳሉ፡-

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 ለክትትል መለኪያዎች ወደዚያ ይሄዳል)። ይህ ላያስፈልግህ ይችላል።

የ Helm ገበታ በ Kubernetes ክላስተር ውስጥ ጫን፡-

helm upgrade -i ceph-csi-cephfs ceph-csi/ceph-csi-cephfs -f cephfs.yml -n ceph-csi-cephfs --create-namespace

እዚያ የተለየ ተጠቃሚ ለመፍጠር ወደ ሴፍ ዳታ ማከማቻ እንሂድ። የ 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

እዚህ ይሙሉ ክላስተር መታወቂያ እና በኩበርኔትስ ውስጥ ተፈጻሚ ይሆናል፡

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

በሴፍኤፍኤስ ውስጥ ያሉትን ፋይሎች እና ማውጫዎች ማየት ከፈለጉ፣ ይህን የፋይል ስርዓት የሆነ ቦታ መጫን ይችላሉ። ለምሳሌ, ከታች እንደሚታየው.

ወደ አንዱ የሴፍ ክላስተር ኖዶች ሄደን የሚከተሉትን ድርጊቶች እንፈጽማለን፡

# Точка монтирования
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

እርግጥ ነው፣ እንዲህ ያለው የኤፍኤስ ተራራ በሴፍ ኖድ ላይ ለትምህርት ዓላማዎች ብቻ ተስማሚ ነው፣ ይህም በእኛ ላይ የምናደርገውን ነው። የስሉም ኮርሶች. ማንም ሰው በምርት ውስጥ ይህንን የሚያደርግ አይመስለኝም ፣ አስፈላጊ ፋይሎችን በአጋጣሚ የመፃፍ ትልቅ አደጋ አለ ።

እና በመጨረሻም፣ በሴፍኤፍኤስ ጉዳይ ላይ የድምጽ መጠንን በመቀየር ነገሮች እንዴት እንደሚሰሩ እንፈትሽ። ወደ Kubernetes እንመለሳለን እና የእኛን መግለጫ ለ PVC እናስተካክላለን - እዚያ መጠኑን እንጨምራለን ፣ ለምሳሌ ወደ 7Gi።

የተስተካከለውን ፋይል ተግብር፡-

kubectl apply -f pvc.yaml

በተሰቀለው ማውጫ ላይ ኮታው እንዴት እንደተለወጠ እንመልከት፡-

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

ይህ ትዕዛዝ እንዲሰራ, ጥቅሉን መጫን ሊኖርብዎት ይችላል attr.

ዓይኖቹ ይፈራሉ, ነገር ግን እጆች ይሠራሉ

ላይ ላዩን፣ እነዚህ ሁሉ ድግምቶች እና ረጅም የ YAML መገለጫዎች የተወሳሰቡ ይመስላሉ፣ በተግባር ግን፣ የስሉርም ተማሪዎች በፍጥነት ይቋቋሟቸዋል።
በዚህ ጽሑፍ ውስጥ ወደ ዱር ውስጥ አልገባንም - ለዚህም ኦፊሴላዊ ሰነዶች አሉ. የሴፍ ማከማቻን በ Kubernetes ክላስተር የማዘጋጀት ዝርዝሮች ላይ ፍላጎት ካሎት እነዚህ ማገናኛዎች ያግዛሉ፡

የ Kubernetes አጠቃላይ መርሆዎች ከጥራዞች ጋር
RBD ሰነድ
RBD እና Kubernetes ውህደት ከሴፍ እይታ
RBD እና Kubernetes ውህደት ከሲኤስአይ እይታ
አጠቃላይ CephFS ሰነድ
የሴፍኤፍኤስ እና የኩበርኔትስ ውህደት ከሲኤስአይ እይታ

ኮርስ Slurm ላይ Kubernetes Base አንድ እርምጃ ወደፊት መሄድ እና CephFSን ለፋይሎች ማከማቻ የሚጠቀም እውነተኛ መተግበሪያ በ Kubernetes ማሰማራት ትችላለህ። በGET/POST ጥያቄዎች፣ ፋይሎችን ወደ ሴፍ ማስተላለፍ እና መቀበል ይችላሉ።

እና በመረጃ ማከማቻ ላይ የበለጠ ፍላጎት ካሎት፣ ከዚያ ይመዝገቡ አዲስ የሴፍ ኮርስ. የቅድመ-ይሁንታ ሙከራው እየሄደ እያለ፣ ትምህርቱ በቅናሽ ሊገኝ እና ይዘቱ ላይ ተጽዕኖ ሊያሳድር ይችላል።

የጽሑፍ ደራሲ: አሌክሳንደር ሽቫሎቭ, መሐንዲስ መለማመድ Southbridge፣ የተረጋገጠ የኩበርኔትስ አስተዳዳሪ ፣ ደራሲ እና የስሉርም ኮርሶች ገንቢ።

ምንጭ: hab.com