Isang praktikal na halimbawa ng pagkonekta ng storage na nakabase sa Ceph sa isang cluster ng Kubernetes

Ang Container Storage Interface (CSI) ay isang pinag-isang interface sa pagitan ng Kubernetes at mga storage system. Napag-usapan na natin ito ng maikli sinabi, at ngayon ay titingnan natin ang kumbinasyon ng CSI at Ceph: ipapakita natin kung paano ikonekta ang imbakan ng Ceph sa Kubernetes cluster.
Ang artikulo ay nagbibigay ng tunay, kahit na bahagyang pinasimple na mga halimbawa para sa kadalian ng pang-unawa. Hindi namin isinasaalang-alang ang pag-install at pag-configure ng mga cluster ng Ceph at Kubernetes.

Nagtataka ka ba kung paano ito gumagana?

Isang praktikal na halimbawa ng pagkonekta ng storage na nakabase sa Ceph sa isang cluster ng Kubernetes

Kaya, mayroon kang Kubernetes cluster sa iyong mga kamay, na naka-deploy, halimbawa, kubespray. Mayroong isang Ceph cluster na nagtatrabaho sa malapit - maaari mo ring i-install ito, halimbawa, kasama nito isang set ng mga playbook. Sana ay hindi na kailangang banggitin na para sa produksyon sa pagitan nila ay dapat mayroong isang network na may bandwidth na hindi bababa sa 10 Gbit/s.

Kung mayroon ka ng lahat ng ito, umalis na tayo!

Una, pumunta tayo sa isa sa mga Ceph cluster node at suriin kung maayos ang lahat:

ceph health
ceph -s

Susunod, gagawa kami kaagad ng pool para sa mga RBD disk:

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

Lumipat tayo sa kumpol ng Kubernetes. Doon, una sa lahat, i-install namin ang driver ng Ceph CSI para sa RBD. I-install namin, gaya ng inaasahan, sa pamamagitan ng Helm.
Nagdagdag kami ng repository na may chart, nakakakuha kami ng set ng mga variable para sa ceph-csi-rbd chart:

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

Ngayon ay kailangan mong punan ang cephrbd.yml file. Upang gawin ito, alamin ang cluster ID at IP address ng mga monitor sa Ceph:

ceph fsid  # Ρ‚Π°ΠΊ ΠΌΡ‹ ΡƒΠ·Π½Π°Π΅ΠΌ clusterID
ceph mon dump  # Π° Ρ‚Π°ΠΊ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ IP-адрСса ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΎΠ²

Ipinasok namin ang mga nakuhang halaga sa cephrbd.yml file. Kasabay nito, pinapagana namin ang paglikha ng mga patakaran ng PSP (Pod Security Policies). Mga pagpipilian sa mga seksyon nodeplugin ΠΈ tagapagbigay nasa file na, maaari silang itama gaya ng ipinapakita sa ibaba:

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

Susunod, ang natitira na lang sa amin ay i-install ang chart sa cluster ng Kubernetes.

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

Mahusay, gumagana ang driver ng RBD!
Gumawa tayo ng bagong StorageClass sa Kubernetes. Nangangailangan na naman ito ng kaunting pagkukulitan kay Ceph.

Lumilikha kami ng bagong user sa Ceph at binibigyan siya ng karapatang sumulat sa pool kubo:

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

Ngayon tingnan natin na nandoon pa rin ang access key:

ceph auth get-key client.rbdkube

Ang utos ay maglalabas ng ganito:

AQCO9NJbhYipKRAAMqZsnqqS/T8OYQX20xIa9A==

Idagdag natin ang value na ito sa Secret sa Kubernetes cluster - kung saan kailangan natin ito userKey:

---
apiVersion: v1
kind: Secret
metadata:
  name: csi-rbd-secret
  namespace: ceph-csi-rbd
stringData:
  # ЗначСния ΠΊΠ»ΡŽΡ‡Π΅ΠΉ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ Π΅Π³ΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ, ΠΊΠ°ΠΊ ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π²
  # кластСрС Ceph. ID ΡŽΠ·Π΅Ρ€Π° Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ доступ ΠΊ ΠΏΡƒΠ»Ρƒ,
  # ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ Π² storage class
  userID: rbdkube
  userKey: <user-key>

At nilikha namin ang aming lihim:

kubectl apply -f secret.yaml

Susunod, kailangan namin ng isang StorageClass manifest na tulad nito:

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

Kailangang punan clusterID, na natutunan na namin ng team ceph fsid, at ilapat ang manifest na ito sa cluster ng Kubernetes:

kubectl apply -f storageclass.yaml

Para tingnan kung paano gumagana ang mga cluster, gawin natin ang sumusunod na PVC (Persistent Volume Claim):

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

Tingnan natin kaagad kung paano ginawa ng Kubernetes ang hiniling na volume sa Ceph:

kubectl get pvc
kubectl get pv

Ang lahat ay tila mahusay! Ano ang hitsura nito sa panig ng Ceph?
Kumuha kami ng listahan ng mga volume sa pool at tingnan ang impormasyon tungkol sa aming volume:

rbd ls -p kube
rbd -p kube info csi-vol-eb3d257d-8c6c-11ea-bff5-6235e7640653  # Ρ‚ΡƒΡ‚, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅, Π±ΡƒΠ΄Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ID Ρ‚ΠΎΠΌΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹Π΄Π°Π»Π° прСдыдущая ΠΊΠΎΠΌΠ°Π½Π΄Π°

Ngayon tingnan natin kung paano gumagana ang pagbabago ng laki ng volume ng RBD.
Baguhin ang laki ng volume sa pvc.yaml manifest sa 2Gi at ilapat ito:

kubectl apply -f pvc.yaml

Hintayin natin na magkabisa ang mga pagbabago at tingnan muli ang laki ng volume.

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

kubectl get pv
kubectl get pvc

Nakita namin na ang laki ng PVC ay hindi nagbago. Upang malaman kung bakit, maaari kang mag-query sa Kubernetes para sa isang paglalarawan ng YAML ng PVC:

kubectl get pvc rbd-pvc -o yaml

Narito ang problema:

mensahe: Naghihintay para sa user na (muling) magsimula ng pod upang tapusin ang file system resize ng volume sa node. uri: FileSystemResizePending

Iyon ay, ang disk ay lumago, ngunit ang file system dito ay hindi.
Upang mapalago ang file system, kailangan mong i-mount ang volume. Sa ating bansa, ang ginawang PVC/PV ay kasalukuyang hindi ginagamit sa anumang paraan.

Maaari kaming lumikha ng isang pagsubok na Pod, halimbawa tulad nito:

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

At ngayon tingnan natin ang PVC:

kubectl get pvc

Ang laki ay nagbago, lahat ay maayos.

Sa unang bahagi, nagtrabaho kami sa RBD block device (ito ay kumakatawan sa Rados Block Device), ngunit hindi ito magagawa kung ang iba't ibang microservice ay kailangang gumana sa disk na ito nang sabay-sabay. Ang CephFS ay mas angkop para sa pagtatrabaho sa mga file kaysa sa mga imahe sa disk.
Gamit ang halimbawa ng mga cluster ng Ceph at Kubernetes, iko-configure namin ang CSI at iba pang kinakailangang entity upang gumana sa CephFS.

Kunin natin ang mga halaga mula sa bagong Helm chart na kailangan natin:

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

Muli kailangan mong punan ang cephfs.yml file. Tulad ng dati, makakatulong ang mga utos ni Ceph:

ceph fsid
ceph mon dump

Punan ang file ng mga halaga tulad nito:

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

Pakitandaan na ang mga monitor address ay tinukoy sa simpleng form address:port. Upang i-mount ang mga cephfs sa isang node, ang mga address na ito ay inililipat sa kernel module, na hindi pa alam kung paano gumana sa v2 monitor protocol.
Binago namin ang port para sa httpMetrics (Pupunta doon si Prometheus para sa mga sukatan ng pagsubaybay) upang hindi ito sumalungat sa nginx-proxy, na naka-install ng Kubespray. Maaaring hindi mo ito kailangan.

I-install ang Helm chart sa Kubernetes cluster:

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

Pumunta tayo sa Ceph data store para gumawa ng hiwalay na user doon. Ang dokumentasyon ay nagsasaad na ang tagapagbigay ng CephFS ay nangangailangan ng mga karapatan sa pag-access ng administrator ng cluster. Ngunit gagawa kami ng isang hiwalay na gumagamit fs may limitadong karapatan:

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'

At agad nating tingnan ang kanyang access key, kakailanganin natin ito mamaya:

ceph auth get-key client.fs

Gumawa tayo ng hiwalay na Secret at StorageClass.
Walang bago, nakita na natin ito sa halimbawa ng RBD:

---
apiVersion: v1
kind: Secret
metadata:
  name: csi-cephfs-secret
  namespace: ceph-csi-cephfs
stringData:
  # НСобходимо для динамичСски создаваСмых Ρ‚ΠΎΠΌΠΎΠ²
  adminID: fs
  adminKey: <Π²Ρ‹Π²ΠΎΠ΄ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹>

Paglalapat ng manifest:

kubectl apply -f secret.yaml

At ngayon - isang hiwalay na 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

Punan natin ito dito clusterID at naaangkop sa Kubernetes:

kubectl apply -f storageclass.yaml

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°

Upang suriin, tulad ng sa nakaraang halimbawa, gumawa tayo ng PVC:

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

At suriin ang presensya ng PVC/PV:

kubectl get pvc
kubectl get pv

Kung gusto mong tumingin sa mga file at direktoryo sa CephFS, maaari mong i-mount ang file system na ito sa isang lugar. Halimbawa tulad ng ipinapakita sa ibaba.

Pumunta tayo sa isa sa mga Ceph cluster node at gawin ang mga sumusunod na aksyon:

# Π’ΠΎΡ‡ΠΊΠ° монтирования
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

Siyempre, ang pag-mount ng FS sa isang Ceph node na tulad nito ay angkop lamang para sa mga layunin ng pagsasanay, na kung ano ang ginagawa namin sa aming Mga kursong slurm. Sa palagay ko ay walang sinuman ang gagawa nito sa produksyon; may mataas na panganib na aksidenteng mabura ang mahahalagang file.

At sa wakas, tingnan natin kung paano gumagana ang mga bagay sa pagbabago ng laki ng mga volume sa kaso ng CephFS. Bumalik tayo sa Kubernetes at i-edit ang ating manifest para sa PVC - dagdagan ang laki doon, halimbawa, sa 7Gi.

Ilapat natin ang na-edit na file:

kubectl apply -f pvc.yaml

Tingnan natin ang naka-mount na direktoryo upang makita kung paano nagbago ang quota:

getfattr -n ceph.quota.max_bytes <ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³-с-Π΄Π°Π½Π½Ρ‹ΠΌΠΈ>

Para gumana ang command na ito, maaaring kailanganin mong i-install ang package sa iyong system attr.

Ang mga mata ay natatakot, ngunit ang mga kamay ay natatakot

Ang lahat ng mga spell na ito at mahabang YAML manifests ay tila kumplikado sa ibabaw, ngunit sa pagsasanay, ang mga mag-aaral ng Slurm ay mabilis na nakakakuha ng kaalaman sa kanila.
Sa artikulong ito, hindi kami napunta sa kagubatan - mayroong opisyal na dokumentasyon para doon. Kung interesado ka sa mga detalye ng pag-set up ng Ceph storage gamit ang isang Kubernetes cluster, makakatulong ang mga link na ito:

Mga pangkalahatang prinsipyo ng Kubernetes na nagtatrabaho sa mga volume
Dokumentasyon ng RBD
Pagsasama ng RBD at Kubernetes mula sa pananaw ng Ceph
Pagsasama ng RBD at Kubernetes mula sa pananaw ng CSI
Pangkalahatang Dokumentasyon ng CephFS
Pagsasama ng CephFS at Kubernetes mula sa pananaw ng CSI

Sa kursong Slurm Kubernetes Base maaari kang pumunta nang kaunti pa at mag-deploy ng totoong application sa Kubernetes na gagamit ng CephFS bilang imbakan ng file. Sa pamamagitan ng GET/POST request, makakapaglipat ka ng mga file at makakatanggap ng mga ito mula kay Ceph.

At kung mas interesado ka sa pag-iimbak ng data, pagkatapos ay mag-sign up para sa bagong kurso kay Ceph. Habang ang beta test ay nagpapatuloy, ang kurso ay maaaring makuha sa isang diskwento at maaari mong maimpluwensyahan ang nilalaman nito.

May-akda ng artikulo: Alexander Shvalov, nagsasanay na inhinyero Southbridge, Certified Kubernetes Administrator, may-akda at developer ng mga kursong Slurm.

Pinagmulan: www.habr.com