Ceph негізіндегі жадты Kubernetes кластеріне қосудың практикалық мысалы

Контейнерді сақтау интерфейсі (CSI) - Kubernetes және сақтау жүйелері арасындағы бірыңғай интерфейс. Біз бұл туралы қысқаша айтып өттік деді, және бүгін біз CSI және Ceph тіркесімін егжей-тегжейлі қарастырамыз: қалай болатынын көрсетеміз Ceph қоймасын қосыңыз Кубернетес кластеріне.
Мақалада қабылдау жеңілдігі үшін нақты, бірақ сәл жеңілдетілген мысалдар келтірілген. Біз Ceph және Kubernetes кластерлерін орнатуды және конфигурациялауды қарастырмаймыз.

Сіз бұл қалай жұмыс істейтінін ойлап жатырсыз ба?

Ceph негізіндегі жадты Kubernetes кластеріне қосудың практикалық мысалы

Сонымен, сіздің қолыңызда Kubernetes кластері бар, мысалы, кубеспрей. Жақын жерде Ceph кластері жұмыс істейді - сіз оны орнатуға болады, мысалы, осымен ойын кітаптарының жинағы. Олардың арасында өндіру үшін кемінде 10 Гбит/с өткізу қабілеті бар желі болуы керек екенін айтудың қажеті жоқ деп үміттенемін.

Мұның бәрі сізде болса, кеттік!

Алдымен, 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 қоймасын орнату туралы мәліметтер қызықтырса, мына сілтемелер көмектеседі:

Кубернеттердің томдармен жұмыс істеудің жалпы принциптері
RBD құжаттамасы
RBD және Kubernetes-ті Ceph тұрғысынан біріктіру
CSI тұрғысынан RBD және Kubernetes интеграциясы
Жалпы CephFS құжаттамасы
CSI тұрғысынан CephFS және Kubernetes интеграциясы

Slurm курсында Кубернетес базасы сіз сәл әрі қарай жүріп, CephFS файлын сақтау ретінде пайдаланатын Kubernetes-те нақты қолданбаны орналастыра аласыз. GET/POST сұраулары арқылы сіз файлдарды Ceph-ге тасымалдап, оларды ала аласыз.

Ал егер деректерді сақтауға көбірек қызығушылық танытсаңыз, тіркеліңіз Цеф бойынша жаңа курс. Бета сынағы жалғасып жатқанда, курсты жеңілдікпен алуға болады және оның мазмұнына әсер ете аласыз.

Мақала авторы: Александр Швалов, тәжірибеші инженер Саутбридж, Kubernetes сертификатталған әкімшісі, Slurm курстарының авторы және әзірлеушісі.

Ақпарат көзі: www.habr.com