Ceph-ఆధారిత నిల్వను Kubernetes క్లస్టర్‌కి కనెక్ట్ చేయడానికి ఒక ఆచరణాత్మక ఉదాహరణ

కంటైనర్ స్టోరేజ్ ఇంటర్‌ఫేస్ (CSI) అనేది కుబెర్నెట్స్ మరియు స్టోరేజ్ సిస్టమ్‌ల మధ్య ఏకీకృత ఇంటర్‌ఫేస్. మేము ఇప్పటికే దాని గురించి క్లుప్తంగా మాట్లాడాము చెప్పారు, మరియు ఈ రోజు మనం CSI మరియు Ceph కలయికను నిశితంగా పరిశీలిస్తాము: మేము ఎలా చూపుతాము Ceph నిల్వను కనెక్ట్ చేయండి కుబెర్నెటీస్ క్లస్టర్‌కి.
ఈ వ్యాసం వాస్తవమైన వాటిని అందిస్తుంది, అయితే అవగాహన సౌలభ్యం కోసం కొద్దిగా సరళీకృతమైన ఉదాహరణలను అందిస్తుంది. మేము Ceph మరియు Kubernetes క్లస్టర్‌లను ఇన్‌స్టాల్ చేయడం మరియు కాన్ఫిగర్ చేయడాన్ని పరిగణించము.

ఇది ఎలా పని చేస్తుందో మీరు ఆశ్చర్యపోతున్నారా?

Ceph-ఆధారిత నిల్వను 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

కుబెర్నెట్స్ క్లస్టర్‌కి వెళ్దాం. అక్కడ, మొదట, మేము RBD కోసం Ceph CSI డ్రైవర్‌ను ఇన్‌స్టాల్ చేస్తాము. మేము ఊహించినట్లుగా, హెల్మ్ ద్వారా ఇన్‌స్టాల్ చేస్తాము.
మేము చార్ట్‌తో రిపోజిటరీని జోడిస్తాము, మేము 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లో మానిటర్ల క్లస్టర్ ID మరియు IP చిరునామాలను కనుగొనండి:

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

మేము పొందిన విలువలను cephrbd.yml ఫైల్‌లో నమోదు చేస్తాము. అదే సమయంలో, మేము PSP పాలసీల (పాడ్ సెక్యూరిటీ పాలసీలు) సృష్టిని ప్రారంభిస్తాము. విభాగాలలో ఎంపికలు నోడ్ప్లగిన్ и ప్రొవిజనర్ ఇప్పటికే ఫైల్‌లో, క్రింద చూపిన విధంగా వాటిని సరిచేయవచ్చు:

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 డ్రైవర్ పనిచేస్తుంది!
కుబెర్నెటెస్‌లో కొత్త స్టోరేజ్‌క్లాస్‌ని క్రియేట్ చేద్దాం. దీనికి మళ్లీ సెఫ్‌తో కొంచెం టింకరింగ్ అవసరం.

మేము Cephలో కొత్త వినియోగదారుని సృష్టిస్తాము మరియు పూల్‌కు వ్రాయడానికి అతనికి హక్కులను అందిస్తాము క్యూబ్:

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

ఇప్పుడు యాక్సెస్ కీ ఇంకా ఉందని చూద్దాం:

ceph auth get-key client.rbdkube

కమాండ్ ఇలా ఏదో అవుట్పుట్ చేస్తుంది:

AQCO9NJbhYipKRAAMqZsnqqS/T8OYQX20xIa9A==

ఈ విలువను కుబెర్నెట్స్ క్లస్టర్‌లోని సీక్రెట్‌కి జోడిద్దాం - మనకు అవసరమైన చోట యూజర్ కీ:

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

నింపాల్సిన అవసరం ఉంది క్లస్టర్ ID, ఇది మేము ఇప్పటికే బృందం ద్వారా నేర్చుకున్నాము ceph fsid, మరియు ఈ మానిఫెస్ట్‌ని కుబెర్నెట్స్ క్లస్టర్‌కి వర్తింపజేయండి:

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

Cephలో Kubernetes అభ్యర్థించిన వాల్యూమ్‌ను ఎలా సృష్టించారో వెంటనే చూద్దాం:

kubectl get pvc
kubectl get pv

అంతా గొప్పగా అనిపిస్తుంది! ఇది Cef వైపు ఎలా కనిపిస్తుంది?
మేము పూల్‌లోని వాల్యూమ్‌ల జాబితాను పొందుతాము మరియు మా వాల్యూమ్ గురించి సమాచారాన్ని చూస్తాము:

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

ఇప్పుడు RBD వాల్యూమ్ పరిమాణాన్ని మార్చడం ఎలా పని చేస్తుందో చూద్దాం.
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 బ్లాక్ పరికరంతో పని చేసాము (ఇది రాడోస్ బ్లాక్ పరికరాన్ని సూచిస్తుంది), అయితే వివిధ మైక్రోసర్వీస్‌లు ఈ డిస్క్‌తో ఏకకాలంలో పని చేయవలసి వస్తే ఇది చేయలేము. 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

దయచేసి మానిటర్ చిరునామాలు సాధారణ ఫారమ్ చిరునామా:పోర్ట్‌లో పేర్కొనబడిందని గమనించండి. నోడ్‌పై సెఫ్ఫ్‌లను మౌంట్ చేయడానికి, ఈ చిరునామాలు కెర్నల్ మాడ్యూల్‌కు బదిలీ చేయబడతాయి, ఇది v2 మానిటర్ ప్రోటోకాల్‌తో ఎలా పని చేయాలో ఇంకా తెలియదు.
మేము httpMetrics కోసం పోర్ట్‌ను మారుస్తాము (మానిటరింగ్ మెట్రిక్‌ల కోసం ప్రోమేతియస్ అక్కడికి వెళ్తాడు) తద్వారా ఇది Kubespray ద్వారా ఇన్‌స్టాల్ చేయబడిన nginx-proxyతో విభేదించదు. మీకు ఇది అవసరం లేకపోవచ్చు.

కుబెర్నెట్స్ క్లస్టర్‌లో హెల్మ్ చార్ట్‌ను ఇన్‌స్టాల్ చేయండి:

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

విడిగా సీక్రెట్ మరియు స్టోరేజ్ క్లాస్ క్రియేట్ చేద్దాం.
కొత్తది ఏమీ లేదు, మేము దీనిని 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

దాన్ని ఇక్కడ పూరించుకుందాం క్లస్టర్ ID మరియు కుబెర్నెట్స్‌లో వర్తిస్తుంది:

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 నోడ్‌లో FSని మౌంట్ చేయడం శిక్షణ ప్రయోజనాల కోసం మాత్రమే సరిపోతుంది, ఇది మేము మాపై చేస్తాము స్లర్మ్ కోర్సులు. ప్రొడక్షన్‌లో ఎవరైనా దీన్ని చేస్తారని నేను అనుకోను; ముఖ్యమైన ఫైల్‌లను అనుకోకుండా చెరిపేసే ప్రమాదం ఉంది.

చివరగా, CephFS విషయంలో వాల్యూమ్‌లను పునఃపరిమాణం చేయడంతో విషయాలు ఎలా పని చేస్తాయో తనిఖీ చేద్దాం. కుబెర్నెట్స్‌కి తిరిగి వెళ్లి, PVC కోసం మా మానిఫెస్ట్‌ని ఎడిట్ చేద్దాం - అక్కడ పరిమాణాన్ని పెంచండి, ఉదాహరణకు, 7Giకి.

సవరించిన ఫైల్‌ని వర్తింపజేద్దాం:

kubectl apply -f pvc.yaml

కోటా ఎలా మారిందో చూడటానికి మౌంటెడ్ డైరెక్టరీని చూద్దాం:

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

ఈ ఆదేశం పని చేయడానికి, మీరు మీ సిస్టమ్‌లో ప్యాకేజీని ఇన్‌స్టాల్ చేయాల్సి ఉంటుంది attr.

కళ్ళు భయపడతాయి, కానీ చేతులు భయపడతాయి

ఈ స్పెల్‌లు మరియు పొడవైన YAML మానిఫెస్ట్‌లు ఉపరితలంపై సంక్లిష్టంగా కనిపిస్తున్నాయి, కానీ ఆచరణలో, స్లర్మ్ విద్యార్థులు వాటిని చాలా త్వరగా తెలుసుకుంటారు.
ఈ వ్యాసంలో మేము అడవిలోకి లోతుగా వెళ్ళలేదు - దాని కోసం అధికారిక డాక్యుమెంటేషన్ ఉంది. కుబెర్నెట్స్ క్లస్టర్‌తో Ceph నిల్వను సెటప్ చేసే వివరాలపై మీకు ఆసక్తి ఉంటే, ఈ లింక్‌లు సహాయపడతాయి:

వాల్యూమ్‌లతో పనిచేసే కుబెర్నెట్స్ యొక్క సాధారణ సూత్రాలు
RBD డాక్యుమెంటేషన్
Ceph దృక్కోణం నుండి RBD మరియు కుబెర్నెట్‌లను సమగ్రపరచడం
CSI దృక్కోణం నుండి RBD మరియు కుబెర్నెట్‌లను సమగ్రపరచడం
సాధారణ CephFS డాక్యుమెంటేషన్
CSI దృక్కోణం నుండి CephFS మరియు కుబెర్నెట్‌లను సమగ్రపరచడం

స్లర్మ్ కోర్సులో కుబెర్నెటెస్ బేస్ మీరు కొంచెం ముందుకు వెళ్లి, CephFSని ఫైల్ స్టోరేజ్‌గా ఉపయోగించే కుబెర్నెట్స్‌లో నిజమైన అప్లికేషన్‌ని అమలు చేయవచ్చు. GET/POST అభ్యర్థనల ద్వారా మీరు ఫైల్‌లను Cephకి బదిలీ చేయగలరు మరియు వాటిని స్వీకరించగలరు.

మరియు మీకు డేటా నిల్వపై ఎక్కువ ఆసక్తి ఉంటే, సైన్ అప్ చేయండి Ceph కొత్త కోర్సు. బీటా పరీక్ష కొనసాగుతున్నప్పుడు, కోర్సును తగ్గింపుతో పొందవచ్చు మరియు మీరు దాని కంటెంట్‌ను ప్రభావితం చేయవచ్చు.

వ్యాసం యొక్క రచయిత: అలెగ్జాండర్ ష్వాలోవ్, ప్రాక్టీస్ ఇంజనీర్ SOUTHBRIDGE, సర్టిఫైడ్ కుబెర్నెట్స్ అడ్మినిస్ట్రేటర్, స్లర్మ్ కోర్సుల రచయిత మరియు డెవలపర్.

మూలం: www.habr.com