Praktický príklad pripojenia úložiska založeného na Ceph ku klastri Kubernetes

Container Storage Interface (CSI) je jednotné rozhranie medzi Kubernetes a úložnými systémami. Krátko sme o tom už hovorili povedal, a dnes sa bližšie pozrieme na kombináciu CSI a Ceph: ukážeme si ako pripojiť úložisko Ceph do klastra Kubernetes.
Článok poskytuje skutočné, aj keď mierne zjednodušené príklady pre ľahšie vnímanie. Neuvažujeme o inštalácii a konfigurácii klastrov Ceph a Kubernetes.

Zaujíma vás, ako to funguje?

Praktický príklad pripojenia úložiska založeného na Ceph ku klastri Kubernetes

Takže máte na dosah klaster Kubernetes, nasadený napr. kubespray. Neďaleko funguje Ceph cluster - môžete si ho nainštalovať napríklad aj týmto súbor hracích zošitov. Dúfam, že netreba pripomínať, že na výrobu medzi nimi musí byť sieť so šírkou pásma aspoň 10 Gbit/s.

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

Najprv poďme do jedného z uzlov klastra Ceph a skontrolujte, či je všetko v poriadku:

ceph health
ceph -s

Ďalej okamžite vytvoríme fond pre disky RBD:

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

Prejdime na klaster Kubernetes. Najprv tam nainštalujeme ovládač Ceph CSI pre RBD. Nainštalujeme podľa očakávania cez Helm.
Pridáme úložisko s grafom, získame množinu premenných pre graf 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 musíte vyplniť súbor cephrbd.yml. Ak to chcete urobiť, zistite ID klastra a IP adresy monitorov v Ceph:

ceph fsid  # так мы узнаем clusterID
ceph mon dump  # а так увидим IP-адреса мониторов

Získané hodnoty zadáme do súboru cephrbd.yml. Zároveň umožňujeme tvorbu PSP politík (Pod Security Policies). Možnosti v sekciách nodeplugin и proviant už v súbore, môžu byť opravené, 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 nám ostáva už len nainštalovať graf do klastra Kubernetes.

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

Skvelé, ovládač RBD funguje!
Poďme vytvoriť novú triedu StorageClass v Kubernetes. To si opäť vyžaduje trochu pohrať sa s Cephom.

Vytvoríme nového používateľa v Ceph a dáme mu práva na zápis do fondu kocka:

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

Teraz sa pozrime, že prístupový kľúč stále existuje:

ceph auth get-key client.rbdkube

Príkaz vypíše niečo takéto:

AQCO9NJbhYipKRAAMqZsnqqS/T8OYQX20xIa9A==

Pridajme túto hodnotu do Secret v klastri Kubernetes – tam, kde ju potrebujeme používateľský kľúč:

---
apiVersion: v1
kind: Secret
metadata:
  name: csi-rbd-secret
  namespace: ceph-csi-rbd
stringData:
  # Значения ключей соответствуют имени пользователя и его ключу, как указано в
  # кластере Ceph. ID юзера должен иметь доступ к пулу,
  # указанному в storage class
  userID: rbdkube
  userKey: <user-key>

A vytvárame naše tajomstvo:

kubectl apply -f secret.yaml

Ďalej potrebujeme manifest StorageClass niečo ako toto:

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

Je potrebné vyplniť clusterID, čo sme sa už dozvedeli tým ceph fsida aplikujte tento manifest na klaster Kubernetes:

kubectl apply -f storageclass.yaml

Ak chcete skontrolovať, ako klastre spolupracujú, vytvorte nasledujúci PVC (Persistent Volume Claim):

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

Okamžite sa pozrime, ako Kubernetes vytvoril požadovaný zväzok v Ceph:

kubectl get pvc
kubectl get pv

Všetko sa zdá byť skvelé! Ako to vyzerá na strane Ceph?
Získame zoznam objemov v fonde a zobrazíme informácie o našom objeme:

rbd ls -p kube
rbd -p kube info csi-vol-eb3d257d-8c6c-11ea-bff5-6235e7640653  # тут, конечно же, будет другой ID тома, который выдала предыдущая команда

Teraz sa pozrime, ako funguje zmena veľkosti zväzku RBD.
Zmeňte veľkosť objemu v manifeste pvc.yaml na 2Gi a použite ju:

kubectl apply -f pvc.yaml

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

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. Ak chcete zistiť prečo, môžete požiadať Kubernetes o popis YAML PVC:

kubectl get pvc rbd-pvc -o yaml

Tu je problém:

správa: Čaká sa, kým používateľ (re-)spustí modul, aby dokončil zmenu veľkosti zväzku súborového systému na uzle. typ: FileSystemResizePending

To znamená, že disk narástol, ale súborový systém na ňom nie.
Ak chcete rozšíriť súborový systém, musíte pripojiť zväzok. U nás sa vytvorené PVC/PV v súčasnosti nijako nepoužíva.

Môžeme vytvoriť testovací modul, 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 (skratka pre Rados Block Device), ale to sa nedá urobiť, ak s týmto diskom musia súčasne pracovať rôzne mikroslužby. CephFS je oveľa vhodnejší na prácu so súbormi ako s obrazmi diskov.
Na príklade klastrov Ceph a Kubernetes nakonfigurujeme CSI a ďalšie potrebné entity na prácu s CephFS.

Poďme získať hodnoty z nového grafu Helm, ktoré potrebujeme:

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

Opäť musíte vyplniť súbor cephfs.yml. Rovnako ako predtým, príkazy Ceph pomôžu:

ceph fsid
ceph mon dump

Vyplňte súbor s hodnotami, ako je tento:

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

Upozorňujeme, že adresy monitorov sú uvedené v jednoduchom tvare adresa:port. Na pripojenie cephfs na uzol sa tieto adresy prenesú do modulu jadra, ktorý ešte nevie pracovať s protokolom monitora v2.
Zmeníme port pre httpMetrics (Prometheus tam pôjde na sledovanie metrík), aby nebol v konflikte s nginx-proxy, ktorý inštaluje Kubespray. Možno to nebudete potrebovať.

Nainštalujte graf Helm v klastri Kubernetes:

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

Poďme do úložiska údajov Ceph a vytvorte tam samostatného používateľa. Dokumentácia uvádza, že poskytovateľ CephFS vyžaduje prístupové práva správcu klastra. 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 pozrime na jeho prístupový kľúč, budeme ho potrebovať neskôr:

ceph auth get-key client.fs

Vytvorme oddelené 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:
  # Необходимо для динамически создаваемых томов
  adminID: fs
  adminKey: <вывод предыдущей команды>

Použitie manifestu:

kubectl apply -f secret.yaml

A teraz - samostatná trieda Storage:

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

Vyplníme to tu clusterID a použiteľné v Kubernetes:

kubectl apply -f storageclass.yaml

Проверка

Na kontrolu, ako v predchádzajúcom príklade, vytvorte PVC:

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

A skontrolujte prítomnosť PVC/PV:

kubectl get pvc
kubectl get pv

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

Poďme do jedného z klastrových uzlov Ceph a vykonajte nasledujúce akcie:

# Точка монтирования
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, montáž FS na uzol Ceph ako je tento je vhodná len na tréningové účely, čo robíme na našich Slurmové kurzy. Nemyslím si, že by to niekto urobil vo výrobe; existuje vysoké riziko náhodného vymazania dôležitých súborov.

A nakoniec sa pozrime, ako veci fungujú so zmenou veľkosti zväzkov v prípade CephFS. Vráťme sa ku Kubernetes a upravme náš manifest pre PVC – zväčšite tam veľkosť napríklad na 7Gi.

Použime upravený súbor:

kubectl apply -f pvc.yaml

Pozrime sa na pripojený adresár, aby sme videli, ako sa kvóta zmenila:

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

Aby tento príkaz fungoval, možno budete musieť nainštalovať balík do vášho systému attr.

Oči sa boja, ale ruky áno

Všetky tieto kúzla a dlhé YAML prejavy sa na prvý pohľad zdajú komplikované, ale v praxi ich študenti zo Slurm veľmi rýchlo zorientujú.
V tomto článku sme nešli hlboko do džungle – existuje na to oficiálna dokumentácia. Ak vás zaujímajú podrobnosti o nastavení úložiska Ceph s klastrom Kubernetes, tieto odkazy vám pomôžu:

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

Na kurze Slurm Základňa Kubernetes môžete ísť trochu ďalej a nasadiť skutočnú aplikáciu v Kubernetes, ktorá bude používať CephFS ako úložisko súborov. Prostredníctvom žiadostí GET/POST budete môcť prenášať súbory a prijímať ich z Ceph.

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

Autor článku: Alexander Shvalov, praktický inžinier Southbridge, Certifikovaný správca Kubernetes, autor a vývojár kurzov Slurm.

Zdroj: hab.com