Conto praktis nyambungkeun gudang basis Ceph ka klaster Kubernetes

Container Storage Interface (CSI) mangrupikeun antarmuka anu ngahijikeun antara Kubernetes sareng sistem panyimpenan. Kami parantos nyarios sakedap bébéja, sarta dinten ieu urang bakal nyandak katingal ngadeukeutan dina kombinasi CSI na Ceph: urang bakal némbongkeun kumaha nyambungkeun gudang Ceph ka klaster Kubernetes.
Artikel nyadiakeun conto nyata, sanajan rada saderhana pikeun betah persepsi. Kami henteu nganggap masang sareng ngonpigurasikeun klaster Ceph sareng Kubernetes.

Anjeun wondering kumaha gawéna?

Conto praktis nyambungkeun gudang basis Ceph ka klaster Kubernetes

Janten, anjeun gaduh klaster Kubernetes di ujung ramo anjeun, disebarkeun, contona, kubespray. Aya kluster Ceph anu damel caket dieu - anjeun ogé tiasa pasang, contona, kalayan ieu susunan playbooks. Abdi ngarepkeun teu kedah disebatkeun yén pikeun produksi antara aranjeunna kedah aya jaringan kalayan rubakpita sahenteuna 10 Gbit / s.

Upami anjeun gaduh sadayana ieu, hayu urang angkat!

Mimiti, hayu urang angkat ka salah sahiji titik klaster Ceph sareng pariksa yén sadayana aya dina urutan:

ceph health
ceph -s

Salajengna, urang bakal langsung nyiptakeun kolam renang pikeun disk RBD:

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

Hayu urang ngaléngkah ka klaster Kubernetes. Di dinya, mimitina, urang bakal masang supir Ceph CSI pikeun RBD. Urang bakal masang, saperti nu diharapkeun, ngaliwatan Helm.
Kami nambihan gudang kalayan bagan, kami nampi sakumpulan variabel pikeun bagan ceph-csi-rbd:

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

Ayeuna anjeun kedah ngeusian file cephrbd.yml. Jang ngalampahkeun ieu, panggihan ID klaster sareng alamat IP monitor di Ceph:

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

Urang asupkeun nilai diala kana file cephrbd.yml. Dina waktos anu sami, urang ngaktifkeun nyiptakeun kawijakan PSP (Pod Security Policies). Pilihan dina bagian nodeplugin и panyadia parantos aya dina file, aranjeunna tiasa dilereskeun sapertos anu dipidangkeun di handap ieu:

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

Salajengna, anu tetep pikeun urang nyaéta masang bagan dina klaster Kubernetes.

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

Hébat, supir RBD jalan!
Hayu urang nyieun StorageClass anyar dina Kubernetes. Ieu deui merlukeun saeutik tinkering kalawan Ceph.

Urang nyieun pamaké anyar dina Ceph sarta méré anjeunna hak nulis ka kolam renang nu kubus:

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

Ayeuna hayu urang tingali konci aksés masih aya:

ceph auth get-key client.rbdkube

Paréntah bakal kaluaran sapertos kieu:

AQCO9NJbhYipKRAAMqZsnqqS/T8OYQX20xIa9A==

Hayu urang tambahkeun nilai ieu Rahasia dina klaster Kubernetes - dimana urang peryogina userKey:

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

Sareng urang nyiptakeun rusiah urang:

kubectl apply -f secret.yaml

Salajengna, urang peryogi StorageClass manifest sapertos kieu:

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

Perlu dieusian clusterID, anu kami parantos diajar ku tim cepy fsid, sareng nerapkeun manifest ieu kana klaster Kubernetes:

kubectl apply -f storageclass.yaml

Pikeun mariksa kumaha klaster gawé bareng, hayu urang nyieun PVC handap (Persistent Volume Claim):

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

Hayu urang tingali kumaha Kubernetes nyiptakeun volume anu dipénta dina Ceph:

kubectl get pvc
kubectl get pv

Sagalana sigana hébat! Naon ieu kasampak kawas di sisi Ceph?
Kami nampi daptar volume di kolam renang sareng ningali inpormasi ngeunaan volume kami:

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

Ayeuna hayu urang tingali kumaha ngatur ukuran volume RBD jalan.
Robah ukuran polumeu dina manifest pvc.yaml ka 2Gi sareng nerapkeun:

kubectl apply -f pvc.yaml

Hayu urang ngadagoan parobahan mawa pangaruh jeung kasampak di ukuran volume deui.

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

kubectl get pv
kubectl get pvc

Urang nempo yén ukuran PVC teu robah. Pikeun milarian alesanana, anjeun tiasa naroskeun Kubernetes pikeun déskripsi YAML tina PVC:

kubectl get pvc rbd-pvc -o yaml

Ieu masalahna:

pesen: Ngadagoan pamaké pikeun (ulang) ngamimitian pod nepi ka rengse ukuran sistem file volume on node. ngetik: FileSystemResizePending

Nyaéta, disk parantos ningkat, tapi sistem file dina éta henteu.
Pikeun tumuwuh sistem file, Anjeun kudu masang polumeu. Di nagara urang, anu dijieun PVC / PV ayeuna teu dipaké dina sagala cara.

Urang tiasa ngadamel test Pod, contona sapertos kieu:

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

Ayeuna hayu urang nempo PVC:

kubectl get pvc

Ukuranna parantos robih, sadayana saé.

Dina bagian kahiji, urang digawekeun ku alat block RBD (eta nangtung pikeun Rados Blok Alat), tapi ieu teu bisa dipigawé lamun microservices béda kudu gawé bareng disk ieu sakaligus. CephFS langkung cocog pikeun damel sareng file tinimbang gambar disk.
Nganggo conto klaster Ceph sareng Kubernetes, urang bakal ngonpigurasikeun CSI sareng éntitas anu sanés pikeun damel sareng CephFS.

Hayu urang kéngingkeun nilai tina bagan Helm énggal anu urang peryogikeun:

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

Sakali deui anjeun kedah ngeusian file cephfs.yml. Sapertos sateuacanna, paréntah Ceph bakal ngabantosan:

ceph fsid
ceph mon dump

Eusian file kalayan nilai sapertos kieu:

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

Perhatikeun yén alamat monitor dieusian dina alamat formulir basajan: port. Pikeun masang cephfs dina node, alamat ieu ditransfer ka modul kernel, anu henteu acan terang kumaha jalanna sareng protokol monitor v2.
Urang ngarobah port pikeun httpMetrics (Prometheus bakal indit ka dinya pikeun monitoring metrics) meh teu konflik jeung nginx-proxy, nu dipasang ku Kubespray. Anjeun panginten henteu peryogi ieu.

Pasang bagan Helm dina klaster Kubernetes:

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

Hayu urang angkat ka toko data Ceph pikeun nyiptakeun pangguna anu misah di dinya. Dokuméntasi nyatakeun yén panyadia CephFS butuh hak aksés administrator klaster. Tapi urang bakal nyieun pamaké misah fs kalawan hak kawates:

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'

Sareng hayu urang tingali konci aksés na, urang peryogina engké:

ceph auth get-key client.fs

Hayu urang nyieun Rahasia misah jeung StorageClass.
Henteu aya anu énggal, kami parantos ningali ieu dina conto RBD:

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

Nerapkeun manifest:

kubectl apply -f secret.yaml

Sareng ayeuna - StorageClass anu misah:

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

Hayu urang eusian dieu clusterID sareng lumaku dina Kubernetes:

kubectl apply -f storageclass.yaml

pamariksaan

Pikeun pariksa, sapertos dina conto sateuacana, hayu urang ngadamel PVC:

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

Jeung pariksa ayana PVC / PV:

kubectl get pvc
kubectl get pv

Upami anjeun hoyong ningali file sareng diréktori di CephFS, anjeun tiasa masang sistem file ieu dimana waé. Contona saperti ditémbongkeun di handap.

Hayu urang angkat ka salah sahiji titik klaster Ceph sareng laksanakeun tindakan ieu:

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

Tangtosna, masang FS dina titik Ceph sapertos kieu ngan ukur cocog pikeun tujuan palatihan, anu kami lakukeun dina kami. Kursus Slurm. Ku teu sangka saha bakal ngalakukeun ieu dina produksi; aya résiko luhur ngahaja mupus file penting.

Sareng pamustunganana, hayu urang parios kumaha hal-hal damel sareng ukuran ukuran jilid dina kasus CephFS. Hayu urang uih deui ka Kubernetes sareng ngédit manifest kami pikeun PVC - ningkatkeun ukuranana di dinya, contona, kana 7Gi.

Hayu urang nerapkeun file anu diédit:

kubectl apply -f pvc.yaml

Hayu urang tingali diréktori anu dipasang pikeun ningali kumaha kuota parantos robih:

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

Pikeun paréntah ieu tiasa dianggo, anjeun panginten kedah pasang pakét dina sistem anjeun attr.

Panon sieun, tapi leungeun

Sadaya mantra ieu sareng manifes YAML anu panjang sigana pajeulit dina permukaan, tapi dina prakna, murid Slurm gancang ngartos.
Dina tulisan ieu kami henteu lebet ka jero leuweung - aya dokuméntasi resmi pikeun éta. Upami anjeun resep kana detil ngeunaan nyetél panyimpenan Ceph sareng klaster Kubernetes, tautan ieu bakal ngabantosan:

Prinsip umum Kubernetes gawé bareng volume
Dokuméntasi RBD
Ngahijikeun RBD sareng Kubernetes tina sudut pandang Ceph
Ngahijikeun RBD sareng Kubernetes tina sudut pandang CSI
Dokuméntasi CephFS Umum
Ngahijikeun CephFS sareng Kubernetes tina sudut pandang CSI

Dina kursus Slurm Pangkalan Kubernetes anjeun tiasa langkung jauh sareng nyebarkeun aplikasi nyata dina Kubernetes anu bakal ngagunakeun CephFS salaku panyimpen file. Ngaliwatan GET / POST requests anjeun bakal bisa nransferkeun payil jeung narima eta ti Ceph.

Sareng upami anjeun langkung resep kana neundeun data, teras ngadaptarkeun Tangtu anyar dina Ceph. Nalika tés béta lumangsung, kursus tiasa didapet ku diskon sareng anjeun tiasa mangaruhan eusina.

Panulis artikel: Alexander Shvalov, practicing insinyur Southbridge, Administrator Kubernetes Certified, panulis sareng pamekar kursus Slurm.

sumber: www.habr.com