Praktinis Ceph pagrindu veikiančios saugyklos prijungimo prie Kubernetes klasterio pavyzdys

„Container Storage Interface“ (CSI) yra vieninga „Kubernetes“ ir saugojimo sistemų sąsaja. Mes jau trumpai apie tai kalbėjome pasakojo, o šiandien atidžiau pažvelgsime į CSI ir Ceph derinį: parodysime, kaip prijunkite „Ceph“ saugyklą į Kubernetes klasterį.
Straipsnyje pateikiami tikri, nors ir šiek tiek supaprastinti pavyzdžiai, kad būtų lengviau suvokti. Mes nesvarstome įdiegti ir konfigūruoti „Ceph“ ir „Kubernetes“ grupių.

Ar jums įdomu, kaip tai veikia?

Praktinis Ceph pagrindu veikiančios saugyklos prijungimo prie Kubernetes klasterio pavyzdys

Taigi, po ranka turite Kubernetes klasterį, įdiegtą, pavyzdžiui, kubespray. Netoliese veikia Ceph klasteris – taip pat galite jį įdiegti, pavyzdžiui, su šiuo žaidimų knygelių rinkinys. Tikiuosi, nereikia minėti, kad gamybai tarp jų turi būti bent 10 Gbit/s pralaidumo tinklas.

Jei visa tai turi, eime!

Pirmiausia eikime į vieną iš Ceph klasterio mazgų ir patikrinkite, ar viskas tvarkoje:

ceph health
ceph -s

Tada iš karto sukursime RBD diskų telkinį:

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

Pereikime prie „Kubernetes“ klasterio. Ten, visų pirma, įdiegsime Ceph CSI tvarkyklę, skirtą RBD. Įdiegsime, kaip ir tikėtasi, per Helm.
Pridedame saugyklą su diagrama, gauname ceph-csi-rbd diagramos kintamųjų rinkinį:

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

Dabar reikia užpildyti cephrbd.yml failą. Norėdami tai padaryti, sužinokite Ceph monitorių klasterio ID ir IP adresus:

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

Gautas reikšmes įvedame į failą cephrbd.yml. Tuo pačiu metu leidžiame kurti PSP politiką (Pod Security Policies). Parinktys skyriuose mazgo įskiepis и aprūpintojas jau faile, juos galima taisyti, kaip parodyta toliau:

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

Toliau mums belieka įdiegti diagramą Kubernetes klasteryje.

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

Puiku, RBD tvarkyklė veikia!
Sukurkime naują „StorageClass“ „Kubernetes“. Tam vėl reikia šiek tiek padirbėti su Cefu.

Mes sukuriame naują vartotoją Ceph ir suteikiame jam teises rašyti į telkinį kubas:

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

Dabar pažiūrėkime, kad prieigos raktas vis dar yra:

ceph auth get-key client.rbdkube

Komanda išves kažką panašaus į tai:

AQCO9NJbhYipKRAAMqZsnqqS/T8OYQX20xIa9A==

Pridėkime šią reikšmę prie „Secret“ „Kubernetes“ klasteryje – ten, kur mums jos reikia Naudotojo raktas:

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

Ir mes sukuriame savo paslaptį:

kubectl apply -f secret.yaml

Tada mums reikia „StorageClass“ manifesto, panašaus į šį:

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

Reikia užpildyti clusterID, kurių komanda jau išmoko ceph fsid, ir pritaikykite šį manifestą Kubernetes klasteriui:

kubectl apply -f storageclass.yaml

Norėdami patikrinti, kaip klasteriai veikia kartu, sukurkime šį PVC (nuolatinį tūrio pareiškimą):

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

Iš karto pažiūrėkime, kaip Kubernetes sukūrė prašomą tomą Ceph:

kubectl get pvc
kubectl get pv

Viskas atrodo puiku! Kaip tai atrodo Ceph pusėje?
Gauname baseino tomų sąrašą ir peržiūrime informaciją apie mūsų tomą:

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

Dabar pažiūrėkime, kaip veikia RBD tomo dydžio keitimas.
Pakeiskite tomo dydį pvc.yaml apraše į 2Gi ir pritaikykite jį:

kubectl apply -f pvc.yaml

Palaukite, kol pakeitimai įsigalios, ir dar kartą pažiūrėkime į garsumo dydį.

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

kubectl get pv
kubectl get pvc

Matome, kad PVC dydis nepasikeitė. Norėdami sužinoti, kodėl, galite paprašyti Kubernetes YAML PVC aprašymo:

kubectl get pvc rbd-pvc -o yaml

Štai problema:

pranešimas: Laukiama, kol vartotojas (iš naujo) paleis bloką, kad baigtų failų sistemos apimties keitimą mazge. tipas: FileSystemResizePending

Tai reiškia, kad diskas išaugo, bet jame esanti failų sistema – ne.
Norėdami išplėsti failų sistemą, turite prijungti tomą. Mūsų šalyje sukurtas PVC/PV šiuo metu niekaip nenaudojamas.

Galime sukurti bandomąjį Pod, pavyzdžiui, taip:

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

O dabar pažvelkime į PVC:

kubectl get pvc

Dydis pasikeitė, viskas gerai.

Pirmoje dalyje dirbome su RBD blokų įrenginiu (jis reiškia Rados Block Device), tačiau to negalima padaryti, jei su šiuo disku vienu metu turi dirbti skirtingos mikropaslaugos. CephFS daug geriau tinka darbui su failais, o ne su disko vaizdais.
Naudodamiesi Ceph ir Kubernetes klasterių pavyzdžiu, sukonfigūruosime CSI ir kitus būtinus objektus, kad jie veiktų su CephFS.

Paimkime reikšmes iš naujos Helm diagramos, kurių mums reikia:

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

Vėl turite užpildyti cephfs.yml failą. Kaip ir anksčiau, Ceph komandos padės:

ceph fsid
ceph mon dump

Užpildykite failą tokiomis reikšmėmis kaip ši:

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

Atkreipkite dėmesį, kad monitoriaus adresai nurodomi paprasta forma adresas:portas. Norint pritvirtinti cephfs mazge, šie adresai perkeliami į branduolio modulį, kuris dar nežino, kaip dirbti su v2 monitoriaus protokolu.
Pakeičiame httpMetrics prievadą (Prometheus eis ten stebėti metriką), kad jis neprieštarautų nginx-proxy, kurį įdiegia Kubespray. Jums to gali neprireikti.

Įdiekite „Helm“ diagramą „Kubernetes“ klasteryje:

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

Eikime į Ceph duomenų parduotuvę, kad sukurtume atskirą vartotoją. Dokumentuose teigiama, kad CephFS teikėjas reikalauja klasterio administratoriaus prieigos teisių. Bet mes sukursime atskirą vartotoją fs su ribotomis teisėmis:

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'

Ir iš karto pažvelkime į jo prieigos raktą, jo mums prireiks vėliau:

ceph auth get-key client.fs

Sukurkime atskirą paslaptį ir saugojimo klasę.
Nieko naujo, tai jau matėme UBR pavyzdyje:

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

Taikant manifestą:

kubectl apply -f secret.yaml

O dabar – atskira 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

Užpildykime čia clusterID ir taikoma Kubernetes:

kubectl apply -f storageclass.yaml

Проверка

Norėdami patikrinti, kaip ir ankstesniame pavyzdyje, sukurkime PVC:

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

Ir patikrinkite, ar yra PVC / PV:

kubectl get pvc
kubectl get pv

Jei norite peržiūrėti failus ir katalogus CephFS, galite kur nors prijungti šią failų sistemą. Pavyzdžiui, kaip parodyta žemiau.

Eikime į vieną iš Ceph klasterio mazgų ir atlikime šiuos veiksmus:

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

Žinoma, FS montavimas ant tokio Ceph mazgo tinka tik treniruotėms, ką mes darome Slurmo kursai. Nemanau, kad kas nors tai darytų gamyboje; yra didelė rizika netyčia ištrinti svarbius failus.

Ir galiausiai, patikrinkime, kaip viskas veikia keičiant apimtis CephFS atveju. Grįžkime į „Kubernetes“ ir redaguokite PVC aprašą – padidinkite dydį, pavyzdžiui, iki 7Gi.

Taikykime redaguotą failą:

kubectl apply -f pvc.yaml

Pažiūrėkime į prijungtą katalogą, kad pamatytumėte, kaip pasikeitė kvota:

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

Kad ši komanda veiktų, gali tekti įdiegti paketą savo sistemoje attr.

Akys bijo, bet rankos bijo

Visi šie burtai ir ilgi YAML apraiškos iš pirmo žvilgsnio atrodo sudėtingos, tačiau praktiškai Slurm studentai gana greitai juos įgyja.
Šiame straipsnyje mes nesigilinome į džiungles – tam yra oficiali dokumentacija. Jei jus domina „Ceph“ saugyklos su „Kubernetes“ grupe nustatymo informacija, šios nuorodos padės:

Bendrieji Kubernetes darbo su tomais principai
UBR dokumentacija
UBR ir Kubernetes integravimas iš Ceph perspektyvos
UBR ir Kubernetes integravimas iš CSI perspektyvos
Bendroji CephFS dokumentacija
CephFS ir Kubernetes integravimas iš CSI perspektyvos

„Slurm“ kursuose Kubernetes bazė galite eiti šiek tiek toliau ir įdiegti tikrą programą Kubernetes, kuri naudos CephFS kaip failų saugyklą. Naudodami GET/POST užklausas galėsite perkelti failus į ir gauti iš Ceph.

O jei jus labiau domina duomenų saugojimas, registruokitės naujas kursas apie Ceph. Kol vyksta beta versijos testavimas, kursą galima įsigyti su nuolaida ir daryti įtaką jo turiniui.

Straipsnio autorius: Aleksandras Shvalovas, praktikuojantis inžinierius Southbridge, Sertifikuotas Kubernetes administratorius, Slurm kursų autorius ir kūrėjas.

Šaltinis: www.habr.com