Eżempju prattiku tal-konnessjoni tal-ħażna bbażata fuq Ceph ma 'cluster Kubernetes

Container Storage Interface (CSI) hija interface unifikata bejn Kubernetes u sistemi ta 'ħażna. Diġà tkellimna fil-qosor dwarha qal, u llum ser nagħtu ħarsa aktar mill-qrib lejn il-kombinazzjoni ta 'CSI u Ceph: aħna ser nuru kif qabbad il-ħażna Ceph lill-cluster Kubernetes.
L-artikolu jipprovdi eżempji reali, għalkemm kemmxejn simplifikati għall-faċilità tal-perċezzjoni. Aħna ma nikkunsidrawx l-installazzjoni u l-konfigurazzjoni ta 'clusters Ceph u Kubernetes.

Qed tistaqsi kif taħdem?

Eżempju prattiku tal-konnessjoni tal-ħażna bbażata fuq Ceph ma 'cluster Kubernetes

Għalhekk, għandek cluster Kubernetes fuq ponot subgħajk, skjerat, pereżempju, kubespray. Hemm cluster Ceph li jaħdem fil-qrib - tista 'wkoll tinstallah, pereżempju, ma' dan sett ta’ playbooks. Nittama li m'hemmx għalfejn insemmi li għall-produzzjoni bejniethom irid ikun hemm netwerk b'bandwidth ta' mill-inqas 10 Gbit/s.

Jekk għandek dan kollu, ejja mmorru!

L-ewwel, ejja mmorru għal wieħed min-nodi tal-cluster Ceph u ċċekkja li kollox huwa fl-ordni:

ceph health
ceph -s

Sussegwentement, immedjatament noħolqu ġabra għal diski RBD:

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

Ejja ngħaddu għall-cluster Kubernetes. Hemm, l-ewwel nett, aħna se ninstallaw is-sewwieq Ceph CSI għal RBD. Se ninstallaw, kif mistenni, permezz ta' Helm.
Aħna nżidu repożitorju b'ċart, niksbu sett ta 'varjabbli għaċ-ċart ceph-csi-rbd:

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

Issa trid timla l-fajl cephrbd.yml. Biex tagħmel dan, sib l-ID tal-cluster u l-indirizzi IP tal-monitors f'Ceph:

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

Aħna ndaħħlu l-valuri miksuba fil-fajl cephrbd.yml. Fl-istess ħin, nippermettu l-ħolqien ta 'politiki PSP (Pod Security Policies). Għażliet fit-taqsimiet nodeplugin и provveditur diġà fil-fajl, jistgħu jiġu kkoreġuti kif muri hawn taħt:

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

Sussegwentement, dak kollu li jibqa għalina huwa li ninstallaw iċ-ċart fil-cluster Kubernetes.

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

Kbir, is-sewwieq RBD jaħdem!
Ejja noħolqu StorageClass ġdida f'Kubernetes. Dan għal darb'oħra jirrikjedi daqsxejn ta' tbagħbis ma' Ceph.

Noħolqu utent ġdid f'Ceph u nagħtuh drittijiet biex jikteb fil-pool Kubu:

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

Issa ejja naraw li ċ-ċavetta tal-aċċess għadha hemm:

ceph auth get-key client.rbdkube

Il-kmand joħroġ xi ħaġa bħal din:

AQCO9NJbhYipKRAAMqZsnqqS/T8OYQX20xIa9A==

Ejja nżidu dan il-valur ma' Sigriet fil-cluster Kubernetes - fejn għandna bżonnu userKey:

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

U noħolqu s-sigriet tagħna:

kubectl apply -f secret.yaml

Sussegwentement, għandna bżonn manifest StorageClass xi ħaġa bħal din:

---
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ħtieġ li timtela clusterID, li diġà tgħallimna mit-tim ceph fsid, u applika dan il-manifest għall-cluster Kubernetes:

kubectl apply -f storageclass.yaml

Biex tivverifika kif ir-raggruppamenti jaħdmu flimkien, ejja noħolqu l-PVC li ġej (Talba ta’ Volum Persistenti):

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

Ejja naraw immedjatament kif Kubernetes ħoloq il-volum mitlub f'Ceph:

kubectl get pvc
kubectl get pv

Kollox jidher li huwa kbir! Kif jidher dan fuq in-naħa Ceph?
Ikollna lista ta 'volumi fil-pool u naraw informazzjoni dwar il-volum tagħna:

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

Issa ejja naraw kif jaħdem volum RBD mill-ġdid tad-daqs.
Ibdel id-daqs tal-volum fil-manifest pvc.yaml għal 2Gi u applikah:

kubectl apply -f pvc.yaml

Ejja nistennew li l-bidliet jidħlu fis-seħħ u nerġgħu nħarsu lejn id-daqs tal-volum.

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

kubectl get pv
kubectl get pvc

Naraw li d-daqs tal-PVC ma nbidilx. Biex issir taf għaliex, tista' tfittex lil Kubernetes għal deskrizzjoni YAML tal-PVC:

kubectl get pvc rbd-pvc -o yaml

Hawn il-problema:

messaġġ: Stennija għall-utent biex (jerġa') jibda pod biex itemm id-daqs tal-volum tas-sistema tal-fajls fuq in-node. tip: FileSystemResizePending

Jiġifieri, id-diska kibret, iżda s-sistema tal-fajls fuqha le.
Biex tikber is-sistema tal-fajls, għandek bżonn timmonta l-volum. F'pajjiżna, il-PVC/PV maħluq bħalissa ma jintuża bl-ebda mod.

Nistgħu noħolqu Pod tat-test, pereżempju bħal dan:

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

U issa ejja nħarsu lejn il-PVC:

kubectl get pvc

Id-daqs inbidel, kollox tajjeb.

Fl-ewwel parti, ħdimna mal-apparat tal-blokk RBD (jiġifieri Rados Block Device), iżda dan ma jistax isir jekk mikroservizzi differenti jeħtieġu jaħdmu ma 'din id-diska fl-istess ħin. CephFS huwa ferm aħjar biex jaħdem ma 'fajls aktar milli immaġini ta' disk.
Bl-użu tal-eżempju ta 'clusters Ceph u Kubernetes, aħna ser tikkonfigura CSI u entitajiet oħra meħtieġa biex jaħdmu ma' CephFS.

Ejja nieħdu l-valuri mit-tabella l-ġdida ta’ Helm li għandna bżonn:

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

Għal darb'oħra għandek bżonn timla l-fajl cephfs.yml. Bħal qabel, il-kmandi Ceph se jgħinu:

ceph fsid
ceph mon dump

Imla l-fajl b'valuri bħal dawn:

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

Jekk jogħġbok innota li l-indirizzi tal-monitor huma speċifikati fil-formola sempliċi indirizz:port. Biex jintramaw cephfs fuq node, dawn l-indirizzi jiġu trasferiti għall-modulu tal-kernel, li għadu ma jafx kif jaħdem mal-protokoll tal-monitor v2.
Nibdlu l-port għal httpMetrics (Prometheus se jmur hemm għall-metriċi ta 'monitoraġġ) sabiex ma jkunx f'kunflitt ma' nginx-proxy, li huwa installat minn Kubespray. Jista 'ma jkollokx bżonn dan.

Installa l-Helm chart fil-cluster Kubernetes:

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

Ejja mmorru fil-maħżen tad-dejta Ceph biex noħolqu utent separat hemmhekk. Id-dokumentazzjoni tiddikjara li l-fornitur tas-CephFS jeħtieġ drittijiet ta' aċċess għall-amministratur tal-clusters. Imma se noħolqu utent separat fs bi drittijiet limitati:

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'

U ejja immedjatament inħarsu lejn iċ-ċavetta ta 'aċċess tiegħu, ikollna bżonnha aktar tard:

ceph auth get-key client.fs

Ejja noħolqu Secret u StorageClass separati.
Xejn ġdid, diġà rajna dan fl-eżempju ta 'RBD:

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

L-applikazzjoni tal-manifest:

kubectl apply -f secret.yaml

U issa - StorageClass separata:

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

Ejja nimlewha hawn clusterID u applikabbli f'Kubernetes:

kubectl apply -f storageclass.yaml

Проверка

Biex tiċċekkja, bħal fl-eżempju preċedenti, ejja noħolqu PVC:

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

U iċċekkja l-preżenza tal-PVC/PV:

kubectl get pvc
kubectl get pv

Jekk trid tħares lejn fajls u direttorji f'CephFS, tista' twaħħal din is-sistema tal-fajls x'imkien. Per eżempju kif muri hawn taħt.

Ejja mmorru għal wieħed min-nodi tal-cluster Ceph u wettaq l-azzjonijiet li ġejjin:

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

Naturalment, l-immuntar ta 'FS fuq node Ceph bħal dan huwa adattat biss għal skopijiet ta' taħriġ, li huwa dak li nagħmlu fuq tagħna Korsijiet Slurm. Ma naħsibx li xi ħadd jagħmel dan fil-produzzjoni; hemm riskju għoli li aċċidentalment jitħassru fajls importanti.

U fl-aħħarnett, ejja niċċekkjaw kif jaħdmu l-affarijiet b'volumi ta 'ridimensjonar fil-każ ta' CephFS. Ejja nerġgħu lura għal Kubernetes u neditjaw il-manifest tagħna għall-PVC - żid id-daqs hemmhekk, pereżempju, għal 7Gi.

Ejja napplikaw il-fajl editjat:

kubectl apply -f pvc.yaml

Ejja nħarsu lejn id-direttorju mmuntat biex naraw kif il-kwota nbidlet:

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

Biex dan il-kmand jaħdem, jista 'jkollok bżonn tinstalla l-pakkett fis-sistema tiegħek attr.

L-għajnejn jibżgħu, imma l-idejn

Dawn il-perjodi kollha u l-manifesti YAML twal jidhru kkumplikati fuq il-wiċċ, iżda fil-prattika, l-istudenti ta 'Slurm jiksbu l-hang tagħhom pjuttost malajr.
F'dan l-artikolu ma mornax fil-fond fil-ġungla - hemm dokumentazzjoni uffiċjali għal dan. Jekk inti interessat fid-dettalji tat-twaqqif tal-ħażna Ceph ma 'cluster Kubernetes, dawn ir-rabtiet jgħinu:

Prinċipji ġenerali ta' Kubernetes li jaħdmu bil-volumi
Dokumentazzjoni RBD
L-integrazzjoni ta' RBD u Kubernetes minn perspettiva Ceph
L-integrazzjoni ta' RBD u Kubernetes minn perspettiva ta' CSI
Dokumentazzjoni Ġenerali CephFS
L-integrazzjoni ta' CephFS u Kubernetes minn perspettiva CSI

Fuq il-kors Slurm Bażi Kubernetes tista 'tmur ftit aktar 'il quddiem u tuża applikazzjoni reali f'Kubernetes li se tuża CephFS bħala ħażna ta' fajls. Permezz ta' talbiet GET/POST inti tkun tista' tittrasferixxi fajls lejn u tirċevihom minn Ceph.

U jekk inti aktar interessat fil-ħażna tad-data, imbagħad iffirma għal kors ġdid fuq Ceph. Filwaqt li t-test beta għadu għaddej, il-kors jista 'jinkiseb bi skont u tista' tinfluwenza l-kontenut tiegħu.

Awtur tal-artiklu: Alexander Shvalov, inġinier prattikanti Southbridge, Amministratur Ċertifikat Kubernetes, awtur u żviluppatur ta 'korsijiet ta' Slurm.

Sors: www.habr.com