Un esempiu praticu di cunnette l'almacenamiento basatu in Ceph à un cluster Kubernetes

Container Storage Interface (CSI) hè una interfaccia unificata trà Kubernetes è sistemi di almacenamento. L'avemu digià parlatu brevemente dettu, è oghje avemu da piglià un ochju più vicinu à a cumminazzioni di CSI è Ceph: avemu da vede cumu cunnette l'almacenamiento Ceph à u cluster Kubernetes.
L'articulu furnisce esempi reali, ma ligeramente simplificati per facilità di percepzioni. Ùn avemu micca cunsideratu installà è cunfigurà cluster Ceph è Kubernetes.

Vi dumandate cumu funziona?

Un esempiu praticu di cunnette l'almacenamiento basatu in Ceph à un cluster Kubernetes

Dunque, avete un cluster Kubernetes à a vostra manu, implementatu, per esempiu, kubespray. Ci hè un cluster Ceph chì travaglia vicinu - pudete ancu stallà, per esempiu, cun questu un inseme di playbooks. Spergu chì ùn ci hè micca bisognu di mintuvà chì per a produzzione trà elli deve esse una reta cù una larghezza di banda di almenu 10 Gbit/s.

Sì avete tuttu questu, andemu !

Prima, andemu à unu di i nodi di cluster Ceph è verificate chì tuttu hè in ordine:

ceph health
ceph -s

In seguitu, creeremu immediatamente una piscina per i dischi RBD:

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

Passemu à u cluster Kubernetes. Quì, prima di tuttu, installemu u driver Ceph CSI per RBD. Stallaremu, cum'è previstu, attraversu Helm.
Aghjunghjemu un repository cù un graficu, avemu un settore di variàbili per u graficu ceph-csi-rbd:

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

Avà vi tocca à compie u schedariu cephrbd.yml. Per fà questu, scopre l'ID di cluster è l'indirizzi IP di i monitori in Ceph:

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

Insememu i valori ottenuti in u schedariu cephrbd.yml. À u listessu tempu, attivemu a creazione di pulitiche PSP (Pod Security Policies). Opzioni in sezzioni nodeplugin и prestatore digià in u schedariu, ponu esse curretti cum'è mostra quì sottu:

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

In seguitu, tuttu ciò chì ferma per noi hè di installà u graficu in u cluster Kubernetes.

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

Grande, u driver RBD funziona!
Creemu una nova StorageClass in Kubernetes. Questu hè ancu bisognu di un pocu di tinkering cù Ceph.

Creemu un novu utilizatore in Ceph è li dete i diritti per scrive à a piscina cubu:

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

Avà vedemu chì a chjave d'accessu hè sempre quì:

ceph auth get-key client.rbdkube

U cumandimu hà da pruduce qualcosa cum'è questu:

AQCO9NJbhYipKRAAMqZsnqqS/T8OYQX20xIa9A==

Aghjunghjemu stu valore à Secret in u cluster Kubernetes - induve avemu bisognu UserKey:

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

E creemu u nostru sicretu:

kubectl apply -f secret.yaml

Dopu, avemu bisognu di un manifestu StorageClass qualcosa cum'è questu:

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

Hè bisognu à esse cumpletu clusterID, chì avemu digià amparatu da a squadra ceph fsid, è applicà stu manifestu à u cluster Kubernetes:

kubectl apply -f storageclass.yaml

Per verificà cumu i clusters funzionanu inseme, creemu u seguente PVC (Persistent Volume Claim):

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

Videmu immediatamente cumu Kubernetes hà creatu u voluminu dumandatu in Ceph:

kubectl get pvc
kubectl get pv

Tuttu pare esse grande! Chì pare questu da u latu di Ceph?
Avemu una lista di volumi in a piscina è vede l'infurmazioni nantu à u nostru voluminu:

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

Avà vedemu cumu resize un voluminu RBD funziona.
Cambia a dimensione di u voluminu in u manifestu pvc.yaml à 2Gi è appricà:

kubectl apply -f pvc.yaml

Aspittemu chì i cambiamenti sò efficaci è fighjemu di novu a dimensione di u voluminu.

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

kubectl get pv
kubectl get pvc

Avemu vistu chì a dimensione di PVC ùn hà micca cambiatu. Per sapè perchè, pudete dumandà à Kubernetes una descrizzione YAML di u PVC:

kubectl get pvc rbd-pvc -o yaml

Eccu u prublema:

missaghju: Aspittendu chì l'utilizatore (ri) principia un pod per finisce u ridimensionamentu di u sistema di fugliale di u voluminu nantu à u node. tipu: FileSystemResizePending

Vale à dì, u discu hè crisciutu, ma u sistema di schedari ùn hà micca.
Per fà cresce u sistema di fugliale, avete bisognu di muntà u voluminu. In u nostru paese, u PVC / PV creatu ùn hè micca usatu in ogni modu.

Pudemu creà un Pod di prova, per esempiu cusì:

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

E ora fighjemu u PVC:

kubectl get pvc

A taglia hè cambiata, tuttu hè bè.

In a prima parte, avemu travagliatu cù u dispositivu di bloccu RBD (suppone Rados Block Device), ma questu ùn pò micca esse fattu se diversi microservizii anu bisognu di travaglià cù stu discu simultaneamente. CephFS hè assai megliu adattatu per travaglià cù i schedari piuttostu chè l'imaghjini di discu.
Utilizendu l'esempiu di i cluster Ceph è Kubernetes, cunfiguremu CSI è altre entità necessarie per travaglià cù CephFS.

Pigliamu i valori da u novu graficu Helm chì avemu bisognu:

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

In novu, avete bisognu à riempie u schedariu cephfs.yml. Cum'è prima, i cumandamenti Ceph aiutanu:

ceph fsid
ceph mon dump

Riempite u schedariu cù valori cum'è questu:

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

Per piacè nutate chì l'indirizzi di u monitoru sò specificati in a forma simplice indirizzu:port. Per muntà cephfs nantu à un node, questi indirizzi sò passati à u modulu di u kernel, chì ùn sapi ancu cumu travaglià cù u protocolu di monitor v2.
Cambiamu u portu per httpMetrics (Prometheus andarà quì per monitorà metriche) per ùn cunflittu cù nginx-proxy, chì hè stallatu da Kubespray. Ùn pudete micca bisognu di questu.

Installa u graficu Helm in u cluster Kubernetes:

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

Andemu à a tenda di dati Ceph per creà un utilizatore separatu. A documentazione dichjara chì u CephFS furnisce i diritti di accessu di l'amministratore di u cluster. Ma avemu da creà un utilizatore separatu fs cù diritti limitati:

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'

È fighjemu subitu à a so chjave d'accessu, avemu bisognu dopu:

ceph auth get-key client.fs

Creemu Secret è StorageClass separati.
Nunda di novu, avemu digià vistu questu in l'esempiu di RBD:

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

Applicà u manifestu:

kubectl apply -f secret.yaml

È avà - una StorageClass separata:

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

Fighjemu quì clusterID è applicabile in Kubernetes:

kubectl apply -f storageclass.yaml

pirmittennu

Per verificà, cum'è in l'esempiu precedente, creamu un PVC:

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

È verificate a presenza di PVC / PV:

kubectl get pvc
kubectl get pv

Se vulete guardà i fugliali è i cartulari in CephFS, pudete muntà stu sistema di fugliale in qualchì locu. Per esempiu, cum'è mostra sottu.

Andemu à unu di i nodi di cluster Ceph è eseguite e seguenti azzioni:

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

Di sicuru, a muntagna FS nantu à un node Ceph cum'è questu hè adattatu solu per scopi di furmazione, chì hè ciò chì facemu nantu à u nostru Corsi di Slurm. Ùn pensu micca chì nimu faria questu in a produzzione; ci hè un altu risicu di sguassà accidentalmente i schedarii impurtanti.

È infine, cuntrollemu cumu si travaglianu e cose cù volumi di ridimensionamentu in u casu di CephFS. Riturnemu à Kubernetes è edità u nostru manifestu per PVC - cresce a dimensione quì, per esempiu, à 7Gi.

Applichemu u schedariu editatu:

kubectl apply -f pvc.yaml

Fighjemu u cartulare muntatu per vede cumu a quota hà cambiatu:

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

Per fà stu cumandamentu, pudete bisognu di stallà u pacchettu in u vostru sistema attr.

L'ochji anu a paura, ma e mani

Tutti questi incantesimi è longu manifesti YAML parenu cumplicati nantu à a superficia, ma in pratica, i studienti di Slurm li piglianu abbastanza rapidamente.
In questu articulu ùn avemu micca andatu in a jungla - ci hè una documentazione ufficiale per quessa. Sè site interessatu in i dettagli di a cunfigurazione di l'almacenamiento Ceph cù un cluster Kubernetes, sti ligami aiutanu:

Principii generali di Kubernetes chì travaglia cù volumi
Documentazione RBD
Integrazione di RBD è Kubernetes da una perspettiva Ceph
Integrazione di RBD è Kubernetes da una perspettiva CSI
Documentazione generale di CephFS
Integrazione di CephFS è Kubernetes da una perspettiva CSI

Nantu à u corsu Slurm Base Kubernetes pudete andà un pocu più luntanu è implementà una vera applicazione in Kubernetes chì utilizerà CephFS cum'è almacenamiento di schedari. Per mezu di e dumande GET / POST puderete trasfiriri i fugliali è riceveli da Ceph.

È s'è vo site più interessatu in u almacenamentu di dati, allora iscrive novu cursu nantu à Ceph. Mentre a prova beta hè in corso, u corsu pò esse acquistatu cù un scontu è pudete influenzà u so cuntenutu.

Autore di l 'articulu: Alexander Shvalov, ingegnere praticanti ponte sud, Certified Kubernetes Administrator, autore è sviluppatore di corsi Slurm.

Source: www.habr.com