Намунаи амалии пайваст кардани нигаҳдории дар асоси Ceph ба кластери Kubernetes

Интерфейси нигаҳдории контейнер (CSI) интерфейси ягонаи байни Kubernetes ва системаҳои нигоҳдорӣ мебошад. Мо аллакай дар ин бора ба таври мухтасар сухан ронда будем гуфт, ва имрӯз мо омезиши CSI ва Ceph-ро бодиққат дида мебароем: мо нишон медиҳем, ки чӣ тавр нигоҳдории Ceph пайваст кунед ба кластери Кубернетес.
Дар мақола мисолҳои воқеӣ, ҳарчанд каме соддакардашуда барои осонии дарк оварда шудаанд. Мо насб ва конфигуратсияи кластерҳои Ceph ва Kubernetes-ро баррасӣ намекунем.

Оё шумо ҳайронед, ки он чӣ гуна кор мекунад?

Намунаи амалии пайваст кардани нигаҳдории дар асоси Ceph ба кластери Kubernetes

Ҳамин тавр, шумо кластери Kubernetes дар сарангушти худ доред, ки ҷойгир карда шудааст, масалан, кубеспрай. Дар наздикии он кластери Ceph кор мекунад - шумо метавонед онро, масалан, бо ин насб кунед маҷмӯи китобҳои бозӣ. Умедворам, ба ёдоварӣ лозим нест, ки барои истеҳсоли байни онҳо бояд шабакаи дорои маҷрои на камтар аз 10 Гбит/с бошад.

Агар шумо ин ҳама дошта бошед, биёед!

Аввалан, биёед ба яке аз гиреҳҳои кластери Ceph равем ва санҷед, ки ҳама чиз дуруст аст:

ceph health
ceph -s

Минбаъд, мо фавран барои дискҳои RBD ҳавз эҷод мекунем:

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

Биёед ба кластери Кубернетес гузарем. Дар он ҷо, пеш аз ҳама, мо драйвери Ceph CSI -ро барои RBD насб мекунем. Мо, тавре ки интизор мерафт, тавассути 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 -ро пур кунед. Барои ин кор, ID кластер ва IP суроғаҳои мониторҳоро дар Ceph пайдо кунед:

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

Баъдан, барои мо танҳо насб кардани диаграмма дар кластери Kubernetes боқӣ мемонад.

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

Биёед ин арзишро ба Secret дар кластери Kubernetes илова кунем - дар ҷое ки ба мо лозим аст UserKey:

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

Пур кардан лозим аст clusterID, ки мо онро аллакай коллектив омухтаем 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

Ба назар чунин мерасад, ки ҳама чиз олӣ аст! Ин дар тарафи Ceph чӣ гуна аст?
Мо рӯйхати ҷилдҳоро дар ҳавз мегирем ва маълумотро дар бораи ҳаҷми мо мебинем:

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 тағйир наёфтааст. Барои фаҳмидани сабаб, шумо метавонед аз Кубернетес барои тавсифи YAML-и PVC пурсед:

kubectl get pvc rbd-pvc -o yaml

Ин аст мушкилот:

паём: Мунтазири он аст, ки корбар як паҳлӯро (аз нав) оғоз кунад, то андозаи системаи файлиро тағир диҳад. навъи: 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 кор кунад.
Мо портро барои httpMetrics иваз мекунем (Прометей ба он ҷо барои мониторинги ченакҳо меравад) то он бо nginx-proxy, ки аз ҷониби Kubespray насб шудааст, мухолифат накунад. Шояд ба шумо ин лозим набошад.

Диаграммаи Helm -ро дар кластери Kubernetes насб кунед:

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

Биёед онро дар ин ҷо пур кунем clusterID ва дар 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

Албатта, насб кардани FS дар гиреҳи Ceph ба монанди ин танҳо барои мақсадҳои омӯзишӣ мувофиқ аст, ки мо он чизеро, ки мо дар худ мекунем. Курсҳои шикам. Ман фикр намекунам, ки касе ин корро дар истеҳсолот анҷом диҳад; хатари тасодуфан нест кардани файлҳои муҳим вуҷуд дорад.

Ва дар ниҳоят, биёед бубинем, ки корҳо бо тағир додани андозаи ҳаҷмҳо дар сурати CephFS чӣ гуна кор мекунанд. Биёед ба Кубернетес баргардем ва манифести худро барои PVC таҳрир кунем - андозаи он ҷоро, масалан, то 7Gi зиёд кунед.

Биёед файли таҳриршударо татбиқ кунем:

kubectl apply -f pvc.yaml

Биёед ба феҳристи насбшуда назар андозем, то бубинем, ки квота чӣ гуна тағир ёфтааст:

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

Барои кор кардани ин фармон, шумо бояд бастаро дар системаи худ насб кунед аттр.

Чашм метарсад, аммо дастҳо метарсанд

Ҳамаи ин имлоҳо ва зуҳуроти тӯлонии YAML дар рӯи замин мураккаб ба назар мерасанд, аммо дар амал, донишҷӯёни Slurm онҳоро хеле зуд ба даст меоранд.
Дар ин мақола мо ба ҷангал амиқ нарафтем - барои ин ҳуҷҷатҳои расмӣ мавҷуданд. Агар шумо ба тафсилоти таъсиси нигаҳдории Ceph бо кластери Kubernetes таваҷҷӯҳ дошта бошед, ин истинодҳо кӯмак хоҳанд кард:

Принсипҳои умумии Kubernetes кор бо ҳаҷми
Ҳуҷҷатҳои RBD
Интегратсияи RBD ва Kubernetes аз нуқтаи назари Ceph
Интегратсияи RBD ва Kubernetes аз нуқтаи назари CSI
Ҳуҷҷатҳои умумии CephFS
Интегратсияи CephFS ва Kubernetes аз нуқтаи назари CSI

Дар рафти Slurm Пойгоҳи Кубернетес шумо метавонед каме дуртар равед ва як барномаи воқеиро дар Kubernetes ҷойгир кунед, ки CephFS-ро ҳамчун нигаҳдории файл истифода мебарад. Тавассути дархостҳои GET/POST шумо метавонед файлҳоро ба Ceph интиқол диҳед ва онҳоро қабул кунед.

Ва агар шумо бештар ба нигоҳдории маълумот таваҷҷӯҳ дошта бошед, пас ба қайд гиред курси нав дар бораи Ceph. Ҳангоме ки санҷиши бета идома дорад, курсро бо тахфиф дастрас кардан мумкин аст ва шумо метавонед ба мундариҷаи он таъсир расонед.

Муаллифи макола: Александр Швалов, инженери амалкунанда Саутбридж, Administrator Certified Kubernetes, муаллиф ва таҳиягари курсҳои Slurm.

Манбаъ: will.com