Container Storage Interface (CSI) adalah antarmuka terpadu antara Kubernetes dan sistem penyimpanan. Kami sudah membicarakannya secara singkat
Artikel ini memberikan contoh nyata, meskipun sedikit disederhanakan untuk kemudahan persepsi. Kami tidak mempertimbangkan untuk menginstal dan mengkonfigurasi cluster Ceph dan Kubernetes.
Apakah Anda bertanya-tanya bagaimana cara kerjanya?
Jadi, Anda memiliki cluster Kubernetes di ujung jari Anda, yang diterapkan, misalnya,
Jika Anda memiliki semua ini, ayo pergi!
Pertama, mari kita pergi ke salah satu node cluster Ceph dan memeriksa apakah semuanya sudah beres:
ceph health
ceph -s
Selanjutnya, kita akan segera membuat kumpulan untuk disk RBD:
ceph osd pool create kube 32
ceph osd pool application enable kube rbd
Mari beralih ke cluster Kubernetes. Di sana pertama-tama kita akan menginstal driver Ceph CSI untuk RBD. Kami akan menginstal, seperti yang diharapkan, melalui Helm.
Kami menambahkan repositori dengan bagan, kami mendapatkan satu set variabel untuk bagan ceph-csi-rbd:
helm repo add ceph-csi https://ceph.github.io/csi-charts
helm inspect values ceph-csi/ceph-csi-rbd > cephrbd.yml
Sekarang Anda perlu mengisi file cephrbd.yml. Untuk melakukan ini, cari tahu ID cluster dan alamat IP monitor di Ceph:
ceph fsid # ΡΠ°ΠΊ ΠΌΡ ΡΠ·Π½Π°Π΅ΠΌ clusterID
ceph mon dump # Π° ΡΠ°ΠΊ ΡΠ²ΠΈΠ΄ΠΈΠΌ IP-Π°Π΄ΡΠ΅ΡΠ° ΠΌΠΎΠ½ΠΈΡΠΎΡΠΎΠ²
Kami memasukkan nilai yang diperoleh ke dalam file cephrbd.yml. Pada saat yang sama, kami mengaktifkan pembuatan kebijakan PSP (Kebijakan Keamanan Pod). Opsi di beberapa bagian plugin simpul ΠΈ penyedia sudah ada di file, dapat diperbaiki seperti gambar di bawah ini:
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
Selanjutnya, yang tersisa bagi kita hanyalah menginstal chart di cluster Kubernetes.
helm upgrade -i ceph-csi-rbd ceph-csi/ceph-csi-rbd -f cephrbd.yml -n ceph-csi-rbd --create-namespace
Hebat, driver RBD berfungsi!
Mari buat StorageClass baru di Kubernetes. Ini sekali lagi memerlukan sedikit mengutak-atik Ceph.
Kami membuat pengguna baru di Ceph dan memberinya hak untuk menulis ke pool kubus:
ceph auth get-or-create client.rbdkube mon 'profile rbd' osd 'profile rbd pool=kube'
Sekarang mari kita lihat kunci aksesnya masih ada:
ceph auth get-key client.rbdkube
Perintahnya akan menampilkan sesuatu seperti ini:
AQCO9NJbhYipKRAAMqZsnqqS/T8OYQX20xIa9A==
Mari tambahkan nilai ini ke Secret di cluster Kubernetes - di tempat yang kita perlukan kunci pengguna:
---
apiVersion: v1
kind: Secret
metadata:
name: csi-rbd-secret
namespace: ceph-csi-rbd
stringData:
# ΠΠ½Π°ΡΠ΅Π½ΠΈΡ ΠΊΠ»ΡΡΠ΅ΠΉ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈ Π΅Π³ΠΎ ΠΊΠ»ΡΡΡ, ΠΊΠ°ΠΊ ΡΠΊΠ°Π·Π°Π½ΠΎ Π²
# ΠΊΠ»Π°ΡΡΠ΅ΡΠ΅ Ceph. ID ΡΠ·Π΅ΡΠ° Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅ΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΏΡΠ»Ρ,
# ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡ Π² storage class
userID: rbdkube
userKey: <user-key>
Dan kami menciptakan rahasia kami:
kubectl apply -f secret.yaml
Selanjutnya, kita memerlukan manifes StorageClass seperti ini:
---
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, yang telah kami pelajari oleh tim ceph fsid, dan terapkan manifes ini ke cluster Kubernetes:
kubectl apply -f storageclass.yaml
Untuk memeriksa bagaimana cluster bekerja sama, mari buat PVC (Persistent Volume Claim) berikut:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: rbd-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: csi-rbd-sc
Mari kita lihat langsung bagaimana Kubernetes membuat volume yang diminta di Ceph:
kubectl get pvc
kubectl get pv
Segalanya tampak bagus! Seperti apa tampilannya di sisi Ceph?
Kami mendapatkan daftar volume di kumpulan dan melihat informasi tentang volume kami:
rbd ls -p kube
rbd -p kube info csi-vol-eb3d257d-8c6c-11ea-bff5-6235e7640653 # ΡΡΡ, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ ΠΆΠ΅, Π±ΡΠ΄Π΅Ρ Π΄ΡΡΠ³ΠΎΠΉ ID ΡΠΎΠΌΠ°, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠ΄Π°Π»Π° ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π°
Sekarang mari kita lihat cara kerja pengubahan ukuran volume RBD.
Ubah ukuran volume di manifes pvc.yaml menjadi 2Gi dan terapkan:
kubectl apply -f pvc.yaml
Mari kita tunggu hingga perubahan diterapkan dan lihat kembali ukuran volumenya.
rbd -p kube info csi-vol-eb3d257d-8c6c-11ea-bff5-6235e7640653
kubectl get pv
kubectl get pvc
Kami melihat bahwa ukuran PVC tidak berubah. Untuk mengetahui alasannya, Anda dapat menanyakan Kubernetes untuk deskripsi YAML tentang PVC:
kubectl get pvc rbd-pvc -o yaml
Inilah masalahnya:
pesan: Menunggu pengguna untuk (kembali) memulai pod untuk menyelesaikan pengubahan ukuran volume sistem file pada node. ketik: FileSystemResizePending
Artinya, disk telah berkembang, tetapi sistem file di dalamnya belum.
Untuk mengembangkan sistem file, Anda perlu memasang volume. Di negara kita, PVC/PV yang dibuat saat ini tidak digunakan dengan cara apa pun.
Kita bisa membuat Pod pengujian, contohnya seperti ini:
---
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
Dan sekarang mari kita lihat PVC:
kubectl get pvc
Ukurannya telah berubah, semuanya baik-baik saja.
Pada bagian pertama, kami bekerja dengan perangkat blok RBD (singkatan dari Rados Block Device), tetapi ini tidak dapat dilakukan jika layanan mikro yang berbeda perlu bekerja dengan disk ini secara bersamaan. CephFS jauh lebih cocok untuk bekerja dengan file daripada image disk.
Dengan menggunakan contoh cluster Ceph dan Kubernetes, kami akan mengonfigurasi CSI dan entitas lain yang diperlukan untuk bekerja dengan CephFS.
Mari kita dapatkan nilai dari grafik Helm baru yang kita perlukan:
helm inspect values ceph-csi/ceph-csi-cephfs > cephfs.yml
Sekali lagi Anda perlu mengisi file cephfs.yml. Seperti sebelumnya, perintah Ceph akan membantu:
ceph fsid
ceph mon dump
Isi file dengan nilai seperti ini:
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
Harap dicatat bahwa alamat monitor ditentukan dalam bentuk sederhana alamat:port. Untuk memasang cephfs pada sebuah node, alamat ini ditransfer ke modul kernel, yang belum mengetahui cara bekerja dengan protokol monitor v2.
Kami mengubah port untuk httpMetrics (Prometheus akan pergi ke sana untuk memantau metrik) agar tidak bertentangan dengan nginx-proxy, yang diinstal oleh Kubespray. Anda mungkin tidak memerlukan ini.
Instal diagram Helm di cluster Kubernetes:
helm upgrade -i ceph-csi-cephfs ceph-csi/ceph-csi-cephfs -f cephfs.yml -n ceph-csi-cephfs --create-namespace
Mari pergi ke penyimpanan data Ceph untuk membuat pengguna terpisah di sana. Dokumentasi menyatakan bahwa penyedia CephFS memerlukan hak akses administrator cluster. Tapi kami akan membuat pengguna terpisah fs dengan hak terbatas:
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'
Dan langsung saja kita lihat access key nya, nanti kita membutuhkannya :
ceph auth get-key client.fs
Mari kita buat Secret dan StorageClass terpisah.
Bukan hal baru, kita sudah melihatnya pada contoh RBD:
---
apiVersion: v1
kind: Secret
metadata:
name: csi-cephfs-secret
namespace: ceph-csi-cephfs
stringData:
# ΠΠ΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π»Ρ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ ΡΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΡΡ
ΡΠΎΠΌΠΎΠ²
adminID: fs
adminKey: <Π²ΡΠ²ΠΎΠ΄ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ>
Menerapkan manifes:
kubectl apply -f secret.yaml
Dan sekarang - StorageClass terpisah:
---
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
Mari kita isi di sini clusterID dan berlaku di Kubernetes:
kubectl apply -f storageclass.yaml
ΠΡΠΎΠ²Π΅ΡΠΊΠ°
Untuk memeriksanya, seperti pada contoh sebelumnya, mari kita buat PVC:
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: csi-cephfs-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
storageClassName: csi-cephfs-sc
Dan periksa keberadaan PVC/PV:
kubectl get pvc
kubectl get pv
Jika Anda ingin melihat file dan direktori di CephFS, Anda dapat memasang sistem file ini di suatu tempat. Misalnya saja seperti gambar dibawah ini.
Mari pergi ke salah satu node cluster Ceph dan lakukan tindakan berikut:
# Π’ΠΎΡΠΊΠ° ΠΌΠΎΠ½ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ
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
Tentu saja, memasang FS pada node Ceph seperti ini hanya cocok untuk tujuan pelatihan, itulah yang kami lakukan pada node kami
Dan terakhir, mari kita periksa cara kerja pengubahan ukuran volume dalam kasus CephFS. Mari kembali ke Kubernetes dan edit manifes kita untuk PVC - tingkatkan ukurannya di sana, misalnya, menjadi 7Gi.
Mari terapkan file yang telah diedit:
kubectl apply -f pvc.yaml
Mari kita lihat direktori yang terpasang untuk melihat perubahan kuota:
getfattr -n ceph.quota.max_bytes <ΠΊΠ°ΡΠ°Π»ΠΎΠ³-Ρ-Π΄Π°Π½Π½ΡΠΌΠΈ>
Agar perintah ini berfungsi, Anda mungkin perlu menginstal paket di sistem Anda attr.
Mata takut, tapi tangan melakukannya
Semua mantra dan manifes YAML yang panjang ini tampak rumit di permukaan, namun dalam praktiknya, siswa Slurm dapat menguasainya dengan cukup cepat.
Pada artikel ini kami tidak mendalami hutan - ada dokumentasi resmi untuk itu. Jika Anda tertarik dengan detail pengaturan penyimpanan Ceph dengan cluster Kubernetes, tautan berikut akan membantu:
Di kursus Slurm
Dan jika Anda lebih tertarik dengan penyimpanan data, maka daftarlah
Penulis artikel: Alexander Shvalov, seorang insinyur praktik
Sumber: www.habr.com