Kubernetes — deployment с несколькими репликами в хранилище Ceph

Thank you for reading this post, don't forget to subscribe!

у нас есть на руках кла­стер Ceph и кла­стер Kubernetes и сто­ит зада­ча под­нять deployment c несколь­ки­ми репли­ка­ми (несколь­ко реплик — в нашем слу­чае клю­че­вое тре­бо­ва­ние). Deployment будет содер­жать в себе nginx сер­вер в 2 репли­ках. Если curl -ом отпра­вить в его сто­ро­ну файл — он сохра­нит его на диск Ceph. Вот такое про­стое приложение.

Если посмот­реть на эту зада­чу с точ­ки зре­ния реа­ли­за­ции – нам нуж­но выде­лить в ceph необ­хо­ди­мые дис­ко­вые ресур­сы и про­ки­нуть их в кла­стер Kubernetes. Этот ресурс дол­жен быть в режи­ме ReadWriteMany или кол­лек­тив­но­го досту­па, так как ина­че наш Deployment под­ни­мет толь­ко одну репли­ку, осталь­ные же в ожи­да­нии сво­бод­но­го дис­ка рабо­тать не будут. А это не наша история.

Общая схе­ма того, что мы будем делать, — со все­ми частя­ми и их взаимосвязями.

Созда­ем Pool с име­нем kube.

ceph osd pool create kube 8 8

Теперь нам необ­хо­ди­мы Client key и Admin key, кото­рые поз­во­лят нам авто­ри­зо­вать­ся в Ceph со сто­ро­ны кла­сте­ра Kubernetes.

Этап под­го­то­ви­тель­ных работ в ceph мы завершили.

Даль­ше пере­хо­дим к Kubernetes и попро­бу­ем сде­лать в нем следующее:

  • уста­но­вить CSI driver;
  • создать secret;
  • создать Storageclass;
  • создать PVC;
  • создать точ­ку монтирования;
  • создать Deployment;
  • создать Configmap.

Устанавливаем CSI driver

CSI (Container Storage Interface) поз­во­ля­ет Kubernetes под­клю­чать раз­ные хра­ни­ли­ща, напри­мер, ceph, Amazon S3 итд. Но из короб­ки его нет и поэто­му его необ­хо­ди­мо доста­вить в кластер.

Достав­лять будем через helm чарт. Пото­му что стиль­но, мод­но, моло­деж­но — и удоб­но, конеч­но. Добав­ля­ем репо и ска­чи­ва­ем себе cephfs.yml для настройки.

helm repo add ceph-csi — https://ceph.github.io/csi-charts

helm inspect values ceph-csi/ceph-csi-cephfs >cephfs.yml

Файл cephfs.yaml поз­во­ля­ет скон­фи­гу­ри­ро­вать драй­вер под ваш ceph. Смот­рим cepf sid и IP мони­то­ров. Эту инфор­ма­цию мы в даль­ней­шем вне­сем в cephfs.yaml

Ниже при­ве­ден при­мер откор­рек­ти­ро­ван­но­го cephfs.yaml с уче­том мое­го кла­сте­ра. Ceph sid и IP мони­то­ров (ясное дело, тут у каж­до­го будет свой вариант).

Осталь­ные сек­ции фай­ла у меня оста­лись без изме­не­ний — это уже тон­кая настрой­ка. В сек­ции nodeplugin изме­нен containerPort (по дефол­ту — 8080), так как его часто исполь­зу­ют дру­гие ком­по­нен­ты Kubernetes и с этим могут быть проблемы.

После вне­се­ния изме­не­ний в cephfs.yaml уста­нав­ли­ва­ем чарт.

helm upgrade -i ceph-csi-cephfs ceph-csi/ceph-csi-cephfs -f cephfs.yml -n ceph-csi-cephfs --create-namespace

Тут есть один нюанс – нуж­но создать отдель­ный namespace ceph-csi-cephfs, (его мы будем исполь­зо­вать в даль­ней­шем при созда­нии Secret).

Создаем secret

Теперь нам нуж­но авто­ри­зо­вать обще­ние Kubernetes и ceph. Для это­го мы и созда­ва­ли в ceph admin key и client key. Исполь­зу­ем в нашем secret admin key и создан­ный чуть выше отдель­ный namespace.

Посмот­реть admin key можно:


Мани­фест secret.yaml

Далее созда­ем secret.
kubectl create –f secret.yaml

Создаем Storageclass

Теперь самое инте­рес­ное. Эта абстрак­ция поз­во­ля­ет соеди­нить через CSI фай­ло­вую систе­му (в нашем слу­чае ceph) c кла­сте­ром Kubernetes. В Kubernetes может быть созда­но несколь­ко storageclass, и каж­дый будет предо­став­лять дис­ко­вые ресур­сы для кла­сте­ра. В этом мани­фе­сте мы ука­зы­ва­ем свои clusterID и secret создан­ный нами ранее.

Мани­фест storageclass.yaml

Созда­ем storageclass

Kubectl create –f storageclass.yaml

Создаем PVC

Далее у нас по пла­ну созда­ние PVC (PersistentVolumeClaim). PVC — это, по сути, запрос на дис­ко­вые ресур­сы в кла­сте­ре Kubernetes. Если ресур­сы име­ют­ся, то авто­ма­ти­че­ски созда­ет­ся PV (PersistentVolume) и его мы уже исполь­зу­ем как том в нашем Deployment.

Из инте­рес­но­го тут:

  • accessModes: ReadWriteMany                       (Мно­го­поль­зо­ва­тель­ский доступ)
  • storage: 5Gi                                 (Запра­ши­ва­е­мый дис­ко­вый ресурс)
  • storageClassName: csi-cephfs-sc           (Ссыл­ка на наш StorageClass)

Мани­фест pvc.yaml

Созда­ем PVC.

Kubectl create –f pvc.yaml

Создаем точку монтирования в кластере Kubernetes

Идем на одну из Worker node в кла­сте­ре и созда­ем там точ­ку монтирования.

mkdir -p /mnt/cephfs

Созда­ем файл с клю­чом администратора.

ceph auth get-key client.admin >/etc/ceph/secret.key

Редак­ти­ру­ем fstab.

echo "IP Worker node:6789:/ /mnt/cephfs ceph name=admin,secretfile=/etc/ceph/secret.key,noatime,_netdev 0 2">>/etc/fstab

Мон­ти­ру­ем.

mount /mnt/cephfs

Гото­во! Настрой­ку фай­ло­вой систе­мы мы закон­чи­ли. Теперь, исполь­зуя PVC + PV, мы можем под­клю­чить дис­ко­вый ресурс в наш deployment.

Наш deployment доста­точ­но прост и под­ни­ма­ет nginx сер­вер в двух репли­ках, настрой­ки nginx нахо­дят­ся в configmap. Так­же мон­ти­ру­ет­ся ката­лог /data, кото­рый и есть ceph фай­ло­вый ресурс, доступ­ный всем подам в deployment.

Что­бы про­ве­рить наше при­ло­же­ние, отправь­те на ip наше­го сер­ви­са файл, исполь­зуя curl. Если у нас все полу­чи­лось, файл упа­дет в ката­лог /data. А ката­лог /data, как вы помни­те, – это ресур­сы ceph.

curl -i ip address/files/ -T test.txt