Praktický príklad pripojenia úložiska na báze Ceph do klastrového Kubernetes

Kontejnerové úložisko interface (CSI) je jednotný rozhraní pre interakciu Kubernetes a systémov úložiska. Krátko o ňom sme už rozprávali, a dnes podrobne preskúmame spojenie CSI a Ceph: ukážeme, ako pripojiť úložisko Ceph k klastru Kubernetes.
V článku sú prezentované skutočné, aj keď trochu zjednodušené príklady na lepšie pochopenie. Inštaláciu a nastavenie klastra Ceph a Kubernetes neberieme do úvahy.

Zaujíma vás, ako to funguje?

Praktický príklad pripojenia úložiska na báze Ceph do klastrového Kubernetes

Takže máte po ruke klaster Kubernetes, nasadený napríklad kubespray. Vedľa pracuje klaster Ceph – ten môžete tiež nainštalovať, napríklad touto súpravou playbookov. Dúfam, že netreba spomínať, že pre produkciu by medzi nimi mala byť sieť s priepustnosťou najmenej 10 Gbit/s.

Ak máte toto všetko, poďme na to!

Najprv sa prihlásime na jednu z nód klastra Ceph a overíme, že je všetko v poriadku:

ceph health
ceph -s

Ďalej tu ihneď vytvoríme bazén pre RBD disky:

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

Prejdeme do klastra Kubernetes. Tam najprv nainštalujeme Ceph CSI ovládač pre RBD. Inštalácia sa bude robiť, ako sa patrí, prostredníctvom Helm.
Pridáme repozitár s chartom, dostaneme súbor premenných chartu ceph-csi-rbd:

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

Teraz je potrebné vyplniť súbor cephrbd.yml. Na to zistíme ID klastra a IP adresy monitorov v Ceph:

ceph fsid  # tak zistíme clusterID
ceph mon dump  # a tak uvidíme IP adresy monitorov

Získané hodnoty vložíme do súboru cephrbd.yml. Zároveň povolíme vytváranie politík PSP (Pod Security Policies). Možnosti v sekciách nodeplugin a provisioner už sú v súbore, dajú sa upraviť tak, ako je uvedené nižšie:

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

Ďalej, čo nám ostáva, je nainštalovať chart do klastra Kubernetes.

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

Skvele, RBD ovládač funguje!
Vytvorme v Kubernetes novú StorageClass. Na to opäť bude potrebné trochu pracovať s Ceph.

Vytvoríme nového používateľa v Ceph a poskytneme mu práva na zápis do bazéna kube:

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

A teraz sa pozrime na prístupový kľúč, všetko tam isté:

ceph auth get-key client.rbdkube

Príkaz vyprodukuje niečo podobné:

AQCO9NJbhYipKRAAMqZsnqqS/T8OYQX20xIa9A==

Zaznamenáme túto hodnotu do Secret v klastri Kubernetes – tam, kde je potrebná userKey:

---
apiVersion: v1
kind: Secret
metadata:
  name: csi-rbd-secret
  namespace: ceph-csi-rbd
stringData:
  # Hodnoty kľúčov zodpovedajú používateľskému menu a jeho kľúču, ako je uvedené v
  # klastre Ceph. ID užívateľa by malo mať prístup k bazénu,
  # uvedenému v storage class
  userID: rbdkube
  userKey:

A vytvoríme náš tajný kód:

kubectl apply -f secret.yaml

Ďalej potrebujeme približne takýto 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

   # Tieto tajné kódy by mali obsahovať údaje na autorizáciu
   # do vášho bazénu.
   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

Je potrebné vyplniť clusterID, ktorý sme už zistili príkazom ceph fsid, a aplikovať tento manifest v klastri Kubernetes:

kubectl apply -f storageclass.yaml

Aby sme skontrolovali prácu klastrov v súlade, vytvoríme takýto PVC (Persistent Volume Claim):

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

Ihneď sa pozrieme, ako Kubernetes vytvoril v Ceph požadovaný objem:

kubectl get pvc
kubectl get pv

Vyzerá to skvele! A ako to vyzerá na strane Ceph?
Získame zoznam objemov v bazéne a prezerieme si informácie o našom objeme:

rbd ls -p kube
rbd -p kube info csi-vol-eb3d257d-8c6c-11ea-bff5-6235e7640653  # tu, samozrejme, bude iné ID objemu, ktoré vydala predchádzajúca команда

Teraz sa poďme pozrieť, ako funguje zmena veľkosti objemu RBD.
Zmeníme veľkosť objemu v manifeste pvc.yaml na 2Gi a aplikujeme ho:

kubectl apply -f pvc.yaml

Počkajme, kým sa zmeny prejavia, a pozrime sa znova na veľkosť objemu.

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

kubectl get pv
kubectl get pvc

Vidíme, že veľkosť PVC sa nezmenila. Aby sme zistili, prečo, môžeme požiadať Kubernetes o popis PVC vo formáte YAML:

kubectl get pvc rbd-pvc -o yaml

A tu je problém:

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

To znamená, že disk sa zväčšil, ale súborový systém na ňom nie.
Aby sme zväčšili súborový systém, musíme pripojiť objem. Náš vytvorený PVC/PV sa teraz nikam nepoužíva.

Môžeme vytvoriť testovací Pod, napríklad takto:

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

A teraz sa pozrime na PVC:

kubectl get pvc

Veľkosť sa zmenila, všetko je v poriadku.

V prvej časti sme pracovali s blokovým zariadením RBD (čo je skratka pre Rados Block Device), ale to takto nemôžeme robiť, ak potrebujeme, aby rôzne mikroslužby súčasne pracovali s týmto diskom. Pre prácu s súbormi, a nie s obrazom disku, je oveľa lepšie použiť CephFS.
Na príklade klastra Ceph a Kubernetes nastavíme CSI a ostatné potrebné entity pre prácu s CephFS.

Získame hodnoty z požadovaného nového Helm grafu:

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

Znova je potrebné vyplniť súbor cephfs.yml. Ako predtým, pomôžu príkazy Ceph:

ceph fsid
ceph mon dump

Vyplňujeme súbor s hodnotami približne takto:

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

Všimnite si, že adresy monitorov sú uvedené v jednoduchom formáte adresa:port. Pre montovanie cephfs na uzle sú tieto adresy predávané do jadrového modulu, ktorý ešte nevie pracovať s protokolom monitorov v2.
Port pre httpMetrics (kam sa bude Prometheus chodiť po metriky na monitorovanie) meníme, aby nekolidoval s nginx-proxy, ktorý sa inštaluje pomocou Kubespray. Možno to nebudete potrebovať.

Inštalujeme Helm graf do klastra Kubernetes:

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

Prejdeme do úložiska Ceph, aby sme tam vytvorili osobitného používateľa. V dokumentácii je uvedené, že provisioner pre CephFS potrebuje administrátorské prístupové práva k clustru. Ale vytvoríme samostatného používateľa fs s obmedzenými právami:

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'

A hneď sa pozrieme na jeho prístupový kľúč, ktorý využijeme neskôr:

ceph auth get-key client.fs

Vytvoríme samostatné Secret a StorageClass.
Nič nové, už sme to videli na príklade RBD:

---
apiVersion: v1
kind: Secret
metadata:
  name: csi-cephfs-secret
  namespace: ceph-csi-cephfs
stringData:
  # Potrebné pre dynamicky vytvorené objemy
  adminID: fs
  adminKey:

Používame manifest:

kubectl apply -f secret.yaml

A teraz – samostatný StorageClass:

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

  # Názov CephFS súborového systému, v ktorom bude vytvorený objem
  fsName: cephfs

  # (voliteľné) Pool Ceph, v ktorom budú uložené dáta objemu
  # pool: cephfs_data

  # (voliteľné) Možnosti pripojenia oddelené čiarkou pre Ceph-fuse
  # napríklad:
  # fuseMountOptions: debug

  # (voliteľné) Možnosti pripojenia CephFS pre jadro oddelené čiarkou
  # Pozri man mount.ceph pre zoznam týchto možností. Napríklad:
  # kernelMountOptions: readdir_max_bytes=1048576,norbytes

  # Tajomstvá musia obsahovať prístupové údaje pre administrátora a/alebo používateľa 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

  # (voliteľné) Ovládač môže používať buď ceph-fuse (fuse), 
  # alebo ceph kernelclient (kernel).
  # Ak nie je zadané, bude sa používať predvolené pripojenie objemov,
  # ktoré sa určuje hľadaním ceph-fuse a mount.ceph
  # mounter: kernel
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:
  - debug

Vyplníme tu clusterID a aplikujeme v Kubernetes:

kubectl apply -f storageclass.yaml

Kontrola

Na skontrolovanie, ako v predchádzajúcom príklade, vytvoríme PVC:

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

A skontrolujeme existenciu PVC/PV:

kubectl get pvc
kubectl get pv

Ak chcete vidieť súbory a adresáre v CephFS, môžete pripojiť tento súborový systém niekam. Napríklad, ako je uvedené nižšie.

Pôjdeme na jeden z uzlov klastru Ceph a vykonáme tieto kroky:

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

Samozrejme, takéto pripojenie FS na uzle Ceph je vhodné výlučne na vzdelávacie účely, čomu sa aj venujeme na našich kurzoch Slurm. Nemyslím si, že by to niekto robil v produkcii, riziko náhodného prepísania dôležitých súborov je vysoké.

A nakoniec si skontrolujme, ako je to v prípade CephFS s menením veľkosti objemu. Vraciam sa do Kubernetes a upravím náš manifest pre PVC — zväčšíme tam veľkosť, napríklad na 7Gi.

Aplikujeme upravený súbor:

kubectl apply -f pvc.yaml

Pozrieme sa na pripojenom adresári, ako sa zmenila kvóta:

getfattr -n ceph.quota.max_bytes

Pre túto príkaz môže byť potrebné nainštalovať do systému balík attr.

Oči sa boja, ale ruky robia

Napriek tomu, že tieto zaklínadlá a dlhé manifesty YAML vyzerajú na prvý pohľad zložito, študenti Slovermu si s nimi v praxi celkom rýchlo poradia.
V tomto článku sme sa nepúšťali do hlbokých detailov — na to je oficiálna dokumentácia. Ak vás zaujímajú podrobnosti o nastavení úložiska Ceph v spolupráci s Kubernetes klastrom, pomôžu tieto odkazy:

Základné princípy fungovania Kubernetes s objemami
Dokumentácia k RBD
Integrácia RBD a Kubernetes z pohľadu Ceph
Integrácia RBD a Kubernetes z pohľadu CSI
Všeobecná dokumentácia k CephFS
Integrácia CephFS a Kubernetes z pohľadu CSI

Na kurze Sloverm Základy Kubernetes môžete ísť ešte trochu ďalej a nasadiť v Kubernetes skutočnú aplikáciu, ktorá bude používať CephFS ako úložisko pre súbory. Pomocou GET/POST požiadaviek budete môcť súbory odosielať a prijímať z Ceph.

A ak vás viac zaujíma ukladanie dát, prihláste sa na nový kurz o Ceph. Kým prebieha beta test, môžete získať kurz so zľavou a ovplyvniť jeho obsah.

Autor článku: Alexander Shvalov, praktikujúci inžinier Southbridge, Certified Kubernetes Administrator, autor a vývojár kurzov Sloverm.

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster