Ceph-д суурилсан хадгалах санг Kubernetes кластерт холбох бодит жишээ

Container Storage Interface (CSI) нь Kubernetes болон хадгалах системүүдийн нэгдсэн интерфейс юм. Бид аль хэдийн энэ талаар товч ярьсан гэж хэлсэн, мөн өнөөдөр бид CSI болон Ceph-ийн хослолыг нарийвчлан авч үзэх болно: бид хэрхэн яаж хийхийг харуулах болно Ceph хадгалах санг холбоно уу Kubernetes кластер руу.
Энэхүү нийтлэл нь ойлголтыг хөнгөвчлөх үүднээс бага зэрэг хялбаршуулсан бодит жишээнүүдийг өгдөг. Бид Ceph болон Kubernetes кластеруудыг суулгах, тохируулах талаар бодохгүй байна.

Энэ нь хэрхэн ажилладаг талаар та гайхаж байна уу?

Ceph-д суурилсан хадгалах санг Kubernetes кластерт холбох бодит жишээ

Тиймээс, таны хурууны үзүүр дээр байрлуулсан Kubernetes кластер байна, жишээлбэл, kubespray. Ойролцоох Ceph кластер ажиллаж байна - та үүнийг суулгаж болно, жишээлбэл, үүгээр тоглоомын дэвтрийн багц. Тэдгээрийн хооронд үйлдвэрлэхийн тулд дор хаяж 10 Гбит / с-ийн зурвасын өргөнтэй сүлжээ байх ёстой гэдгийг дурдах шаардлагагүй гэж найдаж байна.

Хэрэв танд энэ бүхэн байгаа бол явцгаая!

Эхлээд Ceph кластерын аль нэгэнд очиж, бүх зүйл эмх цэгцтэй байгаа эсэхийг шалгацгаая.

ceph health
ceph -s

Дараа нь бид нэн даруй RBD дискний сан үүсгэх болно:

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

Kubernetes кластер руу шилжье. Тэнд юуны түрүүнд бид RBD-д зориулсан Ceph CSI драйверийг суулгана. Бид хүлээгдэж буйгаар Helm-ээр дамжуулан суулгах болно.
Бид диаграм бүхий агуулахыг нэмж, ceph-csi-rbd диаграмын хувьсагчийн багцыг авдаг.

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

Одоо та cephrbd.yml файлыг бөглөх хэрэгтэй. Үүнийг хийхийн тулд Ceph дахь мониторуудын кластер ID болон IP хаягийг олж мэдээрэй.

ceph fsid  # так мы узнаем clusterID
ceph mon dump  # а так увидим IP-адреса мониторов

Бид олж авсан утгыг cephrbd.yml файлд оруулна. Үүний зэрэгцээ бид PSP бодлогыг (Pod Security Policies) үүсгэх боломжийг олгодог. Хэсэг дэх сонголтууд зангилаа залгаас и хангагч аль хэдийн файлд байгаа тул тэдгээрийг доор үзүүлсэн шиг засаж болно.

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

Дараа нь бидний хувьд Кубернетес кластерт диаграм суулгах л үлдлээ.

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

Гайхалтай, RBD драйвер ажилладаг!
Kubernetes-д шинэ StorageClass үүсгэцгээе. Энэ нь дахиад л Сефтэй бага зэрэг эргэлзэх шаардлагатай байна.

Бид Ceph-д шинэ хэрэглэгч үүсгэж, түүнд сан руу бичих эрхийг өгдөг куб:

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

Одоо хандалтын түлхүүр хэвээр байгааг харцгаая:

ceph auth get-key client.rbdkube

Энэ тушаал нь дараах зүйлийг гаргана.

AQCO9NJbhYipKRAAMqZsnqqS/T8OYQX20xIa9A==

Энэ утгыг Кубернетес кластер дахь нууцад хэрэгтэй газар нэмье Хэрэглэгчийн түлхүүр:

---
apiVersion: v1
kind: Secret
metadata:
  name: csi-rbd-secret
  namespace: ceph-csi-rbd
stringData:
  # Значения ключей соответствуют имени пользователя и его ключу, как указано в
  # кластере Ceph. ID юзера должен иметь доступ к пулу,
  # указанному в storage class
  userID: rbdkube
  userKey: <user-key>

Мөн бид нууцаа бий болгодог:

kubectl apply -f secret.yaml

Дараа нь бидэнд StorageClass манифест хэрэгтэй байна:

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

Бөглөх шаардлагатай кластер ID, үүнийг бид аль хэдийн багийнхан сурсан ceph fsid, мөн энэ манифестийг Kubernetes кластерт хэрэглээрэй:

kubectl apply -f storageclass.yaml

Кластерууд хэрхэн хамтран ажиллаж байгааг шалгахын тулд дараах PVC (Тогтвортой хэмжээний нэхэмжлэл) үүсгэцгээе:

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

Кубернетес хүссэн эзлэхүүнийг Ceph дээр хэрхэн бүтээсэнийг нэн даруй харцгаая:

kubectl get pvc
kubectl get pv

Бүх зүйл гайхалтай байх шиг байна! Энэ нь Цефийн талд ямар харагдаж байна вэ?
Бид усан сан дахь ботьуудын жагсаалтыг авч, эзлэхүүний талаарх мэдээллийг харна уу:

rbd ls -p kube
rbd -p kube info csi-vol-eb3d257d-8c6c-11ea-bff5-6235e7640653  # тут, конечно же, будет другой ID тома, который выдала предыдущая команда

Одоо RBD эзлэхүүний хэмжээг өөрчлөх нь хэрхэн ажилладагийг харцгаая.
pvc.yaml манифест дахь эзлэхүүний хэмжээг 2Gi болгож өөрчилнө үү:

kubectl apply -f pvc.yaml

Өөрчлөлтүүд хүчин төгөлдөр болох хүртэл хүлээгээд дууны хэмжээг дахин харцгаая.

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

kubectl get pv
kubectl get pvc

PVC-ийн хэмжээ өөрчлөгдөөгүй байгааг бид харж байна. Шалтгааныг мэдэхийн тулд та PVC-ийн YAML тайлбарыг Kubernetes-ээс асууж болно.

kubectl get pvc rbd-pvc -o yaml

Энд асуудал байна:

зурвас: Зангилааны файлын системийн хэмжээг өөрчлөхийн тулд хэрэглэгчийг pod-ыг (дахин) эхлүүлэхийг хүлээж байна. төрөл: FileSystemResizePending

Өөрөөр хэлбэл, диск томорсон боловч түүн дээрх файлын систем тийм ч том болоогүй байна.
Файлын системийг хөгжүүлэхийн тулд та эзлэхүүнийг холбох хэрэгтэй. Манай улсад үүсгэсэн PVC/PV нь одоогоор ямар ч байдлаар ашиглагдаагүй байна.

Бид туршилтын Pod үүсгэж болно, жишээ нь:

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

Одоо PVC-ийг харцгаая.

kubectl get pvc

Хэмжээ өөрчлөгдсөн, бүх зүйл хэвийн байна.

Эхний хэсэгт бид RBD блок төхөөрөмжтэй ажилласан (энэ нь Rados Block Device гэсэн үг), гэхдээ өөр өөр микро үйлчилгээнүүд энэ дисктэй нэгэн зэрэг ажиллах шаардлагатай бол үүнийг хийх боломжгүй. CephFS нь дискний дүрсээс илүүтэй файлуудтай ажиллахад илүү тохиромжтой.
Ceph болон Kubernetes кластеруудын жишээг ашиглан бид CSI болон бусад шаардлагатай байгууллагуудыг CephFS-тэй ажиллахад тохируулах болно.

Бидэнд хэрэгтэй шинэ Helm диаграмаас утгыг авцгаая:

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

Та cephfs.yml файлыг дахин бөглөх хэрэгтэй. Өмнөх шиг Ceph тушаалууд нь туслах болно:

ceph fsid
ceph mon dump

Файлыг дараах утгуудаар бөглөнө үү:

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

Мониторын хаягийг энгийн хаяг: порт хэлбэрээр зааж өгсөн болохыг анхаарна уу. Cephfs-ийг зангилаа дээр холбохын тулд эдгээр хаягуудыг цөмийн модуль руу шилжүүлдэг бөгөөд энэ нь v2 дэлгэцийн протоколтой хэрхэн ажиллахаа хараахан мэдэхгүй байна.
Бид Kubespray-ийн суулгасан nginx-proxy-тэй зөрчилдөхгүйн тулд httpMetrics портыг өөрчилдөг (Prometheus хэмжигдэхүүнийг хянахын тулд тэнд очно). Энэ танд хэрэггүй байж магадгүй.

Kubernetes кластерт Helm диаграмыг суулгана уу:

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

Тэнд тусдаа хэрэглэгч үүсгэхийн тулд Ceph мэдээллийн дэлгүүрт орцгооё. Баримт бичигт CephFS үйлчилгээ үзүүлэгч нь кластерийн администраторын хандалтын эрхийг шаарддаг гэж заасан. Гэхдээ бид тусдаа хэрэглэгч үүсгэх болно fs хязгаарлагдмал эрхтэй:

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'

Түүний хандалтын түлхүүрийг нэн даруй харцгаая, дараа нь бидэнд хэрэгтэй болно:

ceph auth get-key client.fs

Тусдаа Secret болон StorageClass үүсгэцгээе.
Шинэ зүйл биш, бид үүнийг RBD-ийн жишээн дээр аль хэдийн харсан:

---
apiVersion: v1
kind: Secret
metadata:
  name: csi-cephfs-secret
  namespace: ceph-csi-cephfs
stringData:
  # Необходимо для динамически создаваемых томов
  adminID: fs
  adminKey: <вывод предыдущей команды>

Манифестыг хэрэглэх нь:

kubectl apply -f secret.yaml

Одоо - тусдаа 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

Энд бөглөөд үзье кластер ID болон Kubernetes-д хамаарах:

kubectl apply -f storageclass.yaml

хяналт

Өмнөх жишээн дээрх шиг шалгахын тулд PVC хийцгээе:

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

Мөн PVC/PV байгаа эсэхийг шалгах:

kubectl get pvc
kubectl get pv

Хэрэв та CephFS доторх файлууд болон лавлахуудыг үзэхийг хүсвэл энэ файлын системийг хаа нэгтээ холбож болно. Жишээ нь доор үзүүлсэн шиг.

Ceph кластер зангилааны аль нэгэнд очиж дараах үйлдлүүдийг хийцгээе.

# Точка монтирования
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

Мэдээжийн хэрэг, ийм Ceph зангилаа дээр FS суурилуулах нь зөвхөн сургалтын зориулалтаар ашиглахад тохиромжтой. Сларм курсууд. Үйлдвэрлэлд хэн ч үүнийг хийхгүй гэж би бодохгүй байна; чухал файлуудыг санамсаргүйгээр устгах эрсдэл өндөр байдаг.

Эцэст нь CephFS-ийн хувьд эзлэхүүний хэмжээг өөрчлөх нь хэрхэн ажилладагийг шалгацгаая. Кубернетес рүү буцаж очоод PVC-д зориулсан манифестээ засъя - тэнд байгаа хэмжээг, жишээлбэл, 7Gi болгож нэмэгдүүлье.

Засварласан файлыг ашиглацгаая:

kubectl apply -f pvc.yaml

Квот хэрхэн өөрчлөгдсөнийг харахын тулд суулгасан лавлахыг харцгаая:

getfattr -n ceph.quota.max_bytes <каталог-с-данными>

Энэ тушаалыг ажиллуулахын тулд та багцыг систем дээрээ суулгах шаардлагатай байж магадгүй attr.

Нүд айдаг ч гар айдаг

Эдгээр бүх шившлэгүүд болон урт YAML илрэлүүд нь өнгөн дээрээ төвөгтэй мэт боловч практик дээр Slurm оюутнууд тэдгээрийг маш хурдан ойлгодог.
Энэ нийтлэлд бид ширэнгэн ой руу гүнзгий ороогүй - үүнд зориулсан албан ёсны баримт бичиг байдаг. Хэрэв та Kubernetes кластертай Ceph хадгалах санг тохируулах талаар дэлгэрэнгүй сонирхож байгаа бол эдгээр холбоосууд туслах болно:

Эзлэхүүнтэй ажиллах Кубернетесийн ерөнхий зарчим
RBD баримт бичиг
Ceph-ийн үүднээс RBD болон Kubernetes-ийг нэгтгэх
CSI-ийн үүднээс RBD болон Kubernetes-ийг нэгтгэх
Ерөнхий CephFS баримт бичиг
CSI-ийн үүднээс CephFS болон Kubernetes-ийг нэгтгэх

Slurm курс дээр Кубернетес бааз Та бага зэрэг цааш явж, CephFS-ийг файл хадгалах газар болгон ашиглах бодит програмыг Kubernetes-д байрлуулж болно. GET/POST хүсэлтээр дамжуулан та Ceph руу файл дамжуулах, хүлээн авах боломжтой болно.

Хэрэв та өгөгдөл хадгалахыг илүү сонирхож байгаа бол бүртгүүлнэ үү Цефийн тухай шинэ курс. Бета туршилт үргэлжилж байх үед курсийг хөнгөлөлттэй үнээр авах боломжтой бөгөөд та түүний агуулгад нөлөөлж болно.

Өгүүллийн зохиогч: Александр Швалов, дадлагажигч инженер Саутбридж, Мэргэшсэн Kubernetes администратор, Slurm курсуудын зохиогч, хөгжүүлэгч.

Эх сурвалж: www.habr.com