Ceph-en oinarritutako biltegiratzea Kubernetes kluster batera konektatzearen adibide praktikoa

Container Storage Interface (CSI) Kubernetes eta biltegiratze sistemen arteko interfaze bateratua da. Dagoeneko laburki hitz egin dugu esan, eta gaur CSI eta Ceph-en konbinazioa gertutik aztertuko dugu: nola erakutsiko dugu konektatu Ceph biltegia Kubernetes klusterera.
Artikuluak adibide errealak eskaintzen ditu, nahiz eta apur bat sinplifikatuak hautemateko erraztasunerako. Ez dugu kontuan hartzen Ceph eta Kubernetes klusterrak instalatzea eta konfiguratzea.

Nola funtzionatzen duen galdetzen al duzu?

Ceph-en oinarritutako biltegiratzea Kubernetes kluster batera konektatzearen adibide praktikoa

Beraz, Kubernetes kluster bat duzu eskura, zabalduta, adibidez, kubespray. Inguruan Ceph kluster bat dago lanean; adibidez, honekin instala dezakezu jolas-liburu multzo bat. Espero dut ez dagoela aipatu beharrik haien arteko produkziorako gutxienez 10 Gbit/s-ko banda zabalera duen sare bat egon behar dela.

Hau guztia baduzu, goazen!

Lehenik eta behin, joan gaitezen Ceph klusterreko nodo batera eta egiaztatu dena ondo dagoela:

ceph health
ceph -s

Ondoren, berehala sortuko dugu RBD diskoetarako igerileku bat:

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

Goazen Kubernetes klusterera. Bertan, lehenik eta behin, RBDrako Ceph CSI kontrolatzailea instalatuko dugu. Helm-en bidez instalatuko dugu, espero bezala.
Diagrama batekin biltegi bat gehitzen dugu, ceph-csi-rbd grafikorako aldagai multzo bat lortzen dugu:

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

Orain cephrbd.yml fitxategia bete behar duzu. Horretarako, ezagutu Ceph-eko monitoreen kluster IDa eta IP helbideak:

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

Lortutako balioak cephrbd.yml fitxategian sartzen ditugu. Aldi berean, PSP politikak (Pod Security Policies) sortzea ahalbidetzen dugu. Aukerak ataletan nodeplugin ΠΈ hornitzaile Dagoeneko fitxategian, zuzendu daitezke behean erakusten den moduan:

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

Ondoren, Kubernetes klusterrean taula instalatzea besterik ez zaigu geratzen.

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

Bikaina, RBD kontrolatzaileak funtzionatzen du!
Sortu dezagun StorageClass berri bat Kubernetes-en. Honek berriro ere Ceph-ekin txikitu pixka bat eskatzen du.

Ceph-en erabiltzaile berri bat sortzen dugu eta igerilekuan idazteko eskubideak ematen dizkiogu Kube:

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

Orain ikus dezagun sarbide-gakoa oraindik hor dagoela:

ceph auth get-key client.rbdkube

Komandoak honelako zerbait aterako du:

AQCO9NJbhYipKRAAMqZsnqqS/T8OYQX20xIa9A==

Gehi diezaiogun balio hau Kubernetes klusterrean Secretari, behar dugun tokian erabiltzaile-gakoa:

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

Eta gure sekretua sortzen dugu:

kubectl apply -f secret.yaml

Ondoren, StorageClass manifestu bat behar dugu honelako zerbait:

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

Bete behar da clusterID, taldeak dagoeneko ikasi duguna ceph fsid, eta aplikatu manifestu hau Kubernetes klusterrean:

kubectl apply -f storageclass.yaml

Klusterrak elkarrekin nola funtzionatzen duten egiaztatzeko, sor dezagun honako PVC (Bolumien Erreklamazio Iraunkorra):

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

Ikus dezagun berehala Kubernetes-ek Ceph-en eskatutako bolumena nola sortu zuen:

kubectl get pvc
kubectl get pv

Dena bikaina omen da! Zer itxura du honek Ceph aldean?
Igerilekuan bolumenen zerrenda bat jasotzen dugu eta gure bolumenari buruzko informazioa ikusten dugu:

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

Orain ikus dezagun nola funtzionatzen duen RBD bolumen baten tamaina aldatzea.
Aldatu pvc.yaml manifestuaren bolumenaren tamaina 2Gi-ra eta aplikatu:

kubectl apply -f pvc.yaml

Itxaron dezagun aldaketak eragina izan arte eta begiratu berriro bolumenaren tamaina.

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

kubectl get pv
kubectl get pvc

PVCaren tamaina ez dela aldatu ikusten dugu. Zergatik jakiteko, Kubernetes kontsulta dezakezu PVCaren YAML deskribapen bat:

kubectl get pvc rbd-pvc -o yaml

Hona hemen arazoa:

mezua: Erabiltzaileak pod bat (berriro) abiarazteko zain, fitxategi-sistemaren bolumenaren tamaina aldatzeko nodoan amaitzeko. mota: FileSystemResizePending

Hau da, diskoa hazi egin da, baina bertan dagoen fitxategi-sistema ez.
Fitxategi-sistema hazteko, bolumena muntatu behar duzu. Gurean, gaur egun sortutako PVC/PV ez da inola ere erabiltzen.

Test Pod bat sor dezakegu, adibidez, honela:

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

Eta orain ikus dezagun PVC-a:

kubectl get pvc

Tamaina aldatu da, dena ondo dago.

Lehenengo zatian, RBD bloke gailuarekin lan egin dugu (Rados Block Device esan nahi du), baina hori ezin da egin mikrozerbitzu ezberdinek disko honekin aldi berean lan egin behar badute. CephFS askoz ere egokia da diskoko irudiekin baino fitxategiekin lan egiteko.
Ceph eta Kubernetes klusterren adibidea erabiliz, CSI eta beharrezko beste entitate batzuk konfiguratuko ditugu CephFS-ekin lan egiteko.

Lor ditzagun balioak behar dugun Helm grafiko berritik:

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

Berriz ere cephfs.yml fitxategia bete behar duzu. Lehen bezala, Ceph komandoek lagunduko dute:

ceph fsid
ceph mon dump

Bete fitxategia honelako balioekin:

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

Kontuan izan monitoreen helbideak formulario sinplean helbide:portuan zehazten direla. Cephfs nodo batean muntatzeko, helbide hauek nukleoaren modulura transferitzen dira, zeinak oraindik ez daki nola funtzionatzen duen v2 monitorearen protokoloarekin.
httpMetrics-en ataka aldatzen dugu (Prometheus hara joango da metrikak monitorizatzeko), Kubespray-k instalatzen duen nginx-proxy-rekin gatazkarik egon ez dadin. Baliteke hau behar ez izatea.

Instalatu Helm diagrama Kubernetes klusterrean:

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

Goazen Ceph datu-biltegira hor aparteko erabiltzaile bat sortzeko. Dokumentazioak dio CephFS hornitzaileak klusterreko administratzaileen sarbide-eskubideak behar dituela. Baina erabiltzaile bereizi bat sortuko dugu fs eskubide mugatuekin:

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'

Eta berehala ikus dezagun bere sarbide-gakoa, geroago beharko dugu:

ceph auth get-key client.fs

Sor ditzagun Secret eta StorageClass bereiziak.
Ezer berririk ez, RBDren adibidean hau ikusi dugu jada:

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

Manifestua aplikatzea:

kubectl apply -f secret.yaml

Eta orain - StorageClass bereizi bat:

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

Bete dezagun hemen clusterID eta Kubernetes-en aplikagarria:

kubectl apply -f storageclass.yaml

ikuskatzeko

Egiaztatzeko, aurreko adibidean bezala, sor dezagun PVC bat:

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

Eta egiaztatu PVC/PVren presentzia:

kubectl get pvc
kubectl get pv

CephFS-ko fitxategiak eta direktorioak begiratu nahi badituzu, fitxategi-sistema hau nonbait munta dezakezu. Adibidez, behean erakusten den moduan.

Goazen Ceph klusterreko nodo batera eta egin ditzagun ekintza hauek:

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

Jakina, FS horrelako Ceph nodo batean muntatzea prestakuntza helburuetarako soilik egokia da, hau da, gurean egiten duguna. Slurm ikastaroak. Ez dut uste inork hori egingo lukeenik ekoizpenean; fitxategi garrantzitsuak ustekabean ezabatzeko arrisku handia dago.

Eta, azkenik, egiazta dezagun gauzak nola funtzionatzen duten bolumenak tamaina aldatzearekin CephFS-en kasuan. Itzul gaitezen Kubernetesera eta editatu gaitezen PVCrako manifestua - handitu han tamaina, adibidez, 7Gi-ra.

Aplikatu dezagun editatutako fitxategia:

kubectl apply -f pvc.yaml

Ikus dezagun muntatutako direktoriora kuota nola aldatu den ikusteko:

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

Komando honek funtziona dezan, baliteke paketea zure sisteman instalatu behar izatea attr.

Begiak beldur dira, baina eskuak bai

Sorginkeria eta YAML manifestu luze hauek guztiak konplikatuak dirudite azalean, baina praktikan, Slurm-eko ikasleek nahiko azkar lortzen dituzte.
Artikulu honetan ez gara oihanean sakondu - horretarako dokumentazio ofiziala dago. Ceph biltegiratzea Kubernetes kluster batekin konfiguratzeko xehetasunak interesatzen bazaizkizu, esteka hauek lagunduko dizute:

Kubernetes bolumenekin lan egiteko printzipio orokorrak
RBD Dokumentazioa
RBD eta Kubernetes integratzea Ceph ikuspegitik
RBD eta Kubernetes integratzea CSI ikuspegitik
CephFS Dokumentazio Orokorra
CephFS eta Kubernetes integratzea CSI ikuspegitik

Slurm ikastaroan Kubernetes Base harago joan zaitezke eta CephFS fitxategien biltegiratze gisa erabiliko duen Kubernetesen aplikazio erreal bat zabaldu dezakezu. GET/POST eskaeren bidez fitxategiak transferitu eta Ceph-etik jaso ahal izango dituzu.

Eta datuak biltegiratzean gehiago interesatzen bazaizu, eman izena Ceph-i buruzko ikastaro berria. Beta proba egiten ari den bitartean, ikastaroa deskontu batekin lor daiteke eta bere edukian eragin dezakezu.

Artikuluaren egilea: Alexander Shvalov, ingeniari praktikatzailea Southbridge, Kubernetes Ziurtatutako Administratzaile, Slurm ikastaroen egilea eta garatzailea.

Iturria: www.habr.com