Ceph-அடிப்படையிலான சேமிப்பகத்தை Kubernetes கிளஸ்டருடன் இணைப்பதற்கான நடைமுறை உதாரணம்

கொள்கலன் சேமிப்பக இடைமுகம் (சிஎஸ்ஐ) என்பது குபெர்னெட்டஸ் மற்றும் சேமிப்பக அமைப்புகளுக்கு இடையிலான ஒரு ஒருங்கிணைந்த இடைமுகமாகும். நாங்கள் ஏற்கனவே சுருக்கமாகப் பேசியுள்ளோம் கூறினார், மற்றும் இன்று நாம் CSI மற்றும் Ceph ஆகியவற்றின் கலவையை உன்னிப்பாகப் பார்ப்போம்: எப்படி என்பதைக் காண்பிப்போம் Ceph சேமிப்பகத்தை இணைக்கவும் குபெர்னெட்ஸ் கிளஸ்டருக்கு.
கட்டுரை உண்மையானது, இருப்பினும் எளிதாக உணர்தலுக்கு சற்று எளிமைப்படுத்தப்பட்ட எடுத்துக்காட்டுகளை வழங்குகிறது. Ceph மற்றும் Kubernetes கிளஸ்டர்களை நிறுவி உள்ளமைப்பதை நாங்கள் கருத்தில் கொள்ளவில்லை.

இது எப்படி வேலை செய்கிறது என்று யோசிக்கிறீர்களா?

Ceph-அடிப்படையிலான சேமிப்பகத்தை Kubernetes கிளஸ்டருடன் இணைப்பதற்கான நடைமுறை உதாரணம்

எனவே, உங்கள் விரல் நுனியில் ஒரு குபெர்னெட்ஸ் கிளஸ்டர் உள்ளது, எடுத்துக்காட்டாக, குபேஸ்ப்ரே. அருகில் ஒரு செஃப் கிளஸ்டர் வேலை செய்கிறது - நீங்கள் அதை நிறுவலாம், எடுத்துக்காட்டாக, இதனுடன் விளையாட்டு புத்தகங்களின் தொகுப்பு. அவற்றுக்கிடையே உற்பத்திக்கு குறைந்தபட்சம் 10 ஜிபிட்/வி அலைவரிசை கொண்ட நெட்வொர்க் இருக்க வேண்டும் என்று குறிப்பிட வேண்டிய அவசியமில்லை என்று நம்புகிறேன்.

இதெல்லாம் இருந்தால் போகட்டும்!

முதலில், Ceph கிளஸ்டர் முனைகளில் ஒன்றிற்குச் சென்று, எல்லாம் ஒழுங்காக இருக்கிறதா என்று சரிபார்க்கவும்:

ceph health
ceph -s

அடுத்து, RBD வட்டுகளுக்கு உடனடியாக ஒரு குளத்தை உருவாக்குவோம்:

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

குபெர்னெட்ஸ் கிளஸ்டருக்கு செல்லலாம். அங்கு, முதலில், 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) உருவாக்குவதை நாங்கள் செயல்படுத்துகிறோம். பிரிவுகளில் விருப்பங்கள் 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

அருமை, RBD இயக்கி வேலை செய்கிறது!
குபெர்னெட்டஸில் புதிய ஸ்டோரேஜ் கிளாஸை உருவாக்குவோம். இதற்கு மீண்டும் 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

அடுத்து, நமக்கு இது போன்ற ஒரு ஸ்டோரேஜ் கிளாஸ் மேனிஃபெஸ்ட் தேவை:

---
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, மற்றும் இந்த மேனிஃபெஸ்டை குபெர்னெட்ஸ் கிளஸ்டருக்குப் பயன்படுத்தவும்:

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

Ceph இல் Kubernetes கோரப்பட்ட தொகுதியை எவ்வாறு உருவாக்கினார் என்பதை உடனடியாகப் பார்ப்போம்:

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 இன் அளவு மாறவில்லை என்பதை நாம் காண்கிறோம். ஏன் என்பதை அறிய, 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

இப்போது PVC ஐப் பார்ப்போம்:

kubectl get pvc

அளவு மாறிவிட்டது, எல்லாம் நன்றாக இருக்கிறது.

முதல் பகுதியில், நாங்கள் RBD பிளாக் சாதனத்துடன் பணிபுரிந்தோம் (இது ரேடோஸ் பிளாக் சாதனத்தைக் குறிக்கிறது), ஆனால் வெவ்வேறு மைக்ரோ சர்வீஸ்கள் இந்த வட்டுடன் ஒரே நேரத்தில் வேலை செய்ய வேண்டுமானால் இதைச் செய்ய முடியாது. 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

மானிட்டர் முகவரிகள் எளிமையான வடிவத்தில் முகவரி:port இல் குறிப்பிடப்பட்டுள்ளன என்பதை நினைவில் கொள்ளவும். ஒரு முனையில் cephfs ஐ ஏற்ற, இந்த முகவரிகள் கர்னல் தொகுதிக்கு அனுப்பப்படும், இது இன்னும் v2 மானிட்டர் நெறிமுறையுடன் எவ்வாறு செயல்படுவது என்று தெரியவில்லை.
நாங்கள் httpMetrics க்கான போர்ட்டை மாற்றுகிறோம் (அளவீடுகளை கண்காணிப்பதற்காக ப்ரோமிதியஸ் அங்கு செல்வார்) அதனால் அது Kubespray ஆல் நிறுவப்பட்ட nginx-proxy உடன் முரண்படாது. உங்களுக்கு இது தேவையில்லாமல் இருக்கலாம்.

குபெர்னெட்ஸ் கிளஸ்டரில் ஹெல்ம் விளக்கப்படத்தை நிறுவவும்:

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

அதை இங்கே நிரப்புவோம் கிளஸ்டர் ஐடி மற்றும் குபெர்னெட்டஸில் பொருந்தும்:

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

நிச்சயமாக, இது போன்ற ஒரு Ceph முனையில் FS ஐ ஏற்றுவது பயிற்சி நோக்கங்களுக்காக மட்டுமே பொருத்தமானது, இதைத்தான் நாங்கள் செய்கிறோம் ஸ்லர்ம் படிப்புகள். தயாரிப்பில் யாரும் இதைச் செய்வார்கள் என்று நான் நினைக்கவில்லை; முக்கியமான கோப்புகளை தற்செயலாக அழிக்க அதிக ஆபத்து உள்ளது.

இறுதியாக, CephFS விஷயத்தில் அளவுகளை மறுஅளவிடுவதன் மூலம் விஷயங்கள் எவ்வாறு செயல்படுகின்றன என்பதைச் சரிபார்க்கலாம். குபெர்னெட்டஸுக்குத் திரும்பி, PVCக்கான எங்கள் மேனிஃபெஸ்ட்டைத் திருத்துவோம் - அங்கு அளவை அதிகரிக்கவும், எடுத்துக்காட்டாக, 7Gi.

திருத்தப்பட்ட கோப்பைப் பயன்படுத்துவோம்:

kubectl apply -f pvc.yaml

ஒதுக்கீடு எவ்வாறு மாறியது என்பதைப் பார்க்க ஏற்றப்பட்ட கோப்பகத்தைப் பார்ப்போம்:

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

இந்த கட்டளை வேலை செய்ய, உங்கள் கணினியில் தொகுப்பை நிறுவ வேண்டும் attr.

கண்கள் பயப்படுகின்றன, ஆனால் கைகள் பயப்படுகின்றன

இந்த எழுத்துப்பிழைகள் மற்றும் நீண்ட YAML வெளிப்பாடுகள் மேற்பரப்பில் சிக்கலானதாகத் தெரிகிறது, ஆனால் நடைமுறையில், ஸ்லர்ம் மாணவர்கள் அவற்றை மிக விரைவாகப் பெறுகிறார்கள்.
இந்த கட்டுரையில் நாங்கள் காட்டில் ஆழமாக செல்லவில்லை - அதற்கான அதிகாரப்பூர்வ ஆவணங்கள் உள்ளன. குபெர்னெட்ஸ் கிளஸ்டருடன் Ceph சேமிப்பகத்தை அமைப்பது குறித்த விவரங்களில் நீங்கள் ஆர்வமாக இருந்தால், இந்த இணைப்புகள் உதவும்:

தொகுதிகளுடன் பணிபுரியும் குபெர்னெட்டஸின் பொதுவான கொள்கைகள்
RBD ஆவணம்
Ceph கண்ணோட்டத்தில் RBD மற்றும் Kubernetes ஐ ஒருங்கிணைத்தல்
CSI கண்ணோட்டத்தில் RBD மற்றும் Kubernetes ஐ ஒருங்கிணைத்தல்
பொது CephFS ஆவணம்
CSI கண்ணோட்டத்தில் CephFS மற்றும் Kubernetes ஆகியவற்றை ஒருங்கிணைத்தல்

ஸ்லர்ம் போக்கில் குபெர்னெட்டஸ் தளம் நீங்கள் இன்னும் சிறிது தூரம் சென்று, CephFSஐ கோப்பு சேமிப்பகமாகப் பயன்படுத்தும் உண்மையான பயன்பாட்டை குபெர்னெட்ஸில் பயன்படுத்தலாம். GET/POST கோரிக்கைகள் மூலம் நீங்கள் கோப்புகளை Ceph க்கு மாற்றலாம் மற்றும் பெறலாம்.

நீங்கள் தரவு சேமிப்பகத்தில் அதிக ஆர்வமாக இருந்தால், பதிவு செய்யவும் Ceph பற்றிய புதிய பாடநெறி. பீட்டா சோதனை நடந்து கொண்டிருக்கும் போது, ​​பாடத்திட்டத்தை தள்ளுபடியில் பெறலாம் மற்றும் அதன் உள்ளடக்கத்தை நீங்கள் பாதிக்கலாம்.

கட்டுரையின் ஆசிரியர்: அலெக்சாண்டர் ஷ்வலோவ், பயிற்சி பொறியாளர் சவுத்பிரிட்ஜ், சான்றளிக்கப்பட்ட குபெர்னெட்ஸ் நிர்வாகி, ஸ்லர்ம் படிப்புகளின் ஆசிரியர் மற்றும் டெவலப்பர்.

ஆதாரம்: www.habr.com