Ceph-පාදක ගබඩාව Kubernetes පොකුරකට සම්බන්ධ කිරීමේ ප්‍රායෝගික උදාහරණයක්

බහාලුම් ගබඩා අතුරුමුහුණත (CSI) යනු Kubernetes සහ ගබඩා පද්ධති අතර ඒකාබද්ධ අතුරු මුහුණතකි. අපි දැනටමත් ඒ ගැන කෙටියෙන් කතා කර ඇත්තෙමු කිව්වා, සහ අද අපි CSI සහ Ceph සංයෝජනය දෙස සමීපව බලමු: අපි පෙන්වන්නේ කෙසේද? Ceph ගබඩාව සම්බන්ධ කරන්න Kubernetes පොකුරට.
සංජානනයේ පහසුව සඳහා තරමක් සරල කළ උදාහරණ වුවද ලිපිය සැබෑ දේ සපයයි. අපි Ceph සහ Kubernetes පොකුරු ස්ථාපනය සහ වින්‍යාස කිරීම සලකා බලන්නේ නැත.

එය ක්‍රියා කරන්නේ කෙසේදැයි ඔබ කල්පනා කරනවාද?

Ceph-පාදක ගබඩාව Kubernetes පොකුරකට සම්බන්ධ කිරීමේ ප්‍රායෝගික උදාහරණයක්

ඉතින්, ඔබට ඔබේ ඇඟිලි තුඩුවල Kubernetes පොකුරක් ඇත, උදාහරණයක් ලෙස, kubespray. අසල Ceph පොකුරක් වැඩ කරයි - ඔබට එය ස්ථාපනය කළ හැකිය, උදාහරණයක් ලෙස, මෙය සමඟ සෙල්ලම් පොත් කට්ටලයක්. ඔවුන් අතර නිෂ්පාදනය සඳහා අවම වශයෙන් 10 Gbit / s කලාප පළලක් සහිත ජාලයක් තිබිය යුතු බව සඳහන් කිරීම අවශ්ය නොවේ යැයි මම බලාපොරොත්තු වෙමි.

ඔබට මේ සියල්ල තිබේ නම්, අපි යමු!

පළමුව, අපි Ceph පොකුරු නෝඩ් එකකට ගොස් සියල්ල පිළිවෙලට තිබේදැයි පරීක්ෂා කරමු:

ceph health
ceph -s

ඊළඟට, අපි වහාම RBD තැටි සඳහා සංචිතයක් සාදන්නෙමු:

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

අපි Kubernetes පොකුරට යමු. එහිදී, පළමුවෙන්ම, අපි RBD සඳහා Ceph CSI ධාවකය ස්ථාපනය කරමු. අපි බලාපොරොත්තු වූ පරිදි, 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 ගොනුව පිරවිය යුතුය. මෙය සිදු කිරීම සඳහා, Ceph හි මොනිටරවල පොකුරු හැඳුනුම්පත සහ IP ලිපින සොයා ගන්න:

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

ඊළඟට, අපට ඉතිරිව ඇත්තේ කුබර්නෙටස් පොකුරේ ප්‍රස්ථාරය ස්ථාපනය කිරීමයි.

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

නියමයි, RBD ධාවකය ක්‍රියා කරයි!
අපි Kubernetes හි නව ගබඩා පන්තියක් නිර්මාණය කරමු. මෙය නැවතත් Ceph සමඟ ටින්කර් කිරීම අවශ්ය වේ.

අපි Ceph හි නව පරිශීලකයෙකු නිර්මාණය කර ඔහුට සංචිතයට ලිවීමට අයිතිය ලබා දෙන්නෙමු ඝනකයක්:

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

දැන් අපි බලමු ප්‍රවේශ යතුර තවමත් පවතින බව:

ceph auth get-key client.rbdkube

විධානය මෙවැනි දෙයක් ප්‍රතිදානය කරයි:

AQCO9NJbhYipKRAAMqZsnqqS/T8OYQX20xIa9A==

අපි මෙම අගය Kubernetes පොකුරේ Secret වෙත එකතු කරමු - අපට එය අවශ්‍ය තැන 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

Kubernetes Ceph හි ඉල්ලූ පරිමාව නිර්මාණය කළේ කෙසේදැයි අපි වහාම බලමු:

kubectl get pvc
kubectl get pv

සෑම දෙයක්ම විශිෂ්ට බව පෙනේ! මේක Cep පැත්තේ මොන වගේද?
අපි සංචිතයේ ඇති වෙළුම් ලැයිස්තුවක් ලබාගෙන අපගේ පරිමාව පිළිබඳ තොරතුරු බලන්න:

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

දැන් අපි බලමු RBD Volume එකක ප්‍රමාණය වෙනස් කරන්නේ කොහොමද කියලා.
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 ප්රමාණය වෙනස් වී නැති බව අපි දකිමු. ඇයි දැයි දැන ගැනීමට, ඔබට PVC පිළිබඳ YAML විස්තරයක් සඳහා Kubernetes විමසිය හැක:

kubectl get pvc rbd-pvc -o yaml

මෙන්න ගැටලුව:

පණිවිඩය: නෝඩයේ ඇති ගොනු පද්ධති ප්‍රමාණය වෙනස් කිරීම අවසන් කිරීමට පරිශීලකයා පොඩ් එකක් (නැවත) ආරම්භ කරන තෙක් රැඳී සිටිමින්. වර්ගය: FileSystemResizePending

එනම්, තැටිය වර්ධනය වී ඇත, නමුත් එය මත ගොනු පද්ධතිය නොවේ.
ගොනු පද්ධතිය වර්ධනය කිරීම සඳහා, ඔබ පරිමාව සවි කළ යුතුය. අපේ රටේ, නිර්මාණය කරන ලද PVC/PV දැනට කිසිම ආකාරයකින් භාවිතා නොවේ.

අපට පරීක්ෂණ පොඩ් එකක් සෑදිය හැකිය, උදාහරණයක් ලෙස මේ වගේ:

---
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 පොකුරු උදාහරණය භාවිතා කරමින්, අපි CephFS සමඟ වැඩ කිරීමට CSI සහ අනෙකුත් අවශ්‍ය ආයතන වින්‍යාස කරන්නෙමු.

අපට අවශ්‍ය නව හෙල්ම් ප්‍රස්ථාරයෙන් අගයන් ලබා ගනිමු:

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

මොනිටර ලිපින සරල පෝරමයේ ලිපිනය:port හි දක්වා ඇති බව කරුණාවෙන් සලකන්න. නෝඩයක් මත cephfs සවි කිරීම සඳහා, මෙම ලිපින කර්නල් මොඩියුලයට මාරු කරනු ලැබේ, එය තවමත් v2 මොනිටර ප්‍රොටෝකෝලය සමඟ වැඩ කරන්නේ කෙසේදැයි නොදනී.
අපි httpMetrics සඳහා වරාය වෙනස් කරන්නෙමු (Metrics අධීක්‍ෂණය සඳහා Prometheus එහි යයි) එවිට එය Kubespray විසින් ස්ථාපනය කර ඇති nginx-proxy සමඟ ගැටෙන්නේ නැත. ඔබට මෙය අවශ්ය නොවනු ඇත.

Kubernetes පොකුරේ Helm ප්‍රස්ථාරය ස්ථාපනය කරන්න:

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

දැන් - වෙනම ගබඩා පන්තියක්:

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

ඇත්ත වශයෙන්ම, මෙවැනි Ceph node එකක් මත FS සවි කිරීම සුදුසු වන්නේ පුහුණු අරමුණු සඳහා පමණි, එය අප විසින් සිදු කරනු ලැබේ. මුඩුක්කු පාඨමාලා. නිෂ්පාදනයේදී කිසිවෙකු මෙය කරනු ඇතැයි මම නොසිතමි; වැදගත් ලිපිගොනු අහම්බෙන් මකා දැමීමේ ඉහළ අවදානමක් ඇත.

අවසාන වශයෙන්, CephFS හි පරිමාව ප්‍රමාණය වෙනස් කිරීම සමඟ දේවල් ක්‍රියා කරන්නේ කෙසේදැයි පරීක්ෂා කර බලමු. අපි Kubernetes වෙත ආපසු ගොස් PVC සඳහා අපගේ මැනිෆෙස්ටය සංස්කරණය කරමු - එහි ප්‍රමාණය වැඩි කරන්න, උදාහරණයක් ලෙස, 7Gi දක්වා.

අපි සංස්කරණය කළ ගොනුව යොදමු:

kubectl apply -f pvc.yaml

කෝටාව වෙනස් වී ඇති ආකාරය බැලීමට සවිකර ඇති නාමාවලිය දෙස බලමු:

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

මෙම විධානය ක්‍රියාත්මක වීමට නම්, ඔබට ඔබේ පද්ධතියේ පැකේජය ස්ථාපනය කිරීමට අවශ්‍ය විය හැක atr.

ඇස් බයයි, නමුත් දෑත් බයයි

මෙම සියලු අක්ෂර වින්‍යාසයන් සහ දිගු YAML ප්‍රකාශනයන් මතුපිටින් සංකීර්ණ බව පෙනේ, නමුත් ප්‍රායෝගිකව, Slurm සිසුන් ඉතා ඉක්මනින් ඒවා ග්‍රහණය කර ගනී.
මෙම ලිපියෙන් අපි කැලයට ගැඹුරට ගියේ නැත - ඒ සඳහා නිල ලියකියවිලි තිබේ. ඔබ Kubernetes පොකුරක් සමඟ Ceph ගබඩාව පිහිටුවීමේ විස්තර ගැන උනන්දුවක් දක්වන්නේ නම්, මෙම සබැඳි උපකාර වනු ඇත:

වෙළුම් සමඟ වැඩ කරන Kubernetes හි පොදු මූලධර්ම
RBD ලේඛනගත කිරීම
Ceph ඉදිරිදර්ශනයකින් RBD සහ Kubernetes ඒකාබද්ධ කිරීම
CSI ඉදිරිදර්ශනයකින් RBD සහ Kubernetes ඒකාබද්ධ කිරීම
සාමාන්ය CephFS ලේඛනගත කිරීම
CSI ඉදිරිදර්ශනයකින් CephFS සහ Kubernetes ඒකාබද්ධ කිරීම

Slurm පාඨමාලාව මත කුබර්නෙට්ස් පදනම ඔබට තව ටිකක් ඉදිරියට ගොස්, ගොනු ගබඩාව ලෙස CephFS භාවිතා කරන Kubernetes හි සැබෑ යෙදුමක් යෙදවිය හැක. GET/POST ඉල්ලීම් හරහා ඔබට Ceph වෙත ගොනු මාරු කිරීමට සහ ඒවා ලබා ගැනීමට හැකි වේ.

ඔබ දත්ත ගබඩා කිරීමට වැඩි උනන්දුවක් දක්වන්නේ නම්, ලියාපදිංචි වන්න Ceph පිළිබඳ නව පාඨමාලාව. බීටා පරීක්ෂණය සිදුවෙමින් පවතින අතර, පාඨමාලාව වට්ටමක් ලබා ගත හැකි අතර ඔබට එහි අන්තර්ගතයට බලපෑම් කළ හැකිය.

ලිපියේ කර්තෘ: ඇලෙක්සැන්ඩර් ෂ්වාලොව්, පුහුණු ඉංජිනේරු සවුත්බ්‍රිජ්, සහතික කළ Kubernetes පරිපාලක, Slurm පාඨමාලා කතුවරයා සහ සංවර්ධකයා.

මූලාශ්රය: www.habr.com