Praktiline näide Cephi-põhise salvestusruumi ühendamisest Kubernetese klastriga

Container Storage Interface (CSI) on ühtne liides Kubernetese ja salvestussüsteemide vahel. Oleme sellest juba lühidalt rääkinud rääkinudja täna vaatame lähemalt CSI ja Cephi kombinatsiooni: näitame, kuidas ühendage Cephi salvestusruum Kubernetese klastrisse.
Artikkel pakub tõelisi, kuigi veidi lihtsustatud näiteid tajumise hõlbustamiseks. Me ei kaalu Cephi ja Kubernetese klastrite installimist ja konfigureerimist.

Kas teid huvitab, kuidas see toimib?

Praktiline näide Cephi-põhise salvestusruumi ühendamisest Kubernetese klastriga

Seega on teie käeulatuses Kubernetese klaster, mis on juurutatud näiteks kubespray. Läheduses töötab Ceph-klaster - saate selle ka näiteks selle abil installida mänguraamatute komplekt. Loodan, et pole vaja mainida, et nendevaheliseks tootmiseks peab olema võrk, mille ribalaius on vähemalt 10 Gbit/s.

Kui sul on see kõik olemas, siis lähme!

Kõigepealt läheme ühte Cephi klastri sõlme ja kontrollime, kas kõik on korras:

ceph health
ceph -s

Järgmisena loome kohe RBD-ketaste basseini:

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

Liigume edasi Kubernetese klastri juurde. Seal installime kõigepealt RBD jaoks Ceph CSI draiveri. Paigaldame ootuspäraselt Helmi kaudu.
Lisame diagrammiga hoidla, saame diagrammi ceph-csi-rbd jaoks muutujate komplekti:

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

Nüüd peate täitma faili cephrbd.yml. Selleks uurige Cephis olevate monitoride klastri ID-d ja IP-aadressid:

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

Saadud väärtused sisestame faili cephrbd.yml. Samal ajal võimaldame luua PSP poliitikaid (Pod Security Policies). Valikud jaotistes nodeplugin и varustaja juba failis, saab neid parandada järgmiselt:

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

Järgmiseks jääb meile vaid diagramm Kubernetese klastris installida.

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

Suurepärane, RBD draiver töötab!
Loome Kubernetesis uue StorageClassi. See nõuab jällegi Cephiga natuke nokitsemist.

Loome Cephis uue kasutaja ja anname talle õiguse basseini kirjutada Kuubik:

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

Nüüd vaatame, et pääsuvõti on endiselt olemas:

ceph auth get-key client.rbdkube

Käsk väljastab midagi sellist:

AQCO9NJbhYipKRAAMqZsnqqS/T8OYQX20xIa9A==

Lisame selle väärtuse Kubernetese klastris olevale Secretile – seal, kus seda vajame userKey:

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

Ja me loome oma saladuse:

kubectl apply -f secret.yaml

Järgmiseks vajame StorageClassi manifesti midagi sellist:

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

Vajab täita klastri ID, mida oleme meeskonna poolt juba õppinud ceph fsidja rakendage see manifest Kubernetese klastrile:

kubectl apply -f storageclass.yaml

Et kontrollida, kuidas klastrid koos töötavad, loome järgmise PVC (püsiv mahunõue):

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

Vaatame kohe, kuidas Kubernetes lõi Cephis soovitud köite:

kubectl get pvc
kubectl get pv

Kõik tundub olevat suurepärane! Kuidas see Cephi poolel välja näeb?
Saame kogumis olevate köidete loendi ja vaatame teavet meie köite kohta:

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

Nüüd vaatame, kuidas RBD helitugevuse suuruse muutmine töötab.
Muutke pvc.yamli manifestis helitugevuse suuruseks 2Gi ja rakendage see:

kubectl apply -f pvc.yaml

Ootame muudatuste jõustumist ja vaatame uuesti helitugevust.

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

kubectl get pv
kubectl get pvc

Näeme, et PVC suurus pole muutunud. Põhjuse väljaselgitamiseks võite Kubernetesilt küsida PVC YAML-i kirjeldust:

kubectl get pvc rbd-pvc -o yaml

Siin on probleem:

teade: Ootab, kuni kasutaja (taas)käivitab podi, et lõpetada failisüsteemi mahu muutmine sõlmes. tüüp: FileSystemResizePending

See tähendab, et ketas on kasvanud, kuid sellel olev failisüsteem mitte.
Failisüsteemi laiendamiseks peate installima helitugevuse. Meie riigis ei ole loodud PVC/PV hetkel kuidagi kasutusel.

Saame luua näiteks sellise testpodi:

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

Ja nüüd vaatame PVC-d:

kubectl get pvc

Suurus on muutunud, kõik on korras.

Esimeses osas töötasime RBD-plokiseadmega (see tähistab Rados Block Device), kuid seda ei saa teha, kui selle kettaga peavad korraga töötama erinevad mikroteenused. CephFS sobib palju paremini failidega, mitte kettakujutistega töötamiseks.
Ceph ja Kubernetes klastrite näitel konfigureerime CSI ja muud vajalikud olemid CephFS-iga töötamiseks.

Võtame väärtused uuest Helmi diagrammist, mida vajame:

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

Jällegi peate täitma faili cephfs.yml. Nagu varemgi, aitavad Cephi käsud:

ceph fsid
ceph mon dump

Täitke fail selliste väärtustega:

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

Pange tähele, et monitoride aadressid on määratud lihtsal kujul address:port. Ceffide ühendamiseks sõlmele kantakse need aadressid üle kerneli moodulisse, mis ei tea veel, kuidas v2 monitori protokolliga töötada.
Muudame httpMetricsi porti (Prometheus läheb sinna mõõdikute jälgimiseks), et see ei oleks vastuolus Kubespray installitud nginx-proxyga. Teil ei pruugi seda vaja minna.

Installige Helmi diagramm Kubernetese klastris:

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

Läheme Cephi andmepoodi, et luua seal eraldi kasutaja. Dokumentatsioonis öeldakse, et CephFS-i pakkumine nõuab klastri administraatori juurdepääsuõigusi. Aga loome eraldi kasutaja fs piiratud õigustega:

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'

Ja vaatame kohe tema juurdepääsuvõtit, vajame seda hiljem:

ceph auth get-key client.fs

Loome eraldi Secret ja StorageClass.
Pole midagi uut, oleme seda juba näinud RBD näites:

---
apiVersion: v1
kind: Secret
metadata:
  name: csi-cephfs-secret
  namespace: ceph-csi-cephfs
stringData:
  # Необходимо для динамически создаваемых томов
  adminID: fs
  adminKey: <вывод предыдущей команды>

Manifesti rakendamine:

kubectl apply -f secret.yaml

Ja nüüd - eraldi StorageClass:

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

Täidame selle siin klastri ID ja rakendatav Kubernetesis:

kubectl apply -f storageclass.yaml

Проверка

Kontrollimiseks, nagu eelmises näites, loome PVC:

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

Ja kontrollige PVC/PV olemasolu:

kubectl get pvc
kubectl get pv

Kui soovite CephFS-is faile ja katalooge vaadata, saate selle failisüsteemi kuhugi paigaldada. Näiteks nagu allpool näidatud.

Läheme ühele Cephi klastri sõlmedest ja teeme järgmised toimingud:

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

Loomulikult sobib FS-i paigaldamine sellisele Ceph-sõlmele ainult koolituse eesmärgil, mida me oma Slurmi kursused. Ma ei usu, et keegi seda tootmises teeks; on suur oht, et olulised failid kogemata kustutatakse.

Ja lõpuks, kontrollime, kuidas asjad CephFS-i puhul mahu suuruse muutmisega töötavad. Naaskem Kubernetese juurde ja redigeerime oma PVC manifesti – suurendage seal suurust näiteks 7Gi-ni.

Rakendame redigeeritud faili:

kubectl apply -f pvc.yaml

Vaatame ühendatud kataloogi, et näha, kuidas kvoot on muutunud:

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

Selle käsu toimimiseks peate võib-olla installima paketi oma süsteemi attr.

Silmad kardavad, aga käed kardavad

Kõik need loitsud ja pikad YAML-i manifestid tunduvad pealtnäha keerulised, kuid praktikas saavad Slurmi õpilased neist üsna kiiresti aru.
Selles artiklis me sügavale džunglisse ei laskunud – selleks on olemas ametlik dokumentatsioon. Kui olete huvitatud Kubernetese klastri Cephi salvestusruumi seadistamise üksikasjadest, aitavad need lingid:

Kubernetese köidetega töötamise üldpõhimõtted
RBD dokumentatsioon
RBD ja Kubernetese integreerimine Cephi vaatenurgast
RBD ja Kubernetese integreerimine CSI vaatenurgast
Üldine CephFS-i dokumentatsioon
CephFS-i ja Kubernetese integreerimine CSI vaatenurgast

Slurmi kursusel Kubernetese baas võite minna veidi kaugemale ja juurutada Kubernetesis päris rakendus, mis kasutab failisalvestusena CephFS-i. GET/POST taotluste kaudu saate faile Cephile üle kanda ja sealt vastu võtta.

Ja kui olete rohkem huvitatud andmete salvestamisest, siis registreeruge uus kursus Ceph. Kuni beetatesti on käimas, saab kursuse allahindlusega soetada ja selle sisu mõjutada.

Artikli autor: Aleksandr Shvalov, praktiseeriv insener Southbridge, Kubernetese sertifitseeritud administraator, Slurmi kursuste autor ja arendaja.

Allikas: www.habr.com