Contoh praktis menghubungkan penyimpanan berbasis Ceph ke cluster Kubernetes

Container Storage Interface (CSI) adalah antarmuka terpadu antara Kubernetes dan sistem penyimpanan. Kami sudah membicarakannya secara singkat diceritakan, dan hari ini kita akan melihat lebih dekat kombinasi CSI dan Ceph: kami akan menunjukkan caranya menghubungkan penyimpanan Ceph ke kluster Kubernetes.
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?

Contoh praktis menghubungkan penyimpanan berbasis Ceph ke cluster Kubernetes

Jadi, Anda memiliki cluster Kubernetes di ujung jari Anda, yang diterapkan, misalnya, kubespray. Ada cluster Ceph yang berfungsi di dekatnya - Anda juga dapat menginstalnya, misalnya dengan ini satu set buku pedoman. Saya harap tidak perlu disebutkan bahwa untuk produksi di antara mereka harus ada jaringan dengan bandwidth minimal 10 Gbit/s.

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 Kursus lumpur. Saya tidak berpikir ada orang yang akan melakukan ini dalam produksi; ada risiko tinggi menghapus file penting secara tidak sengaja.

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:

Prinsip umum Kubernetes bekerja dengan volume
Dokumentasi RBD
Mengintegrasikan RBD dan Kubernetes dari perspektif Ceph
Mengintegrasikan RBD dan Kubernetes dari perspektif CSI
Dokumentasi Umum CephFS
Mengintegrasikan CephFS dan Kubernetes dari perspektif CSI

Di kursus Slurm Basis Kubernetes Anda dapat melangkah lebih jauh dan menerapkan aplikasi nyata di Kubernetes yang akan menggunakan CephFS sebagai penyimpanan file. Melalui permintaan GET/POST Anda akan dapat mentransfer file dan menerimanya dari Ceph.

Dan jika Anda lebih tertarik dengan penyimpanan data, maka daftarlah kursus baru di Ceph. Saat pengujian beta sedang berlangsung, kursus dapat diperoleh dengan harga diskon dan Anda dapat memengaruhi kontennya.

Penulis artikel: Alexander Shvalov, seorang insinyur praktik Southbridge, Administrator Kubernetes Bersertifikat, penulis dan pengembang kursus Slurm.

Sumber: www.habr.com