„Container Storage Interface“ (CSI) yra vieninga „Kubernetes“ ir saugojimo sistemų sąsaja. Mes jau trumpai apie tai kalbėjome
Straipsnyje pateikiami tikri, nors ir šiek tiek supaprastinti pavyzdžiai, kad būtų lengviau suvokti. Mes nesvarstome įdiegti ir konfigūruoti „Ceph“ ir „Kubernetes“ grupių.
Ar jums įdomu, kaip tai veikia?
Taigi, po ranka turite Kubernetes klasterį, įdiegtą, pavyzdžiui,
Jei visa tai turi, eime!
Pirmiausia eikime į vieną iš Ceph klasterio mazgų ir patikrinkite, ar viskas tvarkoje:
ceph health
ceph -s
Tada iš karto sukursime RBD diskų telkinį:
ceph osd pool create kube 32
ceph osd pool application enable kube rbd
Pereikime prie „Kubernetes“ klasterio. Ten, visų pirma, įdiegsime Ceph CSI tvarkyklę, skirtą RBD. Įdiegsime, kaip ir tikėtasi, per Helm.
Pridedame saugyklą su diagrama, gauname ceph-csi-rbd diagramos kintamųjų rinkinį:
helm repo add ceph-csi https://ceph.github.io/csi-charts
helm inspect values ceph-csi/ceph-csi-rbd > cephrbd.yml
Dabar reikia užpildyti cephrbd.yml failą. Norėdami tai padaryti, sužinokite Ceph monitorių klasterio ID ir IP adresus:
ceph fsid # так мы узнаем clusterID
ceph mon dump # а так увидим IP-адреса мониторов
Gautas reikšmes įvedame į failą cephrbd.yml. Tuo pačiu metu leidžiame kurti PSP politiką (Pod Security Policies). Parinktys skyriuose mazgo įskiepis и aprūpintojas jau faile, juos galima taisyti, kaip parodyta toliau:
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
Toliau mums belieka įdiegti diagramą Kubernetes klasteryje.
helm upgrade -i ceph-csi-rbd ceph-csi/ceph-csi-rbd -f cephrbd.yml -n ceph-csi-rbd --create-namespace
Puiku, RBD tvarkyklė veikia!
Sukurkime naują „StorageClass“ „Kubernetes“. Tam vėl reikia šiek tiek padirbėti su Cefu.
Mes sukuriame naują vartotoją Ceph ir suteikiame jam teises rašyti į telkinį kubas:
ceph auth get-or-create client.rbdkube mon 'profile rbd' osd 'profile rbd pool=kube'
Dabar pažiūrėkime, kad prieigos raktas vis dar yra:
ceph auth get-key client.rbdkube
Komanda išves kažką panašaus į tai:
AQCO9NJbhYipKRAAMqZsnqqS/T8OYQX20xIa9A==
Pridėkime šią reikšmę prie „Secret“ „Kubernetes“ klasteryje – ten, kur mums jos reikia Naudotojo raktas:
---
apiVersion: v1
kind: Secret
metadata:
name: csi-rbd-secret
namespace: ceph-csi-rbd
stringData:
# Значения ключей соответствуют имени пользователя и его ключу, как указано в
# кластере Ceph. ID юзера должен иметь доступ к пулу,
# указанному в storage class
userID: rbdkube
userKey: <user-key>
Ir mes sukuriame savo paslaptį:
kubectl apply -f secret.yaml
Tada mums reikia „StorageClass“ manifesto, panašaus į šį:
---
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
Reikia užpildyti clusterID, kurių komanda jau išmoko ceph fsid, ir pritaikykite šį manifestą Kubernetes klasteriui:
kubectl apply -f storageclass.yaml
Norėdami patikrinti, kaip klasteriai veikia kartu, sukurkime šį PVC (nuolatinį tūrio pareiškimą):
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: rbd-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: csi-rbd-sc
Iš karto pažiūrėkime, kaip Kubernetes sukūrė prašomą tomą Ceph:
kubectl get pvc
kubectl get pv
Viskas atrodo puiku! Kaip tai atrodo Ceph pusėje?
Gauname baseino tomų sąrašą ir peržiūrime informaciją apie mūsų tomą:
rbd ls -p kube
rbd -p kube info csi-vol-eb3d257d-8c6c-11ea-bff5-6235e7640653 # тут, конечно же, будет другой ID тома, который выдала предыдущая команда
Dabar pažiūrėkime, kaip veikia RBD tomo dydžio keitimas.
Pakeiskite tomo dydį pvc.yaml apraše į 2Gi ir pritaikykite jį:
kubectl apply -f pvc.yaml
Palaukite, kol pakeitimai įsigalios, ir dar kartą pažiūrėkime į garsumo dydį.
rbd -p kube info csi-vol-eb3d257d-8c6c-11ea-bff5-6235e7640653
kubectl get pv
kubectl get pvc
Matome, kad PVC dydis nepasikeitė. Norėdami sužinoti, kodėl, galite paprašyti Kubernetes YAML PVC aprašymo:
kubectl get pvc rbd-pvc -o yaml
Štai problema:
pranešimas: Laukiama, kol vartotojas (iš naujo) paleis bloką, kad baigtų failų sistemos apimties keitimą mazge. tipas: FileSystemResizePending
Tai reiškia, kad diskas išaugo, bet jame esanti failų sistema – ne.
Norėdami išplėsti failų sistemą, turite prijungti tomą. Mūsų šalyje sukurtas PVC/PV šiuo metu niekaip nenaudojamas.
Galime sukurti bandomąjį Pod, pavyzdžiui, taip:
---
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
O dabar pažvelkime į PVC:
kubectl get pvc
Dydis pasikeitė, viskas gerai.
Pirmoje dalyje dirbome su RBD blokų įrenginiu (jis reiškia Rados Block Device), tačiau to negalima padaryti, jei su šiuo disku vienu metu turi dirbti skirtingos mikropaslaugos. CephFS daug geriau tinka darbui su failais, o ne su disko vaizdais.
Naudodamiesi Ceph ir Kubernetes klasterių pavyzdžiu, sukonfigūruosime CSI ir kitus būtinus objektus, kad jie veiktų su CephFS.
Paimkime reikšmes iš naujos Helm diagramos, kurių mums reikia:
helm inspect values ceph-csi/ceph-csi-cephfs > cephfs.yml
Vėl turite užpildyti cephfs.yml failą. Kaip ir anksčiau, Ceph komandos padės:
ceph fsid
ceph mon dump
Užpildykite failą tokiomis reikšmėmis kaip ši:
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
Atkreipkite dėmesį, kad monitoriaus adresai nurodomi paprasta forma adresas:portas. Norint pritvirtinti cephfs mazge, šie adresai perkeliami į branduolio modulį, kuris dar nežino, kaip dirbti su v2 monitoriaus protokolu.
Pakeičiame httpMetrics prievadą (Prometheus eis ten stebėti metriką), kad jis neprieštarautų nginx-proxy, kurį įdiegia Kubespray. Jums to gali neprireikti.
Įdiekite „Helm“ diagramą „Kubernetes“ klasteryje:
helm upgrade -i ceph-csi-cephfs ceph-csi/ceph-csi-cephfs -f cephfs.yml -n ceph-csi-cephfs --create-namespace
Eikime į Ceph duomenų parduotuvę, kad sukurtume atskirą vartotoją. Dokumentuose teigiama, kad CephFS teikėjas reikalauja klasterio administratoriaus prieigos teisių. Bet mes sukursime atskirą vartotoją fs su ribotomis teisėmis:
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'
Ir iš karto pažvelkime į jo prieigos raktą, jo mums prireiks vėliau:
ceph auth get-key client.fs
Sukurkime atskirą paslaptį ir saugojimo klasę.
Nieko naujo, tai jau matėme UBR pavyzdyje:
---
apiVersion: v1
kind: Secret
metadata:
name: csi-cephfs-secret
namespace: ceph-csi-cephfs
stringData:
# Необходимо для динамически создаваемых томов
adminID: fs
adminKey: <вывод предыдущей команды>
Taikant manifestą:
kubectl apply -f secret.yaml
O dabar – atskira StorageClass:
---
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
Užpildykime čia clusterID ir taikoma Kubernetes:
kubectl apply -f storageclass.yaml
Проверка
Norėdami patikrinti, kaip ir ankstesniame pavyzdyje, sukurkime PVC:
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: csi-cephfs-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
storageClassName: csi-cephfs-sc
Ir patikrinkite, ar yra PVC / PV:
kubectl get pvc
kubectl get pv
Jei norite peržiūrėti failus ir katalogus CephFS, galite kur nors prijungti šią failų sistemą. Pavyzdžiui, kaip parodyta žemiau.
Eikime į vieną iš Ceph klasterio mazgų ir atlikime šiuos veiksmus:
# Точка монтирования
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
Žinoma, FS montavimas ant tokio Ceph mazgo tinka tik treniruotėms, ką mes darome
Ir galiausiai, patikrinkime, kaip viskas veikia keičiant apimtis CephFS atveju. Grįžkime į „Kubernetes“ ir redaguokite PVC aprašą – padidinkite dydį, pavyzdžiui, iki 7Gi.
Taikykime redaguotą failą:
kubectl apply -f pvc.yaml
Pažiūrėkime į prijungtą katalogą, kad pamatytumėte, kaip pasikeitė kvota:
getfattr -n ceph.quota.max_bytes <каталог-с-данными>
Kad ši komanda veiktų, gali tekti įdiegti paketą savo sistemoje attr.
Akys bijo, bet rankos bijo
Visi šie burtai ir ilgi YAML apraiškos iš pirmo žvilgsnio atrodo sudėtingos, tačiau praktiškai Slurm studentai gana greitai juos įgyja.
Šiame straipsnyje mes nesigilinome į džiungles – tam yra oficiali dokumentacija. Jei jus domina „Ceph“ saugyklos su „Kubernetes“ grupe nustatymo informacija, šios nuorodos padės:
„Slurm“ kursuose
O jei jus labiau domina duomenų saugojimas, registruokitės
Straipsnio autorius: Aleksandras Shvalovas, praktikuojantis inžinierius
Šaltinis: www.habr.com