Conto praktis nyambungake panyimpenan basis Ceph menyang kluster Kubernetes

Container Storage Interface (CSI) minangka antarmuka gabungan antarane Kubernetes lan sistem panyimpenan. Kita wis ngomong babagan sedhela ngandika, lan dina iki kita bakal nliti kombinasi CSI lan Ceph: kita bakal nuduhake carane nyambung panyimpenan Ceph menyang kluster Kubernetes.
Artikel kasebut nyedhiyakake conto nyata, sanajan rada disederhanakake kanggo gampang dirasakake. Kita ora nganggep nginstal lan ngonfigurasi klompok Ceph lan Kubernetes.

Apa sampeyan kepingin weruh cara kerjane?

Conto praktis nyambungake panyimpenan basis Ceph menyang kluster Kubernetes

Dadi, sampeyan duwe kluster Kubernetes ing pucuk driji, disebarake, contone, kubespray. Ana kluster Ceph sing makarya ing cedhak - sampeyan uga bisa nginstal, contone, karo iki pesawat saka playbooks. Muga-muga ora perlu disebutake yen kanggo produksi ing antarane kudu ana jaringan kanthi bandwidth paling sethithik 10 Gbit / s.

Yen sampeyan duwe kabeh iki, ayo!

Pisanan, ayo pindhah menyang salah sawijining simpul kluster Ceph lan priksa manawa kabeh wis rapi:

ceph health
ceph -s

Sabanjure, kita bakal langsung nggawe blumbang kanggo disk RBD:

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

Ayo pindhah menyang kluster Kubernetes. Ing kana, pisanan, kita bakal nginstal driver Ceph CSI kanggo RBD. Kita bakal nginstal, kaya samesthine, liwat Helm.
Kita nambah repositori kanthi grafik, kita entuk set variabel kanggo grafik ceph-csi-rbd:

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

Saiki sampeyan kudu ngisi file cephrbd.yml. Kanggo nindakake iki, goleki ID kluster lan alamat IP monitor ing Ceph:

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

Kita ketik nilai sing dipikolehi menyang file cephrbd.yml. Ing wektu sing padha, kita ngaktifake nggawe kabijakan PSP (Pod Security Policies). Pilihan ing bagean nodeplugin ΠΈ panyedhiya wis ana ing file, bisa didandani kaya ing ngisor iki:

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

Sabanjure, sing isih ana kanggo kita yaiku nginstal grafik ing kluster Kubernetes.

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

Apik, driver RBD bisa digunakake!
Ayo nggawe StorageClass anyar ing Kubernetes. Iki maneh mbutuhake dicokot saka tinkering karo Ceph.

Kita nggawe pangguna anyar ing Ceph lan menehi hak kanggo nulis menyang blumbang kubus:

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

Saiki ayo ndeleng kunci akses isih ana:

ceph auth get-key client.rbdkube

Printah kasebut bakal ngasilake kaya iki:

AQCO9NJbhYipKRAAMqZsnqqS/T8OYQX20xIa9A==

Ayo nambahake nilai iki menyang Rahasia ing kluster Kubernetes - ing ngendi kita butuh userKey:

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

Lan kita nggawe rahasia kita:

kubectl apply -f secret.yaml

Sabanjure, kita butuh manifest StorageClass kaya iki:

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

Perlu diisi clusterID, sing wis kita sinau dening tim ceph fsid, lan aplikasi manifest iki menyang cluster Kubernetes:

kubectl apply -f storageclass.yaml

Kanggo mriksa carane klompok bisa bebarengan, ayo nggawe PVC ing ngisor iki (Persistent Volume Claim):

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

Ayo langsung ndeleng kepiye Kubernetes nggawe volume sing dijaluk ing Ceph:

kubectl get pvc
kubectl get pv

Kabeh katon apik! Apa iki katon ing sisih Ceph?
Kita entuk dhaptar volume ing blumbang lan ndeleng informasi babagan volume:

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

Saiki ayo ndeleng cara ngowahi ukuran volume RBD.
Ganti ukuran volume ing manifest pvc.yaml dadi 2Gi lan aplikasi:

kubectl apply -f pvc.yaml

Ayo ngenteni owah-owahan ditrapake lan deleng maneh ukuran volume.

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

kubectl get pv
kubectl get pvc

Kita weruh yen ukuran PVC ora diganti. Kanggo ngerteni sebabe, sampeyan bisa takon Kubernetes kanggo katrangan YAML saka PVC:

kubectl get pvc rbd-pvc -o yaml

Mangkene masalahe:

pesen: Nunggu pangguna kanggo (re-) miwiti pod kanggo ngrampungake ukuran file sistem volume ing simpul. jinis: FileSystemResizePending

Sing, disk wis thukul, nanging sistem file ing iku ora.
Kanggo ngembangake sistem file, sampeyan kudu nambah volume. Ing negara kita, PVC / PV sing digawe saiki ora digunakake kanthi cara apa wae.

Kita bisa nggawe test Pod, contone kaya iki:

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

Lan saiki ayo ndeleng PVC:

kubectl get pvc

Ukuran wis diganti, kabeh apik.

Ing bagΓ©yan pisanan, kita kerjo karo piranti pemblokiran RBD (sing tegese Rados Block Piranti), nanging iki ora bisa rampung yen microservices beda kudu bisa karo disk iki bebarengan. CephFS luwih cocog kanggo nggarap file tinimbang gambar disk.
Nggunakake conto klompok Ceph lan Kubernetes, kita bakal ngatur CSI lan entitas liyane sing perlu kanggo nggarap CephFS.

Ayo entuk nilai saka grafik Helm anyar sing dibutuhake:

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

Maneh sampeyan kudu ngisi file cephfs.yml. Kaya sadurunge, perintah Ceph bakal mbantu:

ceph fsid
ceph mon dump

Isi file kasebut kanthi nilai kaya iki:

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

Wigati dimangerteni manawa alamat monitor ditemtokake ing alamat formulir prasaja:port. Kanggo masang cephfs ing simpul, alamat kasebut ditransfer menyang modul kernel, sing durung ngerti cara nggarap protokol monitor v2.
Kita ngganti port kanggo httpMetrics (Prometheus bakal pindhah menyang kana kanggo ngawasi metrik) supaya ora konflik karo nginx-proxy, sing diinstal dening Kubespray. Sampeyan bisa uga ora mbutuhake iki.

Instal bagan Helm ing kluster Kubernetes:

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

Ayo menyang toko data Ceph kanggo nggawe pangguna sing kapisah ing kana. Dokumentasi kasebut nyatakake yen panyedhiya CephFS mbutuhake hak akses administrator cluster. Nanging kita bakal nggawe pangguna sing kapisah fs kanthi hak winates:

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'

Lan ayo langsung ndeleng kunci aksese, mengko bakal dibutuhake:

ceph auth get-key client.fs

Ayo nggawe Secret lan StorageClass sing kapisah.
Ora ana sing anyar, kita wis ndeleng iki ing conto RBD:

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

Aplikasi manifest:

kubectl apply -f secret.yaml

Lan saiki - StorageClass sing kapisah:

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

Ayo ngisi kene clusterID lan ditrapake ing Kubernetes:

kubectl apply -f storageclass.yaml

pengawasan

Kanggo mriksa, kaya ing conto sadurunge, ayo nggawe PVC:

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

Lan priksa ananΓ© PVC / PV:

kubectl get pvc
kubectl get pv

Yen sampeyan pengin ndeleng file lan direktori ing CephFS, sampeyan bisa nginstal sistem file iki nang endi wae. Contone kaya ing ngisor iki.

Ayo menyang salah sawijining simpul kluster Ceph lan tindakake tumindak ing ngisor iki:

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

Mesthine, masang FS ing simpul Ceph kaya iki mung cocok kanggo tujuan latihan, yaiku apa sing ditindakake ing Kursus Slurm. Aku ora mikir yen ana sing bakal nindakake iki ing produksi; ana risiko dhuwur kanggo mbusak file penting kanthi ora sengaja.

Lan pungkasane, ayo mriksa cara kerjane kanthi ngowahi ukuran volume ing kasus CephFS. Ayo bali menyang Kubernetes lan nyunting manifest kanggo PVC - nambah ukuran ing kana, contone, menyang 7Gi.

Ayo aplikasi file sing wis diowahi:

kubectl apply -f pvc.yaml

Ayo ndeleng direktori sing dipasang kanggo ndeleng carane kuota wis diganti:

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

Supaya printah iki bisa, sampeyan bisa uga kudu nginstal paket ing sistem attr.

Mripat wedi, nanging tangan nindakake

Kabeh mantra iki lan manifests YAML dawa katon rumit ing lumahing, nanging ing laku, siswa Slurm njaluk nggantung mau cantik cepet.
Ing artikel iki, kita ora mlebu ing alas - ana dokumentasi resmi babagan iki. Yen sampeyan kepengin weruh rincian nyetel panyimpenan Ceph karo kluster Kubernetes, pranala iki bakal mbantu:

Prinsip umum Kubernetes nggarap volume
Dokumentasi RBD
Nggabungake RBD lan Kubernetes saka perspektif Ceph
Integrasi RBD lan Kubernetes saka perspektif CSI
Dokumentasi Umum CephFS
Integrasi CephFS lan Kubernetes saka perspektif CSI

Ing kursus Slurm Pangkalan Kubernetes sampeyan bisa pindhah sethitik luwih lan masang aplikasi nyata ing Kubernetes sing bakal nggunakake CephFS minangka panyimpenan file. Liwat panjalukan GET / POST sampeyan bakal bisa nransfer file menyang lan nampa saka Ceph.

Lan yen sampeyan luwih kasengsem ing panyimpenan data, banjur mlebu mesthi anyar ing Ceph. Nalika tes beta lagi ditindakake, kursus kasebut bisa dipikolehi kanthi diskon lan sampeyan bisa mengaruhi konten kasebut.

Penulis artikel: Alexander Shvalov, insinyur praktik jembatan kidul, Administrator Kubernetes Certified, penulis lan pangembang kursus Slurm.

Source: www.habr.com