కంటైనర్ స్టోరేజ్ ఇంటర్ఫేస్ (CSI) అనేది కుబెర్నెట్స్ మరియు స్టోరేజ్ సిస్టమ్ల మధ్య ఏకీకృత ఇంటర్ఫేస్. మేము ఇప్పటికే దాని గురించి క్లుప్తంగా మాట్లాడాము
ఈ వ్యాసం వాస్తవమైన వాటిని అందిస్తుంది, అయితే అవగాహన సౌలభ్యం కోసం కొద్దిగా సరళీకృతమైన ఉదాహరణలను అందిస్తుంది. మేము Ceph మరియు Kubernetes క్లస్టర్లను ఇన్స్టాల్ చేయడం మరియు కాన్ఫిగర్ చేయడాన్ని పరిగణించము.
ఇది ఎలా పని చేస్తుందో మీరు ఆశ్చర్యపోతున్నారా?
కాబట్టి, మీరు మీ చేతివేళ్ల వద్ద కుబెర్నెట్స్ క్లస్టర్ని కలిగి ఉన్నారు, ఉదాహరణకు,
మీ దగ్గర ఇవన్నీ ఉంటే, వెళ్దాం!
ముందుగా, 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 నిల్వను సెటప్ చేసే వివరాలపై మీకు ఆసక్తి ఉంటే, ఈ లింక్లు సహాయపడతాయి:
స్లర్మ్ కోర్సులో
మరియు మీకు డేటా నిల్వపై ఎక్కువ ఆసక్తి ఉంటే, సైన్ అప్ చేయండి
వ్యాసం యొక్క రచయిత: అలెగ్జాండర్ ష్వాలోవ్, ప్రాక్టీస్ ఇంజనీర్
మూలం: www.habr.com