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
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?
Kaya, mayroon kang Kubernetes cluster sa iyong mga kamay, na naka-deploy, halimbawa,
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
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:
Sa kursong Slurm
At kung mas interesado ka sa pag-iimbak ng data, pagkatapos ay mag-sign up para sa
May-akda ng artikulo: Alexander Shvalov, nagsasanay na inhinyero
Pinagmulan: www.habr.com