कंटेनर स्टोरेज इंटरफ़ेस (सीएसआई) कुबेरनेट्स और स्टोरेज सिस्टम के बीच एक एकीकृत इंटरफ़ेस है। हम पहले ही इसके बारे में संक्षेप में बात कर चुके हैं
लेख वास्तविक, यद्यपि धारणा में आसानी के लिए थोड़ा सरलीकृत उदाहरण प्रदान करता है। हम सेफ और कुबेरनेट्स क्लस्टर को स्थापित और कॉन्फ़िगर करने पर विचार नहीं करते हैं।
क्या आप सोच रहे हैं कि यह कैसे काम करता है?
तो, आपके पास अपनी उंगलियों पर एक Kubernetes क्लस्टर है, उदाहरण के लिए, तैनात किया गया है,
यदि आपके पास यह सब है, तो चलें!
सबसे पहले, आइए सेफ क्लस्टर नोड्स में से एक पर जाएं और जांचें कि सब कुछ क्रम में है:
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 मैनिफ़ेस्ट सतह पर जटिल लगते हैं, लेकिन व्यवहार में, स्लम के छात्र इन्हें बहुत जल्दी समझ जाते हैं।
इस लेख में हम जंगल में गहराई तक नहीं गए - इसके लिए आधिकारिक दस्तावेज मौजूद हैं। यदि आप कुबेरनेट्स क्लस्टर के साथ सेफ स्टोरेज स्थापित करने के विवरण में रुचि रखते हैं, तो ये लिंक मदद करेंगे:
स्लम कोर्स पर
और यदि आप डेटा स्टोरेज में अधिक रुचि रखते हैं, तो इसके लिए साइन अप करें
लेख के लेखक: अलेक्जेंडर श्वालोव, अभ्यास इंजीनियर
स्रोत: www.habr.com