Usa ka praktikal nga pananglitan sa pagkonektar sa pagtipig nga nakabase sa Ceph sa usa ka cluster sa Kubernetes

Ang Container Storage Interface (CSI) usa ka hiniusa nga interface tali sa Kubernetes ug mga sistema sa pagtipig. Nahisgotan na namo kini sa makadiyot giingnan, ug karon atong tan-awon pag-ayo ang kombinasyon sa CSI ug Ceph: atong ipakita kung giunsa ikonektar ang pagtipig sa Ceph ngadto sa Kubernetes cluster.
Ang artikulo naghatag og tinuod, bisan gamay nga gipayano nga mga pananglitan alang sa kasayon ​​sa panglantaw. Wala namo gikonsiderar ang pag-install ug pag-configure sa mga cluster sa Ceph ug Kubernetes.

Nahibulong ka ba kung giunsa kini paglihok?

Usa ka praktikal nga pananglitan sa pagkonektar sa pagtipig nga nakabase sa Ceph sa usa ka cluster sa Kubernetes

Busa, aduna kay Kubernetes cluster sa imong mga tudlo, gipakatap, pananglitan, kubespray. Adunay usa ka Ceph cluster nga nagtrabaho sa duol - mahimo usab nimo kini i-install, pananglitan, uban niini usa ka hugpong sa mga playbook. Nanghinaut ko nga dili kinahanglan nga hisgutan nga alang sa produksyon tali kanila kinahanglan nga adunay usa ka network nga adunay bandwidth nga labing menos 10 Gbit / s.

Kung naa nimo kining tanan, lakaw ta!

Una, moadto kita sa usa sa mga cluster node sa Ceph ug susihon kung naa ba ang tanan:

ceph health
ceph -s

Sunod, maghimo dayon kami usa ka pool alang sa mga RBD disk:

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

Mopadayon kita ngadto sa Kubernetes cluster. Didto, una sa tanan, atong i-install ang Ceph CSI driver para sa RBD. Atong i-install, sama sa gipaabot, pinaagi sa Helm.
Nagdugang kami usa ka repository nga adunay usa ka tsart, nakakuha kami usa ka hugpong sa mga variable alang sa tsart sa ceph-csi-rbd:

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

Karon kinahanglan nimo nga pun-on ang cephrbd.yml file. Aron mahimo kini, pangitaa ang cluster ID ug IP address sa mga monitor sa Ceph:

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

Gisulod namon ang nakuha nga mga kantidad sa file sa cephrbd.yml. Sa parehas nga oras, mahimo namon ang paghimo sa mga palisiya sa PSP (Pod Security Policies). Mga kapilian sa mga seksyon nodeplugin ΠΈ tighatag naa na sa file, mahimo silang matul-id sama sa gipakita sa ubos:

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

Sunod, ang nahabilin alang kanamo mao ang pag-install sa tsart sa kumpol sa Kubernetes.

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

Maayo, ang drayber sa RBD nagtrabaho!
Magbuhat ta ug bag-ong StorageClass sa Kubernetes. Nanginahanglan na usab kini og gamay nga pag-usisa ni Ceph.

Naghimo kami usa ka bag-ong tiggamit sa Ceph ug gihatagan siya mga katungod sa pagsulat sa pool cube:

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

Karon atong tan-awon ang access key anaa gihapon:

ceph auth get-key client.rbdkube

Ang mando magpagawas usa ka butang nga sama niini:

AQCO9NJbhYipKRAAMqZsnqqS/T8OYQX20xIa9A==

Atong idugang kini nga bili sa Secret sa Kubernetes cluster - diin gikinahanglan nato kini userKey:

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

Ug among gihimo ang among sekreto:

kubectl apply -f secret.yaml

Sunod, kinahanglan namon ang usa ka StorageClass nga magpakita nga sama niini:

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

Kinahanglang pun-an clusterID, nga nakat-onan na namo sa team ceph fsid, ug i-apply kini nga manifest sa Kubernetes cluster:

kubectl apply -f storageclass.yaml

Aron masusi kung giunsa ang pagtinabangay sa mga pungpong, buhaton nato ang mosunod nga PVC (Persistent Volume Claim):

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

Atong tan-awon dayon kung giunsa paghimo sa Kubernetes ang gihangyo nga volume sa Ceph:

kubectl get pvc
kubectl get pv

Ang tanan daw maayo! Unsa ang hitsura niini sa bahin sa Ceph?
Nagkuha kami usa ka lista sa mga volume sa pool ug tan-awa ang kasayuran bahin sa among volume:

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

Karon atong tan-awon kung giunsa ang pagbag-o sa usa ka volume sa RBD.
Usba ang gidak-on sa volume sa pvc.yaml manifest sa 2Gi ug i-apply kini:

kubectl apply -f pvc.yaml

Atong hulaton ang mga pagbag-o nga mo-epekto ug tan-awon pag-usab ang gidak-on sa volume.

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

kubectl get pv
kubectl get pvc

Nakita namon nga ang gidak-on sa PVC wala mausab. Aron mahibal-an kung ngano, mahimo nimong pangutana ang Kubernetes alang sa usa ka paghulagway sa YAML sa PVC:

kubectl get pvc rbd-pvc -o yaml

Ania ang problema:

mensahe: Naghulat alang sa user nga (pag-usab) magsugod sa usa ka pod aron mahuman ang file system resize sa volume sa node. tipo: FileSystemResizePending

Kana mao, ang disk mitubo, apan ang file system niini wala.
Aron mapadako ang file system, kinahanglan nimo nga i-mount ang volume. Sa atong nasud, ang gibuhat nga PVC/PV wala gigamit karon sa bisan unsang paagi.

Makahimo kita og test Pod, pananglitan sama niini:

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

Ug karon atong tan-awon ang PVC:

kubectl get pvc

Nausab ang gidak-on, maayo ang tanan.

Sa una nga bahin, nagtrabaho kami sa RBD block device (kini nagpasabut sa Rados Block Device), apan dili kini mahimo kung ang lainlaing mga microservice kinahanglan nga magtrabaho sa kini nga disk nga dungan. Ang CephFS labi ka angay alang sa pagtrabaho sa mga file kaysa mga imahe sa disk.
Gamit ang panig-ingnan sa Ceph ug Kubernetes clusters, among i-configure ang CSI ug uban pang mga kinahanglanon nga entidad aron magtrabaho kauban ang CephFS.

Atong kuhaon ang mga bili gikan sa bag-ong Helm chart nga atong gikinahanglan:

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

Pag-usab kinahanglan nimo nga pun-on ang cephfs.yml file. Sama kaniadto, ang mga mando ni Ceph makatabang:

ceph fsid
ceph mon dump

Pun-a ang file nga adunay mga kantidad nga sama niini:

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

Palihug timan-i nga ang mga adres sa monitor gitakda sa yano nga porma nga adres:port. Aron ma-mount ang mga cephfs sa usa ka node, kini nga mga adres gipasa sa kernel module, nga wala pa mahibal-an kung giunsa ang pagtrabaho kauban ang v2 monitor protocol.
Gibag-o namon ang pantalan para sa httpMetrics (Ang Prometheus moadto didto alang sa pagmonitor sa mga sukatan) aron dili kini magkasumpaki sa nginx-proxy, nga gi-install sa Kubespray. Tingali dili nimo kinahanglan kini.

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

Adto ta sa Ceph data store para maghimo ug bulag nga user didto. Ang dokumentasyon nag-ingon nga ang tagahatag sa CephFS nanginahanglan mga katungod sa pag-access sa cluster administrator. Apan maghimo kami usa ka lahi nga tiggamit fs nga adunay limitado nga mga katungod:

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'

Ug tan-awon dayon nato ang iyang access key, kinahanglan nato kini sa ulahi:

ceph auth get-key client.fs

Magbuhat ta ug bulag nga Secret ug StorageClass.
Wala’y bag-o, nakita na namon kini sa pananglitan sa RBD:

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

Pagpadapat sa manifest:

kubectl apply -f secret.yaml

Ug karon - usa ka lahi nga 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

Atong pun-on kini dinhi clusterID ug magamit sa Kubernetes:

kubectl apply -f storageclass.yaml

inspection

Aron masusi, sama sa miaging pananglitan, maghimo kita og PVC:

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

Ug susiha ang presensya sa PVC/PV:

kubectl get pvc
kubectl get pv

Kung gusto nimo tan-awon ang mga file ug direktoryo sa CephFS, mahimo nimong i-mount kini nga file system bisan diin. Pananglitan sama sa gipakita sa ubos.

Adto ta sa usa sa mga Ceph cluster node ug buhata ang mosunod nga mga 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 sa FS sa usa ka Ceph node nga sama niini angay lamang alang sa mga katuyoan sa pagbansay, nga mao ang among gibuhat sa among Mga kurso sa Slurm. Sa akong hunahuna wala’y bisan kinsa nga mobuhat niini sa produksiyon; adunay taas nga peligro nga dili tinuyo nga mapapas ang hinungdanon nga mga file.

Ug sa katapusan, atong susihon kung giunsa ang paglihok sa mga butang sa pagbag-o sa mga volume sa kaso sa CephFS. Balik ta sa Kubernetes ug i-edit ang atong manifest para sa PVC - dugangan ang gidak-on didto, pananglitan, ngadto sa 7Gi.

Atong i-apply ang gi-edit nga file:

kubectl apply -f pvc.yaml

Atong tan-awon ang naka-mount nga direktoryo aron makita kung giunsa ang pagbag-o sa quota:

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

Aron molihok kini nga sugo, kinahanglan nimo nga i-install ang package sa imong sistema attr.

Ang mga mata nahadlok, apan ang mga kamot nahadlok

Kining tanan nga mga spelling ug taas nga YAML manifests daw komplikado sa ibabaw, apan sa pagpraktis, ang mga estudyante sa Slurm dali nga nakasabot niini.
Niini nga artikulo wala kami moadto sa lawom nga kalasangan - adunay opisyal nga dokumentasyon alang niana. Kung interesado ka sa mga detalye sa pag-set up sa Ceph storage gamit ang Kubernetes cluster, kini nga mga link makatabang:

Kinatibuk-ang mga prinsipyo sa Kubernetes nga nagtrabaho sa mga volume
Dokumentasyon sa RBD
Paghiusa sa RBD ug Kubernetes gikan sa panan-aw sa Ceph
Paghiusa sa RBD ug Kubernetes gikan sa panan-aw sa CSI
Kinatibuk-ang Dokumentasyon sa CephFS
Paghiusa sa CephFS ug Kubernetes gikan sa panan-aw sa CSI

Sa kursong Slurm Kubernetes Base mahimo ka nga moadto sa usa ka gamay nga dugang ug i-deploy ang usa ka tinuud nga aplikasyon sa Kubernetes nga mogamit sa CephFS ingon pagtipig sa file. Pinaagi sa GET/POST requests mahimo nimong mabalhin ang mga file ug madawat kini gikan kang Ceph.

Ug kung mas interesado ka sa pagtipig sa datos, dayon pag-sign up bag-ong kurso sa Ceph. Samtang ang beta test nagpadayon, ang kurso mahimong makuha sa usa ka diskwento ug mahimo nimong maimpluwensyahan ang sulud niini.

Awtor sa artikulo: Alexander Shvalov, practicing engineer habagatan nga taytayan, Certified Kubernetes Administrator, awtor ug developer sa mga kurso sa Slurm.

Source: www.habr.com