Container Storage Interface (CSI) on yhtenäinen käyttöliittymä Kubernetesin ja tallennusjärjestelmien välillä. Olemme jo puhuneet siitä lyhyesti
Artikkeli tarjoaa todellisia, vaikkakin hieman yksinkertaistettuja esimerkkejä havainnoinnin helpottamiseksi. Emme harkitse Ceph- ja Kubernetes-klustereiden asentamista ja määrittämistä.
Mietitkö kuinka se toimii?
Joten sinulla on käden ulottuvillasi Kubernetes-klusteri, joka on otettu käyttöön esimerkiksi
Jos sinulla on kaikki tämä, mennään!
Siirrytään ensin yhteen Ceph-klusterin solmuista ja tarkistetaan, että kaikki on kunnossa:
ceph health
ceph -s
Seuraavaksi luomme välittömästi poolin RBD-levyille:
ceph osd pool create kube 32
ceph osd pool application enable kube rbd
Siirrytään Kubernetes-klusteriin. Siellä asennamme ensin Ceph CSI -ohjaimen RBD:lle. Asennamme odotetusti Helmin kautta.
Lisäämme arkiston kaaviolla, saamme joukon muuttujia ceph-csi-rbd-kaaviolle:
helm repo add ceph-csi https://ceph.github.io/csi-charts
helm inspect values ceph-csi/ceph-csi-rbd > cephrbd.yml
Nyt sinun on täytettävä cephrbd.yml-tiedosto. Voit tehdä tämän selvittämällä Cephin monitorien klusterin tunnukset ja IP-osoitteet:
ceph fsid # так мы узнаем clusterID
ceph mon dump # а так увидим IP-адреса мониторов
Syötämme saadut arvot cephrbd.yml-tiedostoon. Samalla sallimme PSP-käytäntöjen (Pod Security Policies) luomisen. Vaihtoehdot osioissa nodeplugin и huolehtija jo tiedostossa, ne voidaan korjata alla olevan kuvan mukaisesti:
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
Seuraavaksi meidän on vain asennettava kaavio Kubernetes-klusteriin.
helm upgrade -i ceph-csi-rbd ceph-csi/ceph-csi-rbd -f cephrbd.yml -n ceph-csi-rbd --create-namespace
Hienoa, RBD-ohjain toimii!
Luodaan uusi StorageClass Kubernetesiin. Tämä vaatii taas vähän puuhailua Cefin kanssa.
Luomme uuden käyttäjän Cephiin ja annamme hänelle oikeudet kirjoittaa pooliin kuutio:
ceph auth get-or-create client.rbdkube mon 'profile rbd' osd 'profile rbd pool=kube'
Katsotaan nyt, että pääsyavain on edelleen olemassa:
ceph auth get-key client.rbdkube
Komento tulostaa jotain tällaista:
AQCO9NJbhYipKRAAMqZsnqqS/T8OYQX20xIa9A==
Lisätään tämä arvo Secretiin Kubernetes-klusterissa - siellä, missä sitä tarvitaan userKey:
---
apiVersion: v1
kind: Secret
metadata:
name: csi-rbd-secret
namespace: ceph-csi-rbd
stringData:
# Значения ключей соответствуют имени пользователя и его ключу, как указано в
# кластере Ceph. ID юзера должен иметь доступ к пулу,
# указанному в storage class
userID: rbdkube
userKey: <user-key>
Ja me luomme salaisuutemme:
kubectl apply -f secret.yaml
Seuraavaksi tarvitsemme tällaisen StorageClass-luettelon:
---
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
On täytettävä clusterID, jonka tiimi on jo oppinut ceph fsid, ja käytä tätä manifestia Kubernetes-klusteriin:
kubectl apply -f storageclass.yaml
Voit tarkistaa, kuinka klusterit toimivat yhdessä, luomalla seuraava PVC (Persistent Volume Claim):
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: rbd-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: csi-rbd-sc
Katsotaanpa heti, kuinka Kubernetes loi pyydetyn taltion Cephissä:
kubectl get pvc
kubectl get pv
Kaikki näyttää olevan hienoa! Miltä tämä näyttää Cefin puolella?
Saamme luettelon altaassa olevista osista ja tarkastelemme volyymiämme koskevia tietoja:
rbd ls -p kube
rbd -p kube info csi-vol-eb3d257d-8c6c-11ea-bff5-6235e7640653 # тут, конечно же, будет другой ID тома, который выдала предыдущая команда
Katsotaan nyt, kuinka RBD-taltion koon muuttaminen toimii.
Muuta pvc.yaml-luettelon tilavuuden kooksi 2Gi ja ota se käyttöön:
kubectl apply -f pvc.yaml
Odotetaan muutosten voimaantuloa ja katsotaan äänenvoimakkuuden kokoa uudelleen.
rbd -p kube info csi-vol-eb3d257d-8c6c-11ea-bff5-6235e7640653
kubectl get pv
kubectl get pvc
Näemme, että PVC:n koko ei ole muuttunut. Voit selvittää miksi voit kysyä Kubernetesilta PVC:n YAML-kuvauksen:
kubectl get pvc rbd-pvc -o yaml
Tässä on ongelma:
viesti: Odotetaan, että käyttäjä käynnistää podin (uudelleen) suorittaakseen tiedostojärjestelmän koon muuttamisen loppuun solmussa. tyyppi: FileSystemResizePending
Eli levy on kasvanut, mutta sen tiedostojärjestelmä ei.
Jos haluat kasvattaa tiedostojärjestelmää, sinun on asennettava asema. Maassamme luotua PVC/PV:tä ei tällä hetkellä käytetä millään tavalla.
Voimme luoda testikotelon esimerkiksi näin:
---
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
Ja nyt katsotaan PVC:tä:
kubectl get pvc
Koko on muuttunut, kaikki on hyvin.
Ensimmäisessä osassa työskentelimme RBD-lohkolaitteen kanssa (se tulee sanoista Rados Block Device), mutta tätä ei voida tehdä, jos eri mikropalvelujen on toimittava tämän levyn kanssa samanaikaisesti. CephFS sopii paljon paremmin tiedostojen kuin levykuvien käsittelyyn.
Ceph- ja Kubernetes-klusterien esimerkin avulla määritämme CSI:n ja muut tarvittavat entiteetit toimimaan CephFS:n kanssa.
Otetaan arvot uudesta Helm-kaaviosta, joita tarvitsemme:
helm inspect values ceph-csi/ceph-csi-cephfs > cephfs.yml
Jälleen sinun on täytettävä cephfs.yml-tiedosto. Kuten ennenkin, Ceph-komennot auttavat:
ceph fsid
ceph mon dump
Täytä tiedosto seuraavasti:
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
Huomaa, että monitorien osoitteet määritetään yksinkertaisessa muodossa osoite:portti. Cephf:ien asentamiseksi solmuun nämä osoitteet siirretään ydinmoduuliin, joka ei vielä osaa toimia v2-valvontaprotokollan kanssa.
Muutamme httpMetricsin porttia (Prometheus menee sinne mittausten seurantaan), jotta se ei ole ristiriidassa Kubesprayn asentaman nginx-proxyn kanssa. Et ehkä tarvitse tätä.
Asenna Helm-kaavio Kubernetes-klusteriin:
helm upgrade -i ceph-csi-cephfs ceph-csi/ceph-csi-cephfs -f cephfs.yml -n ceph-csi-cephfs --create-namespace
Siirrytään Ceph-tietokauppaan luodaksesi sinne erillinen käyttäjä. Dokumentaatiossa todetaan, että CephFS-hallintaohjelma vaatii klusterin järjestelmänvalvojan käyttöoikeudet. Mutta luomme erillisen käyttäjän fs rajoitetuilla oikeuksilla:
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'
Ja katsotaan heti hänen pääsyavaimensa, tarvitsemme sitä myöhemmin:
ceph auth get-key client.fs
Luodaan erilliset Secret ja StorageClass.
Ei mitään uutta, olemme jo nähneet tämän RBD-esimerkissä:
---
apiVersion: v1
kind: Secret
metadata:
name: csi-cephfs-secret
namespace: ceph-csi-cephfs
stringData:
# Необходимо для динамически создаваемых томов
adminID: fs
adminKey: <вывод предыдущей команды>
Manifestin soveltaminen:
kubectl apply -f secret.yaml
Ja nyt - erillinen 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
Täytetään se tähän clusterID ja sovelletaan Kubernetesissa:
kubectl apply -f storageclass.yaml
Проверка
Tarkistaaksesi, kuten edellisessä esimerkissä, luodaan PVC:
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: csi-cephfs-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
storageClassName: csi-cephfs-sc
Ja tarkista PVC/PV:n läsnäolo:
kubectl get pvc
kubectl get pv
Jos haluat tarkastella tiedostoja ja hakemistoja CephFS:ssä, voit asentaa tämän tiedostojärjestelmän jonnekin. Esimerkiksi alla olevan kuvan mukaisesti.
Siirrytään yhteen Ceph-klusterin solmuista ja suoritetaan seuraavat toiminnot:
# Точка монтирования
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
Tietenkin FS:n asentaminen Ceph-solmuun näin soveltuu vain harjoitustarkoituksiin, mitä teemme
Ja lopuksi, tarkistetaan kuinka asiat toimivat volyymien koon muuttamisen kanssa CephFS: n tapauksessa. Palataan Kubernetesiin ja muokataan luetteloa PVC:lle - suurenna koko siellä esimerkiksi 7Gi:iin.
Otetaan muokattu tiedosto käyttöön:
kubectl apply -f pvc.yaml
Katsotaanpa liitettyä hakemistoa nähdäksesi kuinka kiintiö on muuttunut:
getfattr -n ceph.quota.max_bytes <каталог-с-данными>
Jotta tämä komento toimisi, sinun on ehkä asennettava paketti järjestelmääsi attr.
Silmät pelkäävät, ja kädet tekevät
Kaikki nämä loitsut ja pitkät YAML-manifestit näyttävät pinnalta monimutkaisilta, mutta käytännössä Slurm-opiskelijat saavat niistä selvää melko nopeasti.
Tässä artikkelissa emme menneet syvälle viidakkoon - siitä on olemassa virallinen dokumentaatio. Jos olet kiinnostunut Ceph-tallennustilan määrittämisestä Kubernetes-klusterin kanssa, nämä linkit auttavat:
Slurm-kurssilla
Ja jos olet enemmän kiinnostunut tietojen tallentamisesta, rekisteröidy
Artikkelin kirjoittaja: Alexander Shvalov, insinööri
Lähde: will.com