Контейнерді сақтау интерфейсі (CSI) - Kubernetes және сақтау жүйелері арасындағы бірыңғай интерфейс. Біз бұл туралы қысқаша айтып өттік
Мақалада қабылдау жеңілдігі үшін нақты, бірақ сәл жеңілдетілген мысалдар келтірілген. Біз Ceph және Kubernetes кластерлерін орнатуды және конфигурациялауды қарастырмаймыз.
Сіз бұл қалай жұмыс істейтінін ойлап жатырсыз ба?
Сонымен, сіздің қолыңызда Kubernetes кластері бар, мысалы,
Мұның бәрі сізде болса, кеттік!
Алдымен, 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 жүйесінде жаңа StorageClass жасайық. Бұл тағы да Цефпен аздап араласуды қажет етеді.
Біз 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 кластеріндегі Құпияға қосайық - бізге қажет жерде Қолданушы кілті:
---
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
Толтыру керек кластер идентификаторы, оны біз команда бұрыннан үйрендік 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
Кубернетес Цефте сұралған томды қалай жасағанын бірден көрейік:
kubectl get pvc
kubectl get pv
Барлығы керемет сияқты! Бұл Цеф жағында қалай көрінеді?
Біз бассейндегі томдардың тізімін аламыз және біздің көлем туралы ақпаратты көреміз:
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
Біз ПВХ өлшемі өзгермегенін көреміз. Неліктен екенін білу үшін Кубернетестен ПВХ-ның YAML сипаттамасын сұрауға болады:
kubectl get pvc rbd-pvc -o yaml
Мәселе мынада:
хабарлама: Түйіндегі дыбыс көлемінің файлдық жүйесінің өлшемін өзгертуді аяқтау үшін пайдаланушының подкастты (қайта) бастауын күтуде. түрі: FileSystemResizePending
Яғни, диск өсті, бірақ ондағы файлдық жүйе өспейді.
Файлдық жүйені өсіру үшін дыбыс деңгейін орнату керек. Біздің елде жасалған ПВХ/ПВ қазіргі уақытта ешқандай түрде қолданылмайды.
Біз сынақ Pod жасай аламыз, мысалы:
---
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
Ал енді ПВХ-ны қарастырайық:
kubectl get pvc
Көлемі өзгерді, бәрі жақсы.
Бірінші бөлімде біз RBD блоктау құрылғысымен жұмыс істедік (ол Rados Block Device дегенді білдіреді), бірақ әртүрлі микросервистердің осы дискімен бір уақытта жұмыс істеуі қажет болса, мұны істеу мүмкін емес. CephFS дискідегі кескіндерден гөрі файлдармен жұмыс істеу үшін әлдеқайда қолайлы.
Ceph және Kubernetes кластерлерінің мысалын пайдалана отырып, біз CSI және басқа қажетті нысандарды CephFS-пен жұмыс істеу үшін конфигурациялаймыз.
Бізге қажет жаңа Helm диаграммасынан мәндерді алайық:
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
Монитор мекенжайлары жай адрес: порт түрінде көрсетілгенін ескеріңіз. Түйінге cephfs орнату үшін бұл мекенжайлар ядро модуліне тасымалданады, ол әлі v2 монитор протоколымен жұмыс істеуді білмейді.
Kubespray орнатқан nginx-проксиге қайшы келмеуі үшін httpMetrics портын өзгертеміз (Prometheus метрикаларды бақылау үшін сонда барады). Бұл сізге қажет болмауы мүмкін.
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
Ал енді - бөлек 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
Мұнда толтырайық кластер идентификаторы және Kubernetes-те қолданылады:
kubectl apply -f storageclass.yaml
тексеру
Тексеру үшін, алдыңғы мысалдағыдай, ПВХ жасайық:
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: csi-cephfs-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
storageClassName: csi-cephfs-sc
Және ПВХ/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
Әрине, мұндай Цеф түйініне FS орнату тек оқу мақсаттары үшін жарамды, біз мұны өзімізде істейміз.
Соңында, CephFS жағдайында көлемдерді өзгерту арқылы заттардың қалай жұмыс істейтінін тексерейік. Kubernetes-ке оралайық және ПВХ үшін манифестімізді өңдейік - ондағы өлшемді, мысалы, 7Gi-ге дейін арттырыңыз.
Өңделген файлды қолданайық:
kubectl apply -f pvc.yaml
Квота қалай өзгергенін көру үшін орнатылған каталогты қарастырайық:
getfattr -n ceph.quota.max_bytes <каталог-с-данными>
Бұл пәрмен жұмыс істеуі үшін жүйеңізге буманы орнату қажет болуы мүмкін аттр.
Көз қорқады, бірақ қол қорқады
Барлық осы заклинание және ұзақ YAML манифесттері сырттай күрделі болып көрінеді, бірақ іс жүзінде Slurm студенттері оларды тез меңгереді.
Бұл мақалада біз Джунглиге терең кірмедік - бұл үшін ресми құжаттама бар. Егер сізді Kubernetes кластерімен Ceph қоймасын орнату туралы мәліметтер қызықтырса, мына сілтемелер көмектеседі:
Slurm курсында
Ал егер деректерді сақтауға көбірек қызығушылық танытсаңыз, тіркеліңіз
Мақала авторы: Александр Швалов, тәжірибеші инженер
Ақпарат көзі: www.habr.com