'n Praktiese voorbeeld van die koppeling van Ceph-gebaseerde berging aan 'n Kubernetes-kluster

Container Storage Interface (CSI) is 'n verenigde koppelvlak tussen Kubernetes en bergingstelsels. Ons het reeds kortliks daaroor gepraat vertel, en vandag gaan ons die kombinasie van CSI en Ceph van nader bekyk: ons sal wys hoe koppel Ceph-berging na die Kubernetes-kluster.
Die artikel verskaf werklike, hoewel effens vereenvoudigde voorbeelde vir gemak van persepsie. Ons oorweeg dit nie om Ceph- en Kubernetes-klusters te installeer en op te stel nie.

Wonder jy hoe dit werk?

'n Praktiese voorbeeld van die koppeling van Ceph-gebaseerde berging aan 'n Kubernetes-kluster

So, jy het 'n Kubernetes-kluster by jou vingers, ontplooi, byvoorbeeld, kubespray. Daar is 'n Ceph-kluster wat naby werk - jy kan dit byvoorbeeld ook hiermee installeer 'n stel speelboeke. Ek hoop dit is nie nodig om te noem dat daar vir produksie tussen hulle 'n netwerk met 'n bandwydte van minstens 10 Gbit/s moet wees nie.

As jy dit alles het, laat ons gaan!

Kom ons gaan eers na een van die Ceph-cluster nodusse en kyk of alles in orde is:

ceph health
ceph -s

Vervolgens sal ons onmiddellik 'n poel vir RBD-skywe skep:

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

Kom ons gaan aan na die Kubernetes-groepering. Daar sal ons eerstens die Ceph CSI-bestuurder vir RBD installeer. Ons sal, soos verwag, deur Helm installeer.
Ons voeg 'n bewaarplek by met 'n grafiek, ons kry 'n stel veranderlikes vir die ceph-csi-rbd grafiek:

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

Nou moet jy die cephrbd.yml-lΓͺer invul. Om dit te doen, vind die groep-ID en IP-adresse van monitors in Ceph uit:

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

Ons voer die verkryde waardes in die cephrbd.yml-lΓͺer in. Terselfdertyd maak ons ​​die skepping van PSP-beleide (Pod Security Policies) moontlik. Opsies in afdelings nodeplugin ΠΈ voorsiener reeds in die lΓͺer, kan hulle reggestel word soos hieronder getoon:

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

Volgende, al wat vir ons oorbly, is om die grafiek in die Kubernetes-kluster te installeer.

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

Groot, die RBD-bestuurder werk!
Kom ons skep 'n nuwe StorageClass in Kubernetes. Dit verg weer 'n bietjie peuter met Ceph.

Ons skep 'n nuwe gebruiker in Ceph en gee hom regte om na die swembad te skryf Kubus:

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

Kom ons kyk nou dat die toegangsleutel nog daar is:

ceph auth get-key client.rbdkube

Die opdrag sal iets soos hierdie uitvoer:

AQCO9NJbhYipKRAAMqZsnqqS/T8OYQX20xIa9A==

Kom ons voeg hierdie waarde by Secret in die Kubernetes-groepering – waar ons dit nodig het gebruikerssleutel:

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

En ons skep ons geheim:

kubectl apply -f secret.yaml

Vervolgens benodig ons 'n StorageClass-manifes iets soos hierdie:

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

Moet ingevul word clusterID, wat ons reeds deur die span geleer het ceph fsid, en pas hierdie manifes toe op die Kubernetes-kluster:

kubectl apply -f storageclass.yaml

Om te kyk hoe die trosse saamwerk, kom ons skep die volgende PVC (Persistent Volume Claim):

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

Kom ons kyk dadelik hoe Kubernetes die gevraagde volume in Ceph geskep het:

kubectl get pvc
kubectl get pv

Alles blyk wonderlik te wees! Hoe lyk dit aan die Ceph-kant?
Ons kry 'n lys van volumes in die swembad en bekyk inligting oor ons volume:

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

Kom ons kyk nou hoe die grootte van 'n RBD-volume werk.
Verander die volumegrootte in die pvc.yaml-manifes na 2Gi en pas dit toe:

kubectl apply -f pvc.yaml

Kom ons wag vir die veranderinge om in werking te tree en kyk weer na die volume grootte.

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

kubectl get pv
kubectl get pvc

Ons sien dat die grootte van PVC nie verander het nie. Om uit te vind hoekom, kan jy Kubernetes navraag doen vir 'n YAML-beskrywing van die PVC:

kubectl get pvc rbd-pvc -o yaml

Hier is die probleem:

boodskap: Wag vir gebruiker om 'n peul te (her-)begin om lΓͺerstelselgrootte van volume op nodus te voltooi. tipe: FileSystemResizePending

Dit wil sΓͺ, die skyf het gegroei, maar die lΓͺerstelsel daarop het nie.
Om die lΓͺerstelsel te laat groei, moet jy die volume monteer. In ons land word die geskepde PVC/PV tans op geen manier gebruik nie.

Ons kan 'n toetspod skep, byvoorbeeld soos volg:

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

En kom ons kyk nou na PVC:

kubectl get pvc

Die grootte het verander, alles is in orde.

In die eerste deel het ons met die RBD-bloktoestel gewerk (dit staan ​​vir Rados Block Device), maar dit kan nie gedoen word as verskillende mikrodienste gelyktydig met hierdie skyf moet werk nie. CephFS is baie beter geskik om met lΓͺers te werk eerder as skyfbeelde.
Deur die voorbeeld van Ceph- en Kubernetes-klusters te gebruik, sal ons CSI en ander nodige entiteite konfigureer om met CephFS te werk.

Kom ons kry die waardes uit die nuwe Helm-kaart wat ons nodig het:

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

Weereens moet jy die cephfs.yml-lΓͺer invul. Soos voorheen, sal Ceph-opdragte help:

ceph fsid
ceph mon dump

Vul die lΓͺer in met waardes soos hierdie:

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

Neem asseblief kennis dat monitor adresse gespesifiseer word in die eenvoudige vorm adres:poort. Om cephfs op 'n nodus te monteer, word hierdie adresse na die kernmodule oorgedra, wat nog nie weet hoe om met die v2-monitorprotokol te werk nie.
Ons verander die poort vir httpMetrics (Prometheus sal daarheen gaan vir monitering van metrieke) sodat dit nie bots met nginx-proxy, wat deur Kubespray geΓ―nstalleer word nie. Jy het dit dalk nie nodig nie.

Installeer die Helm-kaart in die Kubernetes-groepering:

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

Kom ons gaan na die Ceph-datawinkel om 'n aparte gebruiker daar te skep. Die dokumentasie verklaar dat die CephFS-voorsiener toegangsregte vir groepadministrateur vereis. Maar ons sal 'n aparte gebruiker skep fs met beperkte regte:

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'

En kom ons kyk dadelik na sy toegangsleutel, ons sal dit later nodig hΓͺ:

ceph auth get-key client.fs

Kom ons skep aparte Secret en StorageClass.
Niks nuuts nie, ons het dit reeds in die voorbeeld van RBD gesien:

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

Pas die manifes toe:

kubectl apply -f secret.yaml

En nou - 'n aparte bergingsklas:

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

Kom ons vul dit hier in clusterID en van toepassing in Kubernetes:

kubectl apply -f storageclass.yaml

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

Om te kontroleer, soos in die vorige voorbeeld, kom ons skep 'n PVC:

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

En kyk na die teenwoordigheid van PVC/PV:

kubectl get pvc
kubectl get pv

As jy na lΓͺers en gidse in CephFS wil kyk, kan jy hierdie lΓͺerstelsel iewers monteer. Byvoorbeeld soos hieronder getoon.

Kom ons gaan na een van die Ceph cluster nodusse en voer die volgende aksies uit:

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

Natuurlik is die montering van FS op 'n Ceph-knoop soos hierdie slegs geskik vir opleidingsdoeleindes, en dit is wat ons op ons Slurm kursusse. Ek dink nie iemand sal dit in produksie doen nie; daar is 'n hoΓ« risiko om belangrike lΓͺers per ongeluk uit te vee.

En laastens, kom ons kyk hoe dinge werk met die grootte van volumes in die geval van CephFS. Kom ons keer terug na Kubernetes en wysig ons manifes vir PVC - vergroot die grootte daar, byvoorbeeld, na 7Gi.

Kom ons pas die geredigeerde lΓͺer toe:

kubectl apply -f pvc.yaml

Kom ons kyk na die gemonteerde gids om te sien hoe die kwota verander het:

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

Vir hierdie opdrag om te werk, moet jy dalk die pakket op jou stelsel installeer attr.

Die oΓ« is bang, maar die hande wel

Al hierdie towerspreuke en lang YAML-manifeste lyk op die oog af ingewikkeld, maar in die praktyk kry Slurm-studente hulle redelik vinnig onder die knie.
In hierdie artikel het ons nie diep in die oerwoud ingegaan nie – daar is amptelike dokumentasie daarvoor. As jy belangstel in die besonderhede van die opstel van Ceph-berging met 'n Kubernetes-kluster, sal hierdie skakels help:

Algemene beginsels van Kubernetes wat met volumes werk
RBD Dokumentasie
Integrasie van RBD en Kubernetes vanuit 'n Ceph-perspektief
Integreer RBD en Kubernetes vanuit 'n CSI-perspektief
Algemene CephFS-dokumentasie
Die integrasie van CephFS en Kubernetes vanuit 'n CSI-perspektief

Op die Slurm-kursus Kubernetes-basis jy kan 'n bietjie verder gaan en 'n regte toepassing in Kubernetes ontplooi wat CephFS as lΓͺerberging sal gebruik. Deur GET/POS-versoeke sal jy lΓͺers kan oordra na en dit van Ceph ontvang.

En as jy meer belangstel in databerging, teken dan aan vir nuwe kursus oor Ceph. Terwyl die beta-toets aan die gang is, kan die kursus teen 'n afslag verkry word en jy kan die inhoud daarvan beΓ―nvloed.

Skrywer van die artikel: Alexander Shvalov, praktiserende ingenieur South brug, Gesertifiseerde Kubernetes-administrateur, skrywer en ontwikkelaar van Slurm-kursusse.

Bron: will.com

Koop betroubare hosting vir werwe met DDoS-beskerming, VPS VDS-bedieners πŸ”₯ Koop betroubare webwerfhosting met DDoS-beskerming, VPS VDS-bedieners | ProHoster