E praktescht Beispill fir Ceph-baséiert Späichere mat engem Kubernetes Cluster ze verbannen

Container Storage Interface (CSI) ass eng vereenegt Interface tëscht Kubernetes a Späichersystemer. Mir hu schonn kuerz doriwwer geschwat erzielt, an haut wäerte mir d'Kombinatioun vun CSI a Ceph méi no kucken: mir weisen wéi konnektéieren Ceph Stockage zum Kubernetes-Cluster.
Den Artikel liwwert richteg, awer liicht vereinfacht Beispiller fir d'Wahrnehmung einfach ze maachen. Mir betruechten net d'Installatioun an d'Konfiguratioun vun Ceph a Kubernetes Cluster.

Frot Dir Iech wéi et funktionnéiert?

E praktescht Beispill fir Ceph-baséiert Späichere mat engem Kubernetes Cluster ze verbannen

Also, Dir hutt e Kubernetes Stärekoup op Äre Fangerspëtzen, ofgebaut, zum Beispill, kubespray. Et gëtt e Ceph Stärekoup an der Géigend schaffen - Dir kënnt et och installéieren, zum Beispill, mat dësem eng Rei vu Spillbicher. Ech hoffen et ass net néideg ze ernimmen datt fir d'Produktioun tëscht hinnen e Netzwierk mat enger Bandbreedung vu mindestens 10 Gbit / s muss sinn.

Wann Dir dëst alles hutt, loosst eis goen!

Als éischt, loosst eis op ee vun de Ceph Cluster Node goen a kucken ob alles an der Rei ass:

ceph health
ceph -s

Als nächst wäerte mir direkt e Pool fir RBD Disks erstellen:

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

Loosst eis op de Kubernetes Cluster goen. Do wäerte mir als éischt de Ceph CSI Treiber fir RBD installéieren. Mir installéieren, wéi erwaart, duerch Helm.
Mir addéieren e Repository mat engem Diagramm, mir kréien eng Rei Variabelen fir de ceph-csi-rbd Diagramm:

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

Elo musst Dir d'cephrbd.yml Datei ausfëllen. Fir dëst ze maachen, entdeckt d'Cluster ID an d'IP Adresse vu Monitore am Ceph:

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

Mir gitt déi kritt Wäerter an der cephrbd.yml Datei. Zur selwechter Zäit aktivéiere mir d'Schafe vu PSP Politiken (Pod Security Policies). Optiounen an Rubriken nodeplugin и provisor schonn an der Datei, kënne se korrigéiert ginn wéi hei ënnendrënner:

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

Als nächst bleift alles fir eis d'Diagramm am Kubernetes Cluster z'installéieren.

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

Super, de RBD Chauffer funktionnéiert!
Loosst eis eng nei StorageClass zu Kubernetes erstellen. Dëst erfuerdert erëm e bëssen mat Ceph.

Mir kreéieren en neie Benotzer am Ceph a ginn him Rechter fir an de Pool ze schreiwen Kube:

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

Loosst eis elo kucken datt den Zougangsschlëssel nach ëmmer do ass:

ceph auth get-key client.rbdkube

De Kommando wäert esou eppes ausginn:

AQCO9NJbhYipKRAAMqZsnqqS/T8OYQX20xIa9A==

Loosst eis dëse Wäert op Secret am Kubernetes Cluster addéieren - wou mir et brauchen BenotzerKey:

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

A mir kreéieren eist Geheimnis:

kubectl apply -f secret.yaml

Als nächst brauche mir e StorageClass Manifest eppes wéi dat:

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

Muss ausgefëllt ginn ClusterID, déi mir scho vun der Equipe geléiert hunn ceph fsid, an applizéiert dëse Manifest op de Kubernetes Cluster:

kubectl apply -f storageclass.yaml

Fir ze kontrolléieren wéi d'Cluster zesumme schaffen, loosst eis de folgende PVC erstellen (Persistent Volume Claim):

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

Loosst eis direkt kucken wéi Kubernetes de ugefrote Volumen am Ceph erstallt huet:

kubectl get pvc
kubectl get pv

Alles schéngt super ze sinn! Wéi gesäit dat op der Ceph Säit aus?
Mir kréien eng Lëscht vu Bänn am Pool a kucken Informatiounen iwwer eise Volume:

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

Loosst eis elo kucken wéi d'Gréisst vun engem RBD Volumen funktionnéiert.
Ännert d'Volumengréisst am pvc.yaml Manifest op 2Gi an gëlt et:

kubectl apply -f pvc.yaml

Loosst eis waarden bis d'Ännerungen a Kraaft trieden a kucken d'Volumengréisst nach eng Kéier.

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

kubectl get pv
kubectl get pvc

Mir gesinn datt d'Gréisst vum PVC net geännert huet. Fir erauszefannen firwat, kënnt Dir Kubernetes ufroen fir eng YAML Beschreiwung vum PVC:

kubectl get pvc rbd-pvc -o yaml

Hei ass de Problem:

Message: Waart op de Benotzer fir e Pod (nei) unzefänken fir d'Gréisst vum Volumen um Node fäerdeg ze maachen. Typ: FileSystemResizePending

Dat ass, d'Disk ass gewuess, awer de Dateiesystem op et ass net.
Fir de Dateiesystem ze wuessen, musst Dir de Volume montéieren. An eisem Land gëtt de geschaafte PVC / PV de Moment op kee Fall benotzt.

Mir kënnen en Test Pod erstellen, zum Beispill esou:

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

An elo kucke mer op PVC:

kubectl get pvc

D'Gréisst ass geännert, alles ass gutt.

Am éischten Deel hu mir mam RBD Blockapparat geschafft (et steet fir Rados Block Device), awer dëst kann net gemaach ginn wann verschidde Mikroservicer gläichzäiteg mat dëser Disk musse schaffen. CephFS ass vill besser gëeegent fir mat Dateien ze schaffen anstatt Disk Biller.
Mat dem Beispill vu Ceph a Kubernetes Cluster konfiguréiere mir CSI an aner noutwendeg Entitéite fir mat CephFS ze schaffen.

Loosst eis d'Wäerter vun der neier Helm Chart kréien, déi mir brauchen:

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

Erëm musst Dir d'cephfs.yml Datei ausfëllen. Wéi virdrun, Ceph Kommandoen hëllefen:

ceph fsid
ceph mon dump

Fëllt d'Datei mat Wäerter aus wéi dës:

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

Notéiert w.e.g. datt d'Iwwerwaachungsadressen an der einfacher Form Adress:port uginn. Fir Cephfs op engem Node ze montéieren, ginn dës Adressen un de Kernelmodul iwwerginn, deen nach net weess wéi et mam v2 Monitor Protokoll funktionnéiert.
Mir änneren den Hafen fir httpMetrics (Prometheus wäert dohinner goen fir Metriken ze iwwerwaachen) sou datt et net mat nginx-Proxy ass, dee vu Kubespray installéiert ass. Dir braucht dat vläicht net.

Installéiert d'Helm Chart am Kubernetes Cluster:

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

Loosst eis an de Ceph Dategeschäft goen fir e separate Benotzer do ze kreéieren. D'Dokumentatioun seet datt de CephFS Provider Cluster Administrateur Zougangsrechter erfuerdert. Mä mir wäerten eng separat Benotzer schafen fs mat limitéierten Rechter:

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'

A loosst eis direkt säin Zougangsschlëssel kucken, mir brauchen et méi spéit:

ceph auth get-key client.fs

Loosst eis separat Secret a StorageClass erstellen.
Näischt Neies, mir hunn dat schonn am Beispill vu RBD gesinn:

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

Uwendung vum Manifest:

kubectl apply -f secret.yaml

An elo - eng separat 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

Loosst eis et hei ausfëllen ClusterID an applicabel an Kubernetes:

kubectl apply -f storageclass.yaml

Inspektioun

Fir ze kontrolléieren, wéi am virege Beispill, loosst eis e PVC erstellen:

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

A kontrolléiert d'Präsenz vu PVC / PV:

kubectl get pvc
kubectl get pv

Wann Dir Dateien a Verzeichnisser am CephFS kucke wëllt, kënnt Dir dëse Dateiesystem iergendwou montéieren. Zum Beispill wéi hei ënnendrënner.

Loosst eis op ee vun de Ceph Cluster Node goen an déi folgend Aktiounen ausféieren:

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

Natierlech ass de Montage FS op engem Ceph Node wéi dëst nëmme gëeegent fir Trainingszwecker, dat ass wat mir op eisem Slurm Coursen. Ech denken net datt iergendeen dëst an der Produktioun géif maachen; et ass en héije Risiko fir zoufälleg wichteg Dateien ze läschen.

A schliisslech, loosst eis kucken wéi d'Saachen funktionnéieren mat der Gréisst vun der Gréisst am Fall vu CephFS. Loosst eis zréck op Kubernetes an änneren eise Manifest fir PVC - vergréissert d'Gréisst do, zum Beispill, op 7Gi.

Loosst eis déi geännert Datei uwenden:

kubectl apply -f pvc.yaml

Loosst eis de montéierte Verzeechnes kucken fir ze kucken wéi d'Quote geännert huet:

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

Fir dëst Kommando ze schaffen, musst Dir vläicht de Package op Ärem System installéieren attr.

D'Ae fäerten, awer d'Hänn maachen

All dës Zauber a laang YAML Manifestatiounen schéngen op der Uewerfläch komplizéiert ze sinn, awer an der Praxis kréien d'Slurm Studenten zimlech séier d'Hänn.
An dësem Artikel si mir net déif an den Dschungel gaang - et gëtt offiziell Dokumentatioun dofir. Wann Dir un d'Detailer interesséiert sidd fir d'Ceph Storage mat engem Kubernetes Cluster opzestellen, dës Linken hëllefen:

Allgemeng Prinzipien vun Kubernetes mat Bänn schaffen
RBD Dokumentatioun
Integratioun vun RBD a Kubernetes aus enger Ceph Perspektiv
Integratioun vun RBD a Kubernetes aus enger CSI Perspektiv
Allgemeng CephFS Dokumentatioun
Integratioun CephFS a Kubernetes aus enger CSI Perspektiv

Op der Slurm Course Kubernetes Base Dir kënnt e bësse méi wäit goen an eng richteg Applikatioun a Kubernetes ofsetzen déi CephFS als Dateilagerung benotzt. Duerch GET/POST Ufroe kënnt Dir Dateien transferéieren an se vum Ceph kréien.

A wann Dir méi un Datelagerung interesséiert sidd, da mellt Iech un neie Cours op Ceph. Wärend de Beta-Test leeft, kann de Cours mat Remise kritt ginn an Dir kënnt säin Inhalt beaflossen.

Auteur vum Artikel: Alexander Shvalov, praktizéierend Ingenieur Southbridge, Zertifizéiert Kubernetes Administrator, Auteur an Entwéckler vun Slurm Coursen.

Source: will.com