Enghraifft ymarferol o gysylltu storfa Ceph i glwstwr Kubernetes

Mae Rhyngwyneb Storio Cynhwysydd (CSI) yn rhyngwyneb unedig rhwng Kubernetes a systemau storio. Rydym eisoes wedi siarad yn fyr amdano dweud wrth, a heddiw byddwn yn edrych yn agosach ar y cyfuniad o CSI a Ceph: byddwn yn dangos sut cysylltu storfa Ceph i glwstwr Kubernetes.
Mae'r erthygl yn darparu enghreifftiau go iawn, er eu bod ychydig wedi'u symleiddio, er hwylustod canfyddiad. Nid ydym yn ystyried gosod a ffurfweddu clystyrau Ceph a Kubernetes.

Ydych chi'n pendroni sut mae'n gweithio?

Enghraifft ymarferol o gysylltu storfa Ceph i glwstwr Kubernetes

Felly, mae gennych chi glwstwr Kubernetes ar flaenau eich bysedd, wedi'i ddefnyddio, er enghraifft, ciwbspray. Mae clwstwr Ceph yn gweithio gerllaw - gallwch hefyd ei osod, er enghraifft, gyda hyn set o lyfrau chwarae. Rwy'n gobeithio nad oes angen sôn ar gyfer cynhyrchu rhyngddynt rhaid cael rhwydwaith gyda lled band o leiaf 10 Gbit yr eiliad.

Os oes gennych chi hyn i gyd, gadewch i ni fynd!

Yn gyntaf, gadewch i ni fynd i un o nodau clwstwr Ceph a gwirio bod popeth mewn trefn:

ceph health
ceph -s

Nesaf, byddwn yn creu cronfa ar unwaith ar gyfer disgiau RBD:

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

Gadewch i ni symud ymlaen i glwstwr Kubernetes. Yno, yn gyntaf oll, byddwn yn gosod gyrrwr CSI Ceph ar gyfer RBD. Byddwn yn gosod, yn ôl y disgwyl, trwy Helm.
Rydyn ni'n ychwanegu ystorfa gyda siart, rydyn ni'n cael set o newidynnau ar gyfer y siart ceph-csi-rbd:

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

Nawr mae angen i chi lenwi'r ffeil cephrbd.yml. I wneud hyn, darganfyddwch ID clwstwr a chyfeiriadau IP monitorau yn Ceph:

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

Rydyn ni'n nodi'r gwerthoedd a gafwyd yn y ffeil cephrbd.yml. Ar yr un pryd, rydym yn galluogi creu polisïau PSP (Pod Security Policies). Opsiynau mewn adrannau nodeplugin и darparydd eisoes yn y ffeil, gellir eu cywiro fel y dangosir isod:

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

Nesaf, y cyfan sydd ar ôl i ni yw gosod y siart yng nghlwstwr Kubernetes.

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

Gwych, mae'r gyrrwr RBD yn gweithio!
Gadewch i ni greu StorageClass newydd yn Kubernetes. Mae hyn eto yn gofyn am ychydig o tincian gyda Ceph.

Rydyn ni'n creu defnyddiwr newydd yn Ceph ac yn rhoi hawliau iddo ysgrifennu i'r pwll Ciwb:

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

Nawr, gadewch i ni weld bod yr allwedd mynediad yn dal i fod yno:

ceph auth get-key client.rbdkube

Bydd y gorchymyn yn allbynnu rhywbeth fel hyn:

AQCO9NJbhYipKRAAMqZsnqqS/T8OYQX20xIa9A==

Gadewch i ni ychwanegu'r gwerth hwn at Secret yng nghlwstwr Kubernetes - lle mae ei angen arnom allwedd defnyddiwr:

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

Ac rydyn ni'n creu ein cyfrinach:

kubectl apply -f secret.yaml

Nesaf, mae arnom angen maniffest StorageClass rhywbeth fel hyn:

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

Mae angen ei llenwi clwstwrID, yr ydym eisoes wedi'i ddysgu gan y tîm ceph fsid, a chymhwyso'r amlygiad hwn i glwstwr Kubernetes:

kubectl apply -f storageclass.yaml

I wirio sut mae'r clystyrau'n gweithio gyda'i gilydd, gadewch i ni greu'r PVC canlynol (Hawliad Cyfrol Parhaus):

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

Dewch i ni weld ar unwaith sut y creodd Kubernetes y gyfrol y gofynnwyd amdani yn Ceph:

kubectl get pvc
kubectl get pv

Mae popeth yn ymddangos yn wych! Sut olwg sydd ar hwn ar ochr Ceph?
Cawn restr o gyfrolau yn y pwll a gweld gwybodaeth am ein cyfrol:

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

Nawr, gadewch i ni weld sut mae newid maint cyfaint RBD yn gweithio.
Newidiwch faint cyfaint yn y maniffest pvc.yaml i 2Gi a'i gymhwyso:

kubectl apply -f pvc.yaml

Gadewch i ni aros i'r newidiadau ddod i rym ac edrych ar faint y gyfrol eto.

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

kubectl get pv
kubectl get pvc

Gwelwn nad yw maint PVC wedi newid. I ddarganfod pam, gallwch holi Kubernetes am ddisgrifiad YAML o'r PVC:

kubectl get pvc rbd-pvc -o yaml

Dyma'r broblem:

neges: Aros i'r defnyddiwr (ail-)gychwyn pod i orffen newid maint y system ffeiliau ar y nod. math: FileSystemResizePending

Hynny yw, mae'r ddisg wedi tyfu, ond nid yw'r system ffeiliau arni.
I dyfu'r system ffeiliau, mae angen i chi osod y cyfaint. Yn ein gwlad ni, nid yw'r PVC / PV a grëwyd yn cael ei ddefnyddio mewn unrhyw ffordd ar hyn o bryd.

Gallwn greu Pod prawf, er enghraifft fel hyn:

---
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 nawr gadewch i ni edrych ar PVC:

kubectl get pvc

Mae'r maint wedi newid, mae popeth yn iawn.

Yn y rhan gyntaf, buom yn gweithio gyda'r ddyfais bloc RBD (mae'n sefyll am Rados Block Device), ond ni ellir gwneud hyn os oes angen i wahanol ficrowasanaethau weithio gyda'r ddisg hon ar yr un pryd. Mae CephFS yn llawer mwy addas ar gyfer gweithio gyda ffeiliau yn hytrach na delweddau disg.
Gan ddefnyddio enghraifft clystyrau Ceph a Kubernetes, byddwn yn ffurfweddu CSI ac endidau angenrheidiol eraill i weithio gyda CephFS.

Gadewch i ni gael y gwerthoedd o'r siart Helm newydd sydd eu hangen arnom:

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

Unwaith eto mae angen i chi lenwi'r ffeil cephfs.yml. Fel o'r blaen, bydd gorchmynion Ceph yn helpu:

ceph fsid
ceph mon dump

Llenwch y ffeil gyda gwerthoedd fel hyn:

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

Sylwch fod cyfeiriadau monitor wedi'u nodi yn y cyfeiriad ffurflen syml:port. I osod cephfs ar nod, trosglwyddir y cyfeiriadau hyn i'r modiwl cnewyllyn, nad yw'n gwybod eto sut i weithio gyda'r protocol monitor v2.
Rydym yn newid y porthladd ar gyfer httpMetrics (bydd Prometheus yn mynd yno ar gyfer monitro metrigau) fel nad yw'n gwrthdaro â nginx-proxy, sy'n cael ei osod gan Kubespray. Efallai na fydd angen hyn arnoch chi.

Gosodwch y siart Helm yng nghlwstwr Kubernetes:

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

Gadewch i ni fynd i storfa ddata Ceph i greu defnyddiwr ar wahân yno. Mae'r ddogfennaeth yn nodi bod angen hawliau mynediad gweinyddwr clwstwr ar ddarparwr CephFS. Ond byddwn yn creu defnyddiwr ar wahân fs gyda hawliau cyfyngedig:

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 gadewch i ni edrych ar ei allwedd mynediad ar unwaith, bydd ei angen arnom yn nes ymlaen:

ceph auth get-key client.fs

Gadewch i ni greu Secret a StorageClass ar wahân.
Dim byd newydd, rydym eisoes wedi gweld hyn yn yr enghraifft o RBD:

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

Cymhwyso'r maniffest:

kubectl apply -f secret.yaml

A nawr - Dosbarth Storio ar wahân:

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

Gadewch i ni ei lenwi yma clwstwrID ac yn berthnasol yn Kubernetes:

kubectl apply -f storageclass.yaml

Проверка

I wirio, fel yn yr enghraifft flaenorol, gadewch i ni greu PVC:

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

A gwiriwch bresenoldeb PVC / PV:

kubectl get pvc
kubectl get pv

Os ydych am edrych ar ffeiliau a chyfeiriaduron yn CephFS, gallwch osod y system ffeiliau hon yn rhywle. Er enghraifft, fel y dangosir isod.

Gadewch i ni fynd i un o nodau clwstwr Ceph a pherfformio'r camau canlynol:

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

Wrth gwrs, dim ond at ddibenion hyfforddi y mae mowntio FS ar nod Ceph fel hwn yn addas, sef yr hyn a wnawn ar ein Cyrsiau slyrm. Dydw i ddim yn meddwl y byddai unrhyw un yn gwneud hyn wrth gynhyrchu; mae risg uchel o ddileu ffeiliau pwysig yn ddamweiniol.

Ac yn olaf, gadewch i ni wirio sut mae pethau'n gweithio gyda newid maint cyfeintiau yn achos CephFS. Gadewch i ni ddychwelyd i Kubernetes a golygu ein maniffest ar gyfer PVC - cynyddwch y maint yno, er enghraifft, i 7Gi.

Gadewch i ni gymhwyso'r ffeil olygedig:

kubectl apply -f pvc.yaml

Edrychwn ar y cyfeiriadur wedi'i osod i weld sut mae'r cwota wedi newid:

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

Er mwyn i'r gorchymyn hwn weithio, efallai y bydd angen i chi osod y pecyn ar eich system attr.

Mae ofn ar y llygaid, ond mae'r dwylo'n gwneud hynny

Mae'r holl swynion hyn ac amlygiadau hir YAML yn ymddangos yn gymhleth ar yr wyneb, ond yn ymarferol, mae myfyrwyr Slurm yn cael gafael arnynt yn eithaf cyflym.
Yn yr erthygl hon ni aethom yn ddwfn i'r jyngl - mae dogfennaeth swyddogol ar gyfer hynny. Os oes gennych ddiddordeb yn y manylion am sefydlu storfa Ceph gyda chlwstwr Kubernetes, bydd y dolenni hyn yn helpu:

Egwyddorion cyffredinol Kubernetes gweithio gyda chyfeintiau
Dogfennaeth RBD
Integreiddio RBD a Kubernetes o safbwynt Ceph
Integreiddio RBD a Kubernetes o safbwynt DPC
Dogfennaeth CephFS Cyffredinol
Integreiddio CephFS a Kubernetes o safbwynt CSI

Ar y cwrs Slurm Sylfaen Kubernetes gallwch fynd ychydig ymhellach a defnyddio cymhwysiad go iawn yn Kubernetes a fydd yn defnyddio CephFS fel storfa ffeiliau. Trwy geisiadau GET/POST byddwch yn gallu trosglwyddo ffeiliau i Ceph a'u derbyn ganddo.

Ac os oes gennych fwy o ddiddordeb mewn storio data, yna cofrestrwch ar gyfer cwrs newydd ar Ceph. Tra bod y prawf beta yn parhau, gellir cael y cwrs am bris gostyngol a gallwch ddylanwadu ar ei gynnwys.

Awdur yr erthygl: Alexander Shvalov, peiriannydd gweithredol Southbridge, Gweinyddwr Kubernetes Ardystiedig, awdur a datblygwr cyrsiau Slurm.

Ffynhonnell: hab.com