Praktični primjer povezivanja Ceph pohrane u Kubernetes klaster

Container Storage Interface (CSI) je jedinstveni sučelje za interakciju između Kubernetesa i sustava za pohranu podataka. O njemu smo već ukratko govorili, a danas ćemo detaljnije razmotriti vezu između CSI i Cepha: pokazat ćemo kako povezati Ceph pohranu s Kubernetes klasterom.
U članku su navedeni stvarni, iako malo pojednostavljeni primjeri za bolju razumljivost. Instalaciju i konfiguraciju Ceph i Kubernetes klastera ne razmatramo.

Zanima vas kako to funkcionira?

Praktični primjer povezivanja Ceph pohrane u Kubernetes klaster

Dakle, imate pod rukom Kubernetes klaster, razvedren, na primjer, kubespray. U blizini radi Ceph klaster — također ga možete instalirati, na primjer, ovim setom playbookova. Nadam se da nije potrebno spominjati da između njih mora biti mreža s propusnom moći od najmanje 10 Gb/s.

Ako sve to imate, idemo!

Prvo ćemo otići na jedan od nodova Ceph klastera i provjeriti je li sve u redu:

ceph health
ceph -s

Zatim ćemo odmah stvoriti bazen za RBD diskove:

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

Prelazimo u Kubernetes klaster. Tamo ćemo prvo instalirati Ceph CSI drajver za RBD. Instalirat ćemo ga, kao što i odgovara, putem Helma.
Dodajemo repozitorij s chartom i dobivamo set varijabli chart-a ceph-csi-rbd:

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

Sada trebate ispuniti datoteku cephrbd.yml. Za to saznajemo ID klastera i IP adrese monitora u Ceph-u:

ceph fsid  # ovako saznajemo clusterID
ceph mon dump  # a ovako vidimo IP adrese monitora

Dobivene vrijednosti unosimo u datoteku cephrbd.yml. Usput uključujemo stvaranje politika PSP (Pod Security Policies). Opcije u odjeljcima nodeplugin i provisioner već postoje u datoteci, one se mogu ispraviti na način kako je prikazano u nastavku:

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

Sve što nam preostaje jest instalirati chart u Kubernetes klaster.

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

Odlično, RBD drajver radi!
Stvorimo novu StorageClass u Kubernetesu. Za to će ponovno biti potrebno malo raditi s Ceph-om.

Stvaramo novog korisnika u Ceph-u i dodjeljujemo mu prava za pisanje u bazen kube:

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

A sada pogledajmo pristupni ključ na istom mjestu:

ceph auth get-key client.rbdkube

Komanda će izdati nešto poput ovoga:

AQCO9NJbhYipKRAAMqZsnqqS/T8OYQX20xIa9A==

Unesemo ovu vrijednost u tajnu u Kubernetes klasteru — tamo gdje je potrebna userKey:

---
apiVersion: v1
kind: Secret
metadata:
  name: csi-rbd-secret
  namespace: ceph-csi-rbd
stringData:
  # Vrijednosti ključeva odgovaraju imenu korisnika i njegovom ključu, kako je navedeno u
  # Ceph klasteru. ID korisnika mora imati pristup bazenu,
  # navedenom u storage class
  userID: rbdkube
  userKey:

I kreiramo našu tajnu:

kubectl apply -f secret.yaml

Sljedeći nam je potreban otprilike ovakav manifest StorageClass:

---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
   name: csi-rbd-sc
provisioner: rbd.csi.ceph.com
parameters:
   clusterID: 
   pool: kube

   imageFeatures: layering

   # Ove tajne moraju sadržavati podatke za autorizaciju
   # u vaš bazen.
   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

Potrebno je ispuniti clusterID, koji smo već saznali naredbom ceph fsid, i primijeniti ovaj manifest u Kubernetes klasteru:

kubectl apply -f storageclass.yaml

Da provjerimo rad klastera zajedno, stvorit ćemo ovakav PVC (Persistent Volume Claim):

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

Odmah ćemo provjeriti kako je Kubernetes stvorio traženi volumen u Ceph-u:

kubectl get pvc
kubectl get pv

Izgleda odlično! A kako to izgleda sa strane Ceph-a?
Dobijamo popis volumena u bazenu i pregledavamo informacije o našem volumenu:

rbd ls -p kube
rbd -p kube info csi-vol-eb3d257d-8c6c-11ea-bff5-6235e7640653  # ovdje će, naravno, biti drugi ID volumena koji je prethodna naredba vratila

Sada ćemo pogledati kako radi promjena veličine RBD volumena.
Mijenjamo veličinu volumena u manifestu pvc.yaml na 2Gi i primjenjujemo ga:

kubectl apply -f pvc.yaml

Pričekajmo da promjene stupe na snagu i još jednom provjerimo veličinu volumena.

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

kubectl get pv
kubectl get pvc

Vidimo da se veličina PVC-a nije promijenila. Da bismo saznali razlog, možemo zatražiti od Kubernetes-a opis PVC-a u YAML formatu:

kubectl get pvc rbd-pvc -o yaml

I evo problema:

message: Waiting for user to (re-)start a pod to finish file system resize of volume on node. type: FileSystemResizePending

Dakle, disk se povećao, ali datotečni sustav na njemu — ne.
Da bismo povećali datotečni sustav, moramo montirati volumen. Naš stvoreni PVC/PV trenutno se ni na koji način ne koristi.

Možemo stvoriti testni Pod, na primjer ovako:

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

I sada pogledajmo PVC:

kubectl get pvc

Veličina se promijenila, sve je u redu.

U prvom dijelu smo radili s blok uređajem RBD (to je skraćenica za Rados Block Device), ali to se ne može raditi ako različiti mikroservisi trebaju istovremeno raditi s ovim diskom. Za rad s datotekama, a ne s slikom diska, mnogo bolje odgovara CephFS.
Na primjeru klastera Ceph i Kubernetes postavit ćemo CSI i ostale potrebne entitete za rad s CephFS.

Dohvatimo vrijednosti iz potrebnog novog Helm-charta:

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

Ponovno je potrebno ispuniti datoteku cephfs.yml. Kao i ranije, pomoći će nam Ceph naredbe:

ceph fsid
ceph mon dump

Ispunjavajući datoteku sa vrijednostima približno ovako:

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

Obratite pažnju da su adrese monitora navedene u jednostavnom obliku address:port. Za montiranje cephfs na čvor, ove adrese se prosljeđuju u kernel modul, koji još ne zna raditi s v2 protokol monitora.
Port za httpMetrics (gdje će Prometheus ići po metrika za nadgledanje) mijenjamo kako se ne bi sukobljavao s nginx-proxy, koji se instalira Kubespray-om. Možda vam to neće biti potrebno.

Instaliramo Helm-chart u Kubernetes klaster:

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

Prelazimo na Ceph spremište podataka kako bismo tamo stvorili posebnog korisnika. U dokumentaciji se navodi da provizoru CephFS trebaju administratorska prava pristupa klasteru. No stvorit ćemo posebnog korisnika fs s ograničenim pravima:

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'

I odmah ćemo pogledati njegov pristupni ključ, trebat će nam kasnije:

ceph auth get-key client.fs

Stvorimo posebne Secret i StorageClass.
Nema ništa novog, već smo to vidjeli na primjeru RBD:

---
apiVersion: v1
kind: Secret
metadata:
  name: csi-cephfs-secret
  namespace: ceph-csi-cephfs
stringData:
  # Potrebno za dinamički kreirane volumene
  adminID: fs
  adminKey:

Primjenjujemo manifest:

kubectl apply -f secret.yaml

A sada – poseban StorageClass:

---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: csi-cephfs-sc
provisioner: cephfs.csi.ceph.com
parameters:
  clusterID: 

  # Ime CephFS datotečnog sustava u kojem će se stvoriti volumen
  fsName: cephfs

  # (opcionalno) Ceph bazen u kojem će se pohranjivati podaci volumena
  # pool: cephfs_data

  # (opcionalno) Opcije montaže odvojene zarezima za Ceph-fuse
  # na primjer:
  # fuseMountOptions: debug

  # (opcionalno) Opcije montaže CephFS za kernel, odvojene zarezima
  # Pogledajte man mount.ceph za popis ovih opcija. Na primjer:
  # kernelMountOptions: readdir_max_bytes=1048576,norbytes

  # Tajne moraju sadržavati pristupe za admina i/ili Ceph korisnika.
  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

  # (opcionalno) Vozač može koristiti ili ceph-fuse (fuse), 
  # ili ceph kernelclient (kernel).
  # Ako nije navedeno, koristit će se zadana montaža volumena,
  # to se određuje pretragom ceph-fuse i mount.ceph
  # mounter: kernel
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:
  - debug

Ispunimo ovdje clusterID i primijenimo u Kubernetesu:

kubectl apply -f storageclass.yaml

Provjera

Za provjeru, kao u prethodnom primjeru, stvorit ćemo PVC:

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

I provjerimo postoji li PVC/PV:

kubectl get pvc
kubectl get pv

Ako želite pogledati datoteke i mape u CephFS-u, možete montirati ovaj datotečni sustav negdje. Na primjer, kao što je prikazano u nastavku.

Idemo na jedan od čvorova Ceph klastera i izvršimo sljedeće radnje:

# Точка монтирования
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

Naravno, ovakvo montiranje FS na Ceph čvoru je isključivo za edukacijske svrhe, čime se i bavimo na našim Slurm tečajevima. Ne mislim da bi netko to radio u produkciji, postoji veliki rizik od slučajnog brisanja važnih datoteka.

Na kraju, provjerimo kako se situacija s promjenom veličine volumena odvija u slučaju CephFS-a. Vraćamo se u Kubernetes i uređujemo naš manifest za PVC - povećavamo veličinu, recimo, na 7Gi.

Primjenjujemo uređeni dokument:

kubectl apply -f pvc.yaml

Pogledajmo na montiranom direktoriju kako se promijenila kvota:

getfattr -n ceph.quota.max_bytes

Za rad ove naredbe, možda ćete trebati instalirati paket attr.

Oči se boje, a ruke rade

Na prvi pogled, sva ta čarolija i dugi YAML manifesti izgledaju složeno, ali u praksi studenti Slayer-a ih prilično brzo savladaju.
U ovom članku nismo ulazili previše u detalje — za to postoji službena dokumentacija. Ako vas zanimaju detalji konfiguracije Ceph skladišta u suradnji s Kubernetes klasterom, pomoći će vam sljedeće veze:

Opća načela rada Kubernetes-a s volumenima
Dokumentacija o RBD-u
Integracija RBD-a i Kubernetes-a s aspekta Ceph-a
Integracija RBD-a i Kubernetes-a s aspekta CSI-a
Opća dokumentacija o CephFS-u
Integracija CephFS-a i Kubernetes-a s aspekta CSI-a

Na tečaju Slayer-a Kubernetes Osnovna možete ići još malo dalje i implementirati stvarnu aplikaciju u Kubernetes-u koja će koristiti CephFS kao skladište za datoteke. Putem GET/POST zahtjeva moći ćete slati i primati datoteke iz Ceph-a.

A ako vas više zanima pohrana podataka, prijavite se na novi tečaj o Ceph-u. Dok traje beta testiranje, tečaj možete dobiti uz popust i utjecati na njegov sadržaj.

Autor članka: Aleksandar Švalov, praktični inženjer Southbridge, Certified Kubernetes Administrator, autor i razvijač tečajeva Slayer-a.

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster