Ceph əsaslı yaddaşı Kubernetes klasterinə qoşmağın praktik nümunəsi

Konteyner Saxlama İnterfeysi (CSI) Kubernetes və saxlama sistemləri arasında vahid interfeysdir. Artıq bu barədə qısaca danışdıq deyə danışdı, və bu gün biz CSI və Ceph birləşməsinə daha yaxından nəzər salacağıq: necə olduğunu göstərəcəyik Ceph yaddaşını birləşdirin Kubernetes klasterinə.
Məqalədə qavrama asanlığı üçün real, bir qədər sadələşdirilmiş nümunələr verilmişdir. Biz Ceph və Kubernetes klasterlərinin quraşdırılmasını və konfiqurasiyasını düşünmürük.

Bunun necə işlədiyini merak edirsiniz?

Ceph əsaslı yaddaşı Kubernetes klasterinə qoşmağın praktik nümunəsi

Beləliklə, barmaqlarınızın ucunda yerləşdirilmiş bir Kubernetes klasteriniz var, məsələn, kubespray. Yaxınlıqda işləyən bir Ceph klasteri var - məsələn, bununla da quraşdıra bilərsiniz oyun kitabları toplusu. Ümid edirəm ki, onların arasında istehsal üçün ən azı 10 Gbit/s ötürmə qabiliyyətinə malik şəbəkənin olması lazım olduğunu qeyd etməyə ehtiyac yoxdur.

Bütün bunlar varsa, gedək!

Əvvəlcə Ceph klaster qovşaqlarından birinə gedək və hər şeyin qaydasında olduğunu yoxlayaq:

ceph health
ceph -s

Sonra dərhal RBD diskləri üçün hovuz yaradacağıq:

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

Gəlin Kubernetes klasterinə keçək. Orada, ilk növbədə, RBD üçün Ceph CSI sürücüsünü quraşdıracağıq. Gözlənildiyi kimi Helm vasitəsilə quraşdıracağıq.
Diaqramla bir depo əlavə edirik, ceph-csi-rbd diaqramı üçün bir sıra dəyişənlər alırıq:

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

İndi cephrbd.yml faylını doldurmalısınız. Bunu etmək üçün Ceph-də monitorların klaster ID və IP ünvanlarını tapın:

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

Alınan dəyərləri cephrbd.yml faylına daxil edirik. Eyni zamanda, biz PSP siyasətlərinin (Pod Security Policies) yaradılmasına imkan veririk. Bölmələrdə seçimlər nodeplugin и təminatçı artıq fayldadır, onlar aşağıda göstərildiyi kimi düzəldilə bilər:

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

Bundan sonra, bizə qalan yalnız Kubernetes klasterində qrafiki quraşdırmaqdır.

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

Əla, RBD sürücüsü işləyir!
Gəlin Kubernetes-də yeni StorageClass yaradaq. Bu, yenə Ceph ilə bir az məşğul olmağı tələb edir.

Ceph-də yeni istifadəçi yaradırıq və ona hovuza yazmaq hüququ veririk kub:

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

İndi giriş açarının hələ də orada olduğuna baxaq:

ceph auth get-key client.rbdkube

Komanda bu kimi bir şey çıxaracaq:

AQCO9NJbhYipKRAAMqZsnqqS/T8OYQX20xIa9A==

Gəlin bu dəyəri Kubernetes klasterindəki Gizliyə əlavə edək - bizə lazım olan yerdə istifadəçi açarı:

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

Və sirrimizi yaradırıq:

kubectl apply -f secret.yaml

Sonra, bizə belə bir StorageClass manifestinə ehtiyacımız var:

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

Doldurmaq lazımdır clusterID, bunu komanda tərəfindən artıq öyrənmişik ceph fsid, və bu manifesti Kubernetes klasterinə tətbiq edin:

kubectl apply -f storageclass.yaml

Klasterlərin birlikdə necə işlədiyini yoxlamaq üçün aşağıdakı PVC-ni yaradaq (Daimi Həcm İddiası):

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

Gəlin dərhal Kubernetesin Ceph-də tələb olunan həcmi necə yaratdığına baxaq:

kubectl get pvc
kubectl get pv

Hər şey əla görünür! Bu Ceph tərəfində nə kimi görünür?
Hovuzdakı cildlərin siyahısını alırıq və həcmimiz haqqında məlumatlara baxırıq:

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

İndi gəlin RBD həcminin ölçüsünün dəyişdirilməsinin necə işlədiyini görək.
pvc.yaml manifestindəki səs ölçüsünü 2Gi olaraq dəyişdirin və tətbiq edin:

kubectl apply -f pvc.yaml

Dəyişikliklərin qüvvəyə minməsini gözləyək və yenidən həcm ölçüsünə baxaq.

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

kubectl get pv
kubectl get pvc

PVC-nin ölçüsünün dəyişmədiyini görürük. Səbəbini öyrənmək üçün PVC-nin YAML təsviri üçün Kubernetes-ə müraciət edə bilərsiniz:

kubectl get pvc rbd-pvc -o yaml

Problem budur:

mesaj: İstifadəçinin fayl sisteminin qovşaqdakı həcmin ölçüsünü tamamlamaq üçün podu (yenidən) işə salmasını gözləyir. növü: FileSystemResizePending

Yəni disk böyüdü, ancaq üzərindəki fayl sistemi böyümədi.
Fayl sistemini böyütmək üçün həcmi quraşdırmaq lazımdır. Ölkəmizdə yaradılmış PVC/PV hal-hazırda heç bir şəkildə istifadə edilmir.

Test Pod yarada bilərik, məsələn, bu kimi:

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

İndi PVC-yə baxaq:

kubectl get pvc

Ölçü dəyişib, hər şey qaydasındadır.

Birinci hissədə biz RBD blok cihazı ilə işlədik (bu, Rados Blok Cihazı deməkdir), lakin müxtəlif mikroservislərin bu disklə eyni vaxtda işləməsi lazım olduqda bunu etmək mümkün deyil. CephFS disk şəkillərindən daha çox fayllarla işləmək üçün daha uyğundur.
Ceph və Kubernetes klasterlərinin nümunəsindən istifadə edərək, biz CSI və digər zəruri qurumları CephFS ilə işləmək üçün konfiqurasiya edəcəyik.

Bizə lazım olan yeni Helm diaqramından dəyərləri əldə edək:

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

Yenə cephfs.yml faylını doldurmalısınız. Əvvəlki kimi, Ceph əmrləri kömək edəcək:

ceph fsid
ceph mon dump

Faylı bu kimi dəyərlərlə doldurun:

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

Nəzərə alın ki, monitor ünvanları sadə ünvan formasında göstərilmişdir: port. Cephf-ləri bir node üzərində quraşdırmaq üçün bu ünvanlar v2 monitor protokolu ilə işləməyi hələ bilməyən kernel moduluna köçürülür.
Kubespray tərəfindən quraşdırılmış nginx-proxy ilə ziddiyyət təşkil etməməsi üçün httpMetrics üçün portu dəyişdiririk (Prometheus metrikləri izləmək üçün oraya gedəcək). Bu sizə lazım olmaya bilər.

Kubernetes klasterində Helm diaqramını quraşdırın:

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

Orada ayrıca istifadəçi yaratmaq üçün Ceph məlumat mağazasına gedək. Sənədlər CephFS provayderinin klaster administratoruna giriş hüquqlarını tələb etdiyini bildirir. Amma biz ayrıca istifadəçi yaradacağıq fs məhdud hüquqlarla:

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'

Dərhal onun giriş açarına baxaq, sonra bizə lazım olacaq:

ceph auth get-key client.fs

Gəlin ayrı Secret və StorageClass yaradaq.
Yeni heç nə yoxdur, biz bunu RBD nümunəsində artıq görmüşük:

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

Manifestin tətbiqi:

kubectl apply -f secret.yaml

İndi - ayrı bir 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

Gəlin onu burada dolduraq clusterID və Kubernetesdə tətbiq olunur:

kubectl apply -f storageclass.yaml

Проверка

Yoxlamaq üçün, əvvəlki nümunədə olduğu kimi, PVC yaradaq:

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

Və PVC/PV varlığını yoxlayın:

kubectl get pvc
kubectl get pv

CephFS-də fayl və qovluqlara baxmaq istəyirsinizsə, bu fayl sistemini hardasa quraşdıra bilərsiniz. Məsələn, aşağıda göstərildiyi kimi.

Gəlin Ceph klaster qovşaqlarından birinə keçək və aşağıdakı hərəkətləri yerinə yetirək:

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

Əlbəttə ki, belə bir Ceph node üzərində FS montajı yalnız məşq məqsədləri üçün uyğundur, biz bunu özümüzdə edirik. Slurm kursları. İstehsalda heç kimin bunu edəcəyini düşünmürəm; vacib faylları təsadüfən silmək riski yüksəkdir.

Və nəhayət, gəlin CephFS vəziyyətində həcmlərin ölçüsünü dəyişdirməklə işlərin necə işlədiyini yoxlayaq. Kubernetes-ə qayıdaq və PVC üçün manifestimizi redaktə edək - orada ölçüsünü, məsələn, 7Gi-ə qədər artırın.

Redaktə edilmiş faylı tətbiq edək:

kubectl apply -f pvc.yaml

Kvotanın necə dəyişdiyini görmək üçün quraşdırılmış kataloqa baxaq:

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

Bu əmrin işləməsi üçün paketi sisteminizə quraşdırmalı ola bilərsiniz attr.

Gözlər qorxur, amma əllər qorxur

Bütün bu sehrlər və uzun YAML təzahürləri zahirdə mürəkkəb görünür, lakin praktikada Slurm tələbələri onları çox tez mənimsəyir.
Bu yazıda biz cəngəlliyə getmədik - bunun üçün rəsmi sənədlər var. Kubernetes klasteri ilə Ceph yaddaşının qurulmasının təfərrüatları ilə maraqlanırsınızsa, bu bağlantılar kömək edəcək:

Kubernetlərin həcmlərlə işləməsinin ümumi prinsipləri
RBD Sənədləri
RBD və Kubernetes-in Ceph baxımından inteqrasiyası
CSI perspektivindən RBD və Kubernetesin inteqrasiyası
Ümumi CephFS Sənədləri
CSI perspektivindən CephFS və Kubernetes inteqrasiyası

Slurm kursunda Kubernetes bazası bir az da irəli gedə və CephFS-ni fayl saxlama yeri kimi istifadə edəcək Kubernetes-də real proqram yerləşdirə bilərsiniz. GET/POST sorğuları vasitəsilə siz faylları Ceph-ə köçürə və onları qəbul edə biləcəksiniz.

Əgər məlumatların saxlanması ilə daha çox maraqlanırsınızsa, qeydiyyatdan keçin Ceph üzrə yeni kurs. Beta testi davam edərkən, kursu endirimlə əldə etmək olar və siz onun məzmununa təsir edə bilərsiniz.

Məqalənin müəllifi: Aleksandr Şvalov, praktik mühəndis Southbridge, Sertifikatlı Kubernetes Administratoru, Slurm kurslarının müəllifi və tərtibçisi.

Mənbə: www.habr.com