सेफ-आधारित स्टोरेज को कुबेरनेट्स क्लस्टर से जोड़ने का एक व्यावहारिक उदाहरण

कंटेनर स्टोरेज इंटरफ़ेस (सीएसआई) कुबेरनेट्स और स्टोरेज सिस्टम के बीच एक एकीकृत इंटरफ़ेस है। हम पहले ही इसके बारे में संक्षेप में बात कर चुके हैं बताया, और आज हम CSI और Ceph के संयोजन पर करीब से नज़र डालेंगे: हम दिखाएंगे कि कैसे सेफ़ स्टोरेज कनेक्ट करें कुबेरनेट्स क्लस्टर के लिए।
लेख वास्तविक, यद्यपि धारणा में आसानी के लिए थोड़ा सरलीकृत उदाहरण प्रदान करता है। हम सेफ और कुबेरनेट्स क्लस्टर को स्थापित और कॉन्फ़िगर करने पर विचार नहीं करते हैं।

क्या आप सोच रहे हैं कि यह कैसे काम करता है?

सेफ-आधारित स्टोरेज को कुबेरनेट्स क्लस्टर से जोड़ने का एक व्यावहारिक उदाहरण

तो, आपके पास अपनी उंगलियों पर एक Kubernetes क्लस्टर है, उदाहरण के लिए, तैनात किया गया है, क्यूबस्प्रे. पास में एक सेफ क्लस्टर काम कर रहा है - उदाहरण के लिए, आप इसे इसके साथ भी स्थापित कर सकते हैं प्लेबुक का एक सेट. मुझे आशा है कि यह उल्लेख करने की आवश्यकता नहीं है कि उनके बीच उत्पादन के लिए कम से कम 10 Gbit/s की बैंडविड्थ वाला एक नेटवर्क होना चाहिए।

यदि आपके पास यह सब है, तो चलें!

सबसे पहले, आइए सेफ क्लस्टर नोड्स में से एक पर जाएं और जांचें कि सब कुछ क्रम में है:

ceph health
ceph -s

इसके बाद, हम तुरंत आरबीडी डिस्क के लिए एक पूल बनाएंगे:

ceph osd pool create kube 32
ceph osd pool application enable kube 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 फ़ाइल में दर्ज करते हैं। साथ ही, हम PSP नीतियों (पॉड सुरक्षा नीतियों) के निर्माण को सक्षम करते हैं। अनुभागों में विकल्प नोडप्लगइन и प्रावधानकर्ता पहले से ही फ़ाइल में, उन्हें नीचे दिखाए अनुसार ठीक किया जा सकता है:

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

बढ़िया, आरबीडी ड्राइवर काम करता है!
आइए कुबेरनेट्स में एक नया स्टोरेजक्लास बनाएं। इसके लिए फिर से सेफ के साथ थोड़ा छेड़छाड़ की आवश्यकता है।

हम सेफ में एक नया उपयोगकर्ता बनाते हैं और उसे पूल में लिखने का अधिकार देते हैं क्यूब:

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

इसके बाद, हमें कुछ इस तरह एक स्टोरेजक्लास मेनिफेस्ट की आवश्यकता है:

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

भरने की जरूरत है क्लस्टरआईडी, जो हम टीम द्वारा पहले ही सीख चुके हैं सीईएफ एफएसआईडी, और इस मेनिफेस्ट को कुबेरनेट्स क्लस्टर पर लागू करें:

kubectl apply -f storageclass.yaml

यह जांचने के लिए कि क्लस्टर एक साथ कैसे काम करते हैं, आइए निम्नलिखित पीवीसी (पर्सिस्टेंट वॉल्यूम क्लेम) बनाएं:

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 тома, который выдала предыдущая команда

अब आइए देखें कि आरबीडी वॉल्यूम का आकार बदलना कैसे काम करता है।
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

हम देखते हैं कि पीवीसी का आकार नहीं बदला है। इसका कारण जानने के लिए, आप पीवीसी के YAML विवरण के लिए कुबेरनेट्स से पूछताछ कर सकते हैं:

kubectl get pvc rbd-pvc -o yaml

यहाँ समस्या है:

संदेश: नोड पर वॉल्यूम के फ़ाइल सिस्टम के आकार को पूरा करने के लिए उपयोगकर्ता द्वारा पॉड (पुनः) शुरू करने की प्रतीक्षा की जा रही है। प्रकार: FileSystemResizePending

यानी, डिस्क बड़ी हो गई है, लेकिन उस पर फ़ाइल सिस्टम नहीं।
फ़ाइल सिस्टम को विकसित करने के लिए, आपको वॉल्यूम माउंट करने की आवश्यकता है। हमारे देश में वर्तमान में निर्मित पीवीसी/पीवी का किसी भी प्रकार से उपयोग नहीं किया जाता है।

हम एक परीक्षण पॉड बना सकते हैं, उदाहरण के लिए इस प्रकार:

---
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 क्लस्टर के उदाहरण का उपयोग करते हुए, हम CephFS के साथ काम करने के लिए CSI और अन्य आवश्यक संस्थाओं को कॉन्फ़िगर करेंगे।

आइए नए हेल्म चार्ट से वे मान प्राप्त करें जिनकी हमें आवश्यकता है:

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

कृपया ध्यान दें कि मॉनिटर पते सरल रूप एड्रेस:पोर्ट में निर्दिष्ट हैं। किसी नोड पर सेफफ़्स को माउंट करने के लिए, इन पतों को कर्नेल मॉड्यूल में स्थानांतरित कर दिया जाता है, जो अभी तक नहीं जानता है कि v2 मॉनिटर प्रोटोकॉल के साथ कैसे काम किया जाए।
हम httpMetrics के लिए पोर्ट बदलते हैं (प्रोमेथियस मेट्रिक्स की निगरानी के लिए वहां जाएगा) ताकि यह nginx-प्रॉक्सी के साथ संघर्ष न करे, जो Kubespray द्वारा स्थापित है। हो सकता है आपको इसकी आवश्यकता न हो.

कुबेरनेट्स क्लस्टर में हेल्म चार्ट स्थापित करें:

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

आइए अलग सीक्रेट और स्टोरेज क्लास बनाएं।
कोई नई बात नहीं, हम इसे आरबीडी के उदाहरण में पहले ही देख चुके हैं:

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

Проверка

जाँच करने के लिए, पिछले उदाहरण की तरह, आइए एक पीवीसी बनाएँ:

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: csi-cephfs-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi
  storageClassName: csi-cephfs-sc

और पीवीसी/पीवी की उपस्थिति की जाँच करें:

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

बेशक, इस तरह सेफ नोड पर एफएस लगाना केवल प्रशिक्षण उद्देश्यों के लिए उपयुक्त है, जो कि हम अपने पर करते हैं स्लम पाठ्यक्रम. मुझे नहीं लगता कि कोई भी उत्पादन में ऐसा करेगा; महत्वपूर्ण फ़ाइलों के गलती से मिट जाने का जोखिम बहुत अधिक है।

और अंत में, आइए देखें कि CephFS के मामले में वॉल्यूम का आकार बदलने के साथ चीजें कैसे काम करती हैं। आइए कुबेरनेट्स पर लौटें और पीवीसी के लिए अपना मेनिफेस्ट संपादित करें - वहां आकार बढ़ाएं, उदाहरण के लिए, 7Gi तक।

आइए संपादित फ़ाइल लागू करें:

kubectl apply -f pvc.yaml

कोटा कैसे बदल गया है यह देखने के लिए आइए माउंटेड निर्देशिका पर नजर डालें:

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

इस कमांड को काम करने के लिए, आपको अपने सिस्टम पर पैकेज इंस्टॉल करने की आवश्यकता हो सकती है attr.

आँखें डरती हैं, और हाथ कर रहे हैं

ये सभी मंत्र और लंबे YAML मैनिफ़ेस्ट सतह पर जटिल लगते हैं, लेकिन व्यवहार में, स्लम के छात्र इन्हें बहुत जल्दी समझ जाते हैं।
इस लेख में हम जंगल में गहराई तक नहीं गए - इसके लिए आधिकारिक दस्तावेज मौजूद हैं। यदि आप कुबेरनेट्स क्लस्टर के साथ सेफ स्टोरेज स्थापित करने के विवरण में रुचि रखते हैं, तो ये लिंक मदद करेंगे:

वॉल्यूम के साथ काम करने वाले कुबेरनेट्स के सामान्य सिद्धांत
आरबीडी दस्तावेज़ीकरण
सेफ परिप्रेक्ष्य से आरबीडी और कुबेरनेट्स को एकीकृत करना
सीएसआई परिप्रेक्ष्य से आरबीडी और कुबेरनेट्स को एकीकृत करना
सामान्य सीईएफएफएस दस्तावेज़ीकरण
CSI परिप्रेक्ष्य से CephFS और Kubernetes को एकीकृत करना

स्लम कोर्स पर कुबेरनेट्स बेस आप थोड़ा आगे जा सकते हैं और कुबेरनेट्स में एक वास्तविक एप्लिकेशन तैनात कर सकते हैं जो फ़ाइल भंडारण के रूप में CephFS का उपयोग करेगा। GET/POST अनुरोधों के माध्यम से आप फ़ाइलों को सेफ में स्थानांतरित करने और उन्हें प्राप्त करने में सक्षम होंगे।

और यदि आप डेटा स्टोरेज में अधिक रुचि रखते हैं, तो इसके लिए साइन अप करें सेफ पर नया पाठ्यक्रम. जबकि बीटा परीक्षण चल रहा है, पाठ्यक्रम छूट पर प्राप्त किया जा सकता है और आप इसकी सामग्री को प्रभावित कर सकते हैं।

लेख के लेखक: अलेक्जेंडर श्वालोव, अभ्यास इंजीनियर Southbridge, प्रमाणित कुबेरनेट्स प्रशासक, स्लम पाठ्यक्रमों के लेखक और डेवलपर।

स्रोत: www.habr.com