Hagnýtt dæmi um að tengja Ceph-undirstaða geymslu við Kubernetes þyrping

Container Storage Interface (CSI) er sameinað tengi milli Kubernetes og geymslukerfa. Við höfum þegar rætt það stuttlega sagt, og í dag munum við skoða nánar samsetningu CSI og Ceph: við munum sýna hvernig tengja Ceph geymslu til Kubernetes klasans.
Greinin gefur raunveruleg, þó aðeins einfölduð dæmi til að auðvelda skynjun. Við íhugum ekki að setja upp og stilla Ceph og Kubernetes klasa.

Ertu að spá í hvernig það virkar?

Hagnýtt dæmi um að tengja Ceph-undirstaða geymslu við Kubernetes þyrping

Þannig að þú ert með Kubernetes þyrping innan seilingar, útbýður, til dæmis, kubespray. Það er Ceph þyrping að vinna í nágrenninu - þú getur líka sett hann upp, til dæmis með þessu sett af leikbókum. Ég vona að það þurfi ekki að taka fram að til framleiðslu á milli þeirra þarf að vera net með bandbreidd sem er að minnsta kosti 10 Gbit/s.

Ef þú hefur allt þetta, þá skulum við fara!

Fyrst skulum við fara í einn af Ceph klasahnútunum og athuga hvort allt sé í lagi:

ceph health
ceph -s

Næst munum við strax búa til laug fyrir RBD diska:

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

Við skulum halda áfram að Kubernetes klasanum. Þar munum við fyrst og fremst setja upp Ceph CSI rekla fyrir RBD. Við munum setja upp, eins og búist var við, í gegnum Helm.
Við bætum við geymslu með myndriti, við fáum sett af breytum fyrir ceph-csi-rbd töfluna:

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

Nú þarftu að fylla út cephrbd.yml skrána. Til að gera þetta, finndu út klasaauðkenni og IP tölur skjáa í Ceph:

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

Við sláum inn gildin sem fengust í cephrbd.yml skrána. Á sama tíma gerum við kleift að búa til PSP stefnur (Pod Security Policies). Valmöguleikar í köflum nodeplugin и útvegsaðili þegar í skránni er hægt að leiðrétta þær eins og sýnt er hér að neðan:

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

Næst er allt sem eftir er fyrir okkur að setja upp töfluna í Kubernetes klasanum.

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

Frábært, RBD bílstjórinn virkar!
Búum til nýjan StorageClass í Kubernetes. Þetta krefst aftur smá fiktunar við Ceph.

Við búum til nýjan notanda í Ceph og gefum honum réttindi til að skrifa í sundlaugina teningur:

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

Nú skulum við sjá að aðgangslykillinn er enn til staðar:

ceph auth get-key client.rbdkube

Skipunin mun gefa út eitthvað á þessa leið:

AQCO9NJbhYipKRAAMqZsnqqS/T8OYQX20xIa9A==

Við skulum bæta þessu gildi við Secret í Kubernetes klasanum - þar sem við þurfum á því að halda notanda lykill:

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

Og við búum til leyndarmál okkar:

kubectl apply -f secret.yaml

Næst þurfum við StorageClass upplýsingaskrá eitthvað á þessa leið:

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

Þarf að fylla út clusterID, sem við höfum þegar lært af liðinu ceph fsid, og notaðu þessa upplýsingaskrá á Kubernetes klasann:

kubectl apply -f storageclass.yaml

Til að athuga hvernig klasarnir vinna saman skulum við búa til eftirfarandi PVC (Persistent Volume Claim):

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

Við skulum sjá strax hvernig Kubernetes bjó til umbeðið bindi í Ceph:

kubectl get pvc
kubectl get pv

Allt virðist vera frábært! Hvernig lítur þetta út á Ceph hliðinni?
Við fáum lista yfir bindi í sundlauginni og skoðum upplýsingar um magn okkar:

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

Nú skulum við sjá hvernig stærð RBD hljóðstyrks virkar.
Breyttu rúmmálsstærðinni í pvc.yaml upplýsingaskránni í 2Gi og notaðu það:

kubectl apply -f pvc.yaml

Bíðum eftir að breytingarnar taki gildi og skoðum hljóðstyrkstærðina aftur.

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

kubectl get pv
kubectl get pvc

Við sjáum að stærð PVC hefur ekki breyst. Til að komast að því hvers vegna geturðu leitað til Kubernetes um YAML lýsingu á PVC:

kubectl get pvc rbd-pvc -o yaml

Hér er vandamálið:

skilaboð: Bíður eftir því að notandi (endur)ræsi hólf til að ljúka við að breyta stærð skráarkerfis á hljóðstyrk á hnút. gerð: FileSystemResizePending

Það er að segja að diskurinn hefur stækkað en skráarkerfið á honum ekki.
Til að stækka skráarkerfið þarftu að setja hljóðstyrkinn upp. Í okkar landi er búið til PVC / PV sem stendur ekki notað á nokkurn hátt.

Við getum búið til test Pod, til dæmis svona:

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

Og nú skulum við líta á PVC:

kubectl get pvc

Stærðin hefur breyst, allt er í lagi.

Í fyrsta hlutanum unnum við með RBD blokkartækið (það stendur fyrir Rados Block Device), en það er ekki hægt að gera það ef mismunandi örþjónustur þurfa að vinna með þennan disk samtímis. CephFS hentar miklu betur til að vinna með skrár en diskamyndir.
Með því að nota dæmið um Ceph og Kubernetes klasa munum við stilla CSI og aðrar nauðsynlegar einingar til að vinna með CephFS.

Við skulum fá gildin úr nýja Helm töflunni sem við þurfum:

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

Aftur þarftu að fylla út cephfs.yml skrána. Eins og áður munu Ceph skipanir hjálpa:

ceph fsid
ceph mon dump

Fylltu út skrána með gildum eins og þessum:

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

Vinsamlegast athugaðu að netföng skjás eru tilgreind í einföldu formi address:port. Til að tengja cephfs á hnút eru þessi vistföng flutt yfir í kjarnaeininguna, sem veit ekki enn hvernig á að vinna með v2 skjásamskiptareglunum.
Við breytum gáttinni fyrir httpMetrics (Prometheus mun fara þangað til að fylgjast með mæligildum) þannig að hún stangist ekki á við nginx-proxy, sem er sett upp af Kubespray. Þú gætir þurft þetta ekki.

Settu upp Helm töfluna í Kubernetes klasanum:

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

Förum í Ceph gagnageymsluna til að búa til sérstakan notanda þar. Í skjölunum kemur fram að CephFS veitir krefst aðgangsréttinda klasastjórnanda. En við munum búa til sérstakan notanda fs með takmörkuðum réttindum:

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'

Og við skulum líta strax á aðgangslykil hans, við munum þurfa hann síðar:

ceph auth get-key client.fs

Búum til aðskilið Secret og StorageClass.
Ekkert nýtt, við höfum þegar séð þetta í dæminu um RBD:

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

Notkun upplýsingaskrárinnar:

kubectl apply -f secret.yaml

Og nú - sérstakur geymsluflokkur:

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

Við skulum fylla það út hér clusterID og á við í Kubernetes:

kubectl apply -f storageclass.yaml

Проверка

Til að athuga, eins og í fyrra dæmi, skulum við búa til PVC:

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

Og athugaðu tilvist PVC / PV:

kubectl get pvc
kubectl get pv

Ef þú vilt skoða skrár og möppur í CephFS geturðu tengt þetta skráarkerfi einhvers staðar. Til dæmis eins og sýnt er hér að neðan.

Við skulum fara í einn af Ceph klasahnútunum og framkvæma eftirfarandi aðgerðir:

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

Að setja FS á Ceph hnút eins og þennan hentar auðvitað aðeins í þjálfunarskyni, sem er það sem við gerum á okkar Slurm námskeið. Ég held að enginn myndi gera þetta í framleiðslu; það er mikil hætta á að eyða mikilvægum skrám fyrir slysni.

Og að lokum skulum við athuga hvernig hlutirnir virka við að breyta stærð rúmmáls þegar um CephFS er að ræða. Snúum okkur aftur til Kubernetes og breytum upplýsingaskránni okkar fyrir PVC - aukum stærðina þar, til dæmis í 7Gi.

Við skulum beita breyttu skránni:

kubectl apply -f pvc.yaml

Við skulum líta á uppsettu möppuna til að sjá hvernig kvótinn hefur breyst:

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

Til að þessi skipun virki gætirðu þurft að setja upp pakkann á vélinni þinni attr.

Augun eru hrædd, en hendurnar gera það

Allir þessir galdrar og löngu YAML birtingarmyndir virðast flóknar á yfirborðinu, en í reynd ná Slurm-nemendur þeim nokkuð fljótt.
Í þessari grein fórum við ekki djúpt inn í frumskóginn - það eru til opinber skjöl fyrir því. Ef þú hefur áhuga á upplýsingum um að setja upp Ceph geymslu með Kubernetes klasa, munu þessir tenglar hjálpa:

Almennar reglur um að Kubernetes vinnur með bindi
RBD skjöl
Að samþætta RBD og Kubernetes frá Ceph sjónarhorni
Samþætting RBD og Kubernetes frá CSI sjónarhorni
Almenn CephFS skjöl
Að samþætta CephFS og Kubernetes frá CSI sjónarhorni

Á Slurm námskeiðinu Kubernetes stöð þú getur farið aðeins lengra og sett upp alvöru forrit í Kubernetes sem mun nota CephFS sem skráargeymslu. Í gegnum GET/POST beiðnir muntu geta flutt skrár til og tekið á móti þeim frá Ceph.

Og ef þú hefur meiri áhuga á gagnageymslu, skráðu þig þá fyrir nýtt námskeið um Ceph. Á meðan beta prófið stendur yfir er hægt að fá námskeiðið með afslætti og þú getur haft áhrif á innihald þess.

Höfundur greinarinnar: Alexander Shvalov, starfandi verkfræðingur Southbridge, Löggiltur Kubernetes stjórnandi, höfundur og þróunaraðili Slurm námskeiða.

Heimild: www.habr.com