Mfano wa vitendo wa kuunganisha hifadhi inayotegemea Ceph kwenye nguzo ya Kubernetes

Kiolesura cha Kuhifadhi Kontena (CSI) ni kiolesura kilichounganishwa kati ya Kubernetes na mifumo ya kuhifadhi. Tayari tumezungumza juu yake kwa ufupi aliiambia, na leo tutaangalia kwa karibu mchanganyiko wa CSI na Ceph: tutaonyesha jinsi gani unganisha hifadhi ya Ceph kwa nguzo ya Kubernetes.
Nakala hiyo inatoa mifano halisi, ingawa iliyorahisishwa kidogo kwa urahisi wa utambuzi. Hatuzingatii kusakinisha na kusanidi makundi ya Ceph na Kubernetes.

Je, unashangaa jinsi inavyofanya kazi?

Mfano wa vitendo wa kuunganisha hifadhi inayotegemea Ceph kwenye nguzo ya Kubernetes

Kwa hivyo, unayo nguzo ya Kubernetes kwenye vidole vyako, iliyotumwa, kwa mfano, kubespray. Kuna nguzo ya Ceph inayofanya kazi karibu - unaweza pia kuiweka, kwa mfano, na hii seti ya vitabu vya kucheza. Natumaini hakuna haja ya kutaja kwamba kwa ajili ya uzalishaji kati yao lazima iwe na mtandao na bandwidth ya angalau 10 Gbit / s.

Ikiwa unayo haya yote, twende!

Kwanza, wacha tuende kwenye moja ya nodi za nguzo za Ceph na angalia ikiwa kila kitu kiko sawa:

ceph health
ceph -s

Ifuatayo, tutaunda mara moja dimbwi la diski za RBD:

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

Wacha tuendelee kwenye nguzo ya Kubernetes. Huko, kwanza kabisa, tutaweka dereva wa Ceph CSI kwa RBD. Tutasakinisha, kama inavyotarajiwa, kupitia Helm.
Tunaongeza hazina na chati, tunapata seti ya vigeu vya chati ya ceph-csi-rbd:

helm repo add ceph-csi https://ceph.github.io/csi-charts
helm inspect values ceph-csi/ceph-csi-rbd > cephrbd.yml

Sasa unahitaji kujaza faili ya cephrbd.yml. Ili kufanya hivyo, tafuta kitambulisho cha nguzo na anwani za IP za wachunguzi katika Ceph:

ceph fsid  # Ρ‚Π°ΠΊ ΠΌΡ‹ ΡƒΠ·Π½Π°Π΅ΠΌ clusterID
ceph mon dump  # Π° Ρ‚Π°ΠΊ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ IP-адрСса ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΎΠ²

Tunaingiza maadili yaliyopatikana kwenye faili ya cephrbd.yml. Wakati huo huo, tunawezesha uundaji wa sera za PSP (Sera za Usalama wa Pod). Chaguzi katika sehemu nodeplugin ΠΈ mtoaji tayari kwenye faili, zinaweza kusahihishwa kama inavyoonyeshwa hapa chini:

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

Ifuatayo, kilichobaki kwetu ni kusakinisha chati katika nguzo ya Kubernetes.

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

Kubwa, dereva wa RBD anafanya kazi!
Hebu tuunde Darasa jipya la Hifadhi katika Kubernetes. Hii inahitaji tena kuchezea Ceph.

Tunaunda mtumiaji mpya katika Ceph na kumpa haki ya kuandika kwenye bwawa Mchemraba:

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

Sasa hebu tuone ufunguo wa ufikiaji bado upo:

ceph auth get-key client.rbdkube

Amri itatoa kitu kama hiki:

AQCO9NJbhYipKRAAMqZsnqqS/T8OYQX20xIa9A==

Wacha tuongeze dhamana hii kwa Siri katika nguzo ya Kubernetes - ambapo tunaihitaji ufunguo wa mtumiaji:

---
apiVersion: v1
kind: Secret
metadata:
  name: csi-rbd-secret
  namespace: ceph-csi-rbd
stringData:
  # ЗначСния ΠΊΠ»ΡŽΡ‡Π΅ΠΉ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ Π΅Π³ΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ, ΠΊΠ°ΠΊ ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π²
  # кластСрС Ceph. ID ΡŽΠ·Π΅Ρ€Π° Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ доступ ΠΊ ΠΏΡƒΠ»Ρƒ,
  # ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ Π² storage class
  userID: rbdkube
  userKey: <user-key>

Na tunaunda siri yetu:

kubectl apply -f secret.yaml

Ifuatayo, tunahitaji dhihirisho la StorageClass kitu kama hiki:

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

Inahitajika kujazwa clusterID, ambayo tayari tumejifunza na timu ceph fsid, na utumie faili hii ya maelezo kwa nguzo ya Kubernetes:

kubectl apply -f storageclass.yaml

Ili kuangalia jinsi vishada vinavyofanya kazi pamoja, hebu tuunde PVC ifuatayo (Madai ya Kiasi Kinachoendelea):

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: rbd-pvc
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: csi-rbd-sc

Wacha tuone mara moja jinsi Kubernetes aliunda kiasi kilichoombwa katika Ceph:

kubectl get pvc
kubectl get pv

Kila kitu kinaonekana kuwa nzuri! Je, hii inaonekanaje kwa upande wa Ceph?
Tunapata orodha ya juzuu kwenye dimbwi na kutazama habari kuhusu kiasi chetu:

rbd ls -p kube
rbd -p kube info csi-vol-eb3d257d-8c6c-11ea-bff5-6235e7640653  # Ρ‚ΡƒΡ‚, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅, Π±ΡƒΠ΄Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ID Ρ‚ΠΎΠΌΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹Π΄Π°Π»Π° прСдыдущая ΠΊΠΎΠΌΠ°Π½Π΄Π°

Sasa hebu tuone jinsi kubadilisha ukubwa wa kiasi cha RBD kunavyofanya kazi.
Badilisha ukubwa wa sauti katika faili ya maelezo ya pvc.yaml hadi 2Gi na uitumie:

kubectl apply -f pvc.yaml

Wacha tusubiri mabadiliko yaanze na tuangalie saizi ya sauti tena.

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

kubectl get pv
kubectl get pvc

Tunaona kwamba ukubwa wa PVC haujabadilika. Ili kujua ni kwa nini, unaweza kuuliza Kubernetes kwa maelezo ya YAML ya PVC:

kubectl get pvc rbd-pvc -o yaml

Hili hapa tatizo:

ujumbe: Inasubiri mtumiaji (re-) kuanzisha ganda ili kumaliza urekebishaji wa mfumo wa faili wa kiasi kwenye nodi. aina: FileSystemResizePending

Hiyo ni, disk imeongezeka, lakini mfumo wa faili juu yake haujawa.
Ili kukuza mfumo wa faili, unahitaji kuweka kiasi. Katika nchi yetu, PVC/PV iliyoundwa haitumiwi sasa kwa njia yoyote.

Tunaweza kuunda Pod ya majaribio, kwa mfano kama hii:

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

Na sasa hebu tuangalie PVC:

kubectl get pvc

Ukubwa umebadilika, kila kitu ni sawa.

Katika sehemu ya kwanza, tulifanya kazi na kifaa cha kuzuia RBD (inasimama kwa Rados Block Device), lakini hii haiwezi kufanyika ikiwa microservices tofauti zinahitaji kufanya kazi na diski hii wakati huo huo. CephFS inafaa zaidi kwa kufanya kazi na faili badala ya picha za diski.
Kwa kutumia mfano wa makundi ya Ceph na Kubernetes, tutasanidi CSI na huluki nyingine muhimu ili kufanya kazi na CephFS.

Wacha tupate maadili kutoka kwa chati mpya ya Helm tunayohitaji:

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

Tena unahitaji kujaza faili ya cephfs.yml. Kama hapo awali, amri za Ceph zitasaidia:

ceph fsid
ceph mon dump

Jaza faili na maadili kama haya:

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

Tafadhali kumbuka kuwa anwani za ufuatiliaji zimebainishwa katika fomu rahisi ya anwani:bandari. Kuweka cephfs kwenye nodi, anwani hizi huhamishiwa kwenye moduli ya kernel, ambayo bado haijui jinsi ya kufanya kazi na itifaki ya kufuatilia v2.
Tunabadilisha bandari kwa ajili ya httpMetrics (Prometheus itaenda huko kwa vipimo vya ufuatiliaji) ili isipingane na seva mbadala ya nginx, ambayo imesakinishwa na Kubespray. Huenda usihitaji hili.

Sakinisha chati ya Helm katika nguzo ya Kubernetes:

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

Wacha tuende kwenye duka la data la Ceph ili kuunda mtumiaji tofauti hapo. Nyaraka zinasema kuwa mtoaji wa CephFS anahitaji haki za ufikiaji wa msimamizi wa nguzo. Lakini tutaunda mtumiaji tofauti fs na haki chache:

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'

Na wacha tuangalie mara moja ufunguo wake wa ufikiaji, tutauhitaji baadaye:

ceph auth get-key client.fs

Wacha tuunde Siri tofauti na Darasa la Hifadhi.
Hakuna jipya, tayari tumeona hili kwa mfano wa RBD:

---
apiVersion: v1
kind: Secret
metadata:
  name: csi-cephfs-secret
  namespace: ceph-csi-cephfs
stringData:
  # НСобходимо для динамичСски создаваСмых Ρ‚ΠΎΠΌΠΎΠ²
  adminID: fs
  adminKey: <Π²Ρ‹Π²ΠΎΠ΄ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹>

Utumiaji wa faili ya maelezo:

kubectl apply -f secret.yaml

Na sasa - StorageClass tofauti:

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

Hebu tujaze hapa clusterID na inatumika katika Kubernetes:

kubectl apply -f storageclass.yaml

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°

Kuangalia, kama katika mfano uliopita, wacha tuunda PVC:

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

Na angalia uwepo wa PVC/PV:

kubectl get pvc
kubectl get pv

Ikiwa unataka kuangalia faili na saraka katika CephFS, unaweza kuweka mfumo huu wa faili mahali fulani. Kwa mfano kama inavyoonyeshwa hapa chini.

Wacha tuende kwenye moja ya nodi za nguzo za Ceph na tufanye vitendo vifuatavyo:

# Π’ΠΎΡ‡ΠΊΠ° монтирования
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

Kwa kweli, kuweka FS kwenye nodi ya Ceph kama hii inafaa tu kwa madhumuni ya mafunzo, ambayo ndio tunafanya kwenye yetu. Kozi za slurm. Sidhani kama mtu yeyote angefanya hivi katika toleo la umma; kuna hatari kubwa ya kufuta faili muhimu kwa bahati mbaya.

Na mwishowe, wacha tuangalie jinsi mambo yanavyofanya kazi na kurekebisha ukubwa katika kesi ya CephFS. Hebu turejee Kubernetes na kuhariri faili yetu ya maelezo ya PVC - ongeza saizi hapo, kwa mfano, hadi 7Gi.

Wacha tutumie faili iliyohaririwa:

kubectl apply -f pvc.yaml

Wacha tuangalie saraka iliyowekwa ili kuona jinsi upendeleo umebadilika:

getfattr -n ceph.quota.max_bytes <ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³-с-Π΄Π°Π½Π½Ρ‹ΠΌΠΈ>

Ili amri hii ifanye kazi, huenda ukahitaji kusakinisha kifurushi kwenye mfumo wako attr.

Macho yanaogopa, lakini mikono hufanya hivyo

Taharuki hizi zote na maonyesho marefu ya YAML yanaonekana kuwa magumu kwenye uso, lakini kiutendaji, wanafunzi wa Slurm huzipata kwa haraka sana.
Katika nakala hii hatukuingia ndani kabisa ya msitu - kuna nyaraka rasmi za hiyo. Ikiwa una nia ya maelezo ya kusanidi hifadhi ya Ceph na nguzo ya Kubernetes, viungo hivi vitasaidia:

Kanuni za jumla za Kubernetes kufanya kazi na juzuu
Nyaraka za RBD
Kuunganisha RBD na Kubernetes kutoka kwa mtazamo wa Ceph
Kuunganisha RBD na Kubernetes kutoka kwa mtazamo wa CSI
Hati ya jumla ya CephFS
Kuunganisha CephFS na Kubernetes kutoka kwa mtazamo wa CSI

Kwenye kozi ya Slurm Msingi wa Kubernetes unaweza kwenda mbele kidogo na kupeleka programu-tumizi halisi katika Kubernetes ambayo itatumia CephFS kama hifadhi ya faili. Kupitia maombi ya GET/POST utaweza kuhamisha faili hadi na kuzipokea kutoka kwa Ceph.

Na ikiwa una nia zaidi ya kuhifadhi data, basi jiandikishe kozi mpya ya Ceph. Wakati jaribio la beta likiendelea, kozi inaweza kupatikana kwa punguzo na unaweza kuathiri maudhui yake.

Mwandishi wa makala: Alexander Shvalov, mhandisi wa mazoezi Southbridge, Msimamizi Aliyeidhinishwa wa Kubernetes, mwandishi na msanidi wa kozi za Slurm.

Chanzo: mapenzi.com