Ceph — инструмент, позволяющий построить распределенное хранилище данных с большим диапазоном возможностей подключения хранилища клиентам. Возможно подключение как в режиме блочных устройств (rbd), так и в режиме файловой системы (cephfs). В рамках сегодняшней статьи рассмотрим установку на тестовый кластер версии ceph 15 octopus и подключение созданного кластера к кластеру k8s, c возможностью автоматического создания на основе технологии DP ( dynamic provisioning).
За основу тестового кластера ceph взяты:
Демоны ceph выполняют разные функции, например, через monitor подключаются клиенты, а osd отвечают за хранение данных и в продуктовых инсталляциях необходимо разносить роли по разным машинам, но в рамках нашего стенда все три сервера будут нести на себе все роли. Произведем предварительные настройки.
Шаг 1.
В файлы /etc/hosts машин необходимо добавить следующие строки:
192.168.66.161 ceph1 192.168.66.162 ceph2 192.168.66.163 ceph3
Шаг 2.
Необходимо установить корректные имена узлов командой hostnamectl set-hostname cephX, где x — 1,2,3 соответственно.
Шаг 3.
Установка ceph будет проводиться с вм ceph1, на ней следует выполнить команды для аутентификации по ключу на двух других нодах:
: ssh-keygen ssh-copy-id -i ~/.ssh/id_rsa.pub ceph1 ssh-copy-id -i ~/.ssh/id_rsa.pub ceph2 ssh-copy-id -i ~/.ssh/id_rsa.pub ceph3
Шаг 4.
На все серверы необходимо установить sshpass:
yum install sshpass
Выполнить логин на все три сервера, ssh root@ceph1, ssh root@ceph2, ssh root@ceph3 с целью проверки, что все работает корректно.
Шаг 5.
Устанавливаем git, скачиваем плейбук установки ceph:
yum install git git clone https://github.com/ceph/ceph-ansible.git git checkout stable-5.0 cd ceph-ansible yum install python3-pip pip3 install -r requirements.txt echo "PATH=$PATH:/usr/local/bin">>~/.bashrc source ~/.bashrc
Шаг 6.
В файл group_vars/all.yml вносим следующее содержимое:
#################################### ceph_origin: repository ceph_repository: community ceph_stable_release: octopus public_network: "192.168.66.0/24" cluster_network: "192.168.66.0/24" #ntp_service_enabled: true #ntp_daemon_type: ntpd ceph_release_num: 15 cluster: ceph osd_objectstore: bluestore osd_scenario: lvm devices: - /dev/sdb ceph_conf_overrides: global: osd_pool_default_pg_num: 64 osd_pool_default_pgp_num: 64 osd_journal_size: 5120 osd_pool_default_size: 3 osd_pool_default_min_size: 2 # Firewalld / NTP configure_firewall: True ntp_service_enabled: true ntp_daemon_type: chronyd # DASHBOARD dashboard_enabled: True dashboard_protocol: http dashboard_admin_user: admin dashboard_admin_password: p@ssw0rdp@ssw0rd grafana_admin_user: admin grafana_admin_password: p@ssw0rdp@ssw0rd ############################################## mkdir inventory nano inventory/hosts
Шаг 7.
Создаем файл hosts со следующим содержимым:
[mons] ceph1 monitor_address=192.168.66.161 ceph2 monitor_address=192.168.66.162 ceph3 monitor_address=192.168.66.163 [osds] ceph1 ceph2 ceph3 [mgrs] ceph1 ceph2 ceph3 [mdss] ceph1 ceph2 ceph3 [grafana-server] ceph1 ceph2 ceph3 ###################################
Шаг 8.
Выполняем:
cp site.yml.sample site.yml
Шаг 1.
На кластере ceph создаем пул:
ceph osd pool create k8s 8 8 ceph auth add client.k8s mon 'allow r' osd 'allow rwx pool=k8s' ceph auth get-key client.k8s
Видим вывод:
AQBOksZfOup7LxAAPSRCRxLPe2untxipYjHBuA==
ceph auth get-key client.admin
AQDLRcZfInoxGxAALugbHb0LYQPuwMho6KN0xw==
Выполняем:
ceph mon dump
чтобы увидеть id нашего кластера и адреса мониторов.
Шаг 2.
Переходим в кластер k8s. устанавливаем csi драйвер для работы с ceph:
helm repo add ceph-csi https://ceph.github.io/csi-charts helm inspect values ceph-csi/ceph-csi-cephfs>cephfs.yml
Шаг 3.
В файле cephfs.yaml меняем для нашего кластера:
csiConfig: - clusterID: "52cb0d47-30e1-4d30-acd6-c2f51dc48505" monitors: - "192.168.66.161:6789" - "192.168.66.162:6789" - "192.168.66.163:6789" nodeplugin: httpMetrics: enabled: true containerPort: 8091 podSecurityPolicy: enabled: true provisioner: replicaCount: 1 podSecurityPolicy: enabled: true
Шаг 4.
Устанавливаем чарт:
helm upgrade -i ceph-csi-cephfs ceph-csi/ceph-csi-cephfs -f cephfs.yml -n ceph-csi-cephfs --create-namespace
Шаг 5.
Создаем secret.yaml:
--- apiVersion: v1 kind: Secret metadata: name: csi-cephfs-secret namespace: ceph-csi-cephfs stringData: # Required for dynamically provisioned volumes adminID: admin adminKey: AQDLRcZfInoxGxAALugbHb0LYQPuwMho6KN0xw==
Выполняем:
kubectl create –f secret.yaml
Шаг 6.
Создаем storageclass.yaml:
--- apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: csi-cephfs-sc provisioner: cephfs.csi.ceph.com parameters: clusterID: 52cb0d47-30e1-4d30-acd6-c2f51dc48505 fsName: cephfs 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 reclaimPolicy: Delete allowVolumeExpansion: true mountOptions: - debug kubectl create –f storageclass.yaml
Шаг 7.
Создаем pvc.yaml:
--- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: csi-cephfs-pvc spec: accessModes: - ReadWriteMany resources: requests: storage: 1Gi storageClassName: csi-cephfs-sc kubectl create –f pvc.yaml
Выводом команд убеждаемся что pvc связан с автоматически созданным pv:
kubectl get pvc kubectl get pv
Итого, получили возможность создавать pvc — provisioner создает pv на cephfs.
Теперь настроим тестовое подключение в режиме rbd.
Шаг 1.
На сервере ceph выполняем:
ceph osd pool create kuberbd 32 ceph osd pool application enable kuberbd rbd
Так как у нас в кластер k8s уже установлен csi, для cephps, пропустим этап добавления репозитория (https://ceph.github.io/csi-charts) и сразу экспортим набор переменных чарта:
helm inspect values ceph-csi/ceph-csi-rbd> rbd.yml
В получившемся yaml вносим правки с данными нашего ceph кластера:
csiConfig: - clusterID: "52cb0d47-30e1-4d30-acd6-c2f51dc48505" monitors: - "v2:192.168.66.161:3300/0,v1:192.168.66.161:6789/0" - "v2:192.168.66.162:3300/0,v1:192.168.66.162:6789/0" - "v2:192.168.66.163:3300/0,v1:192.168.66.163:6789/0" nodeplugin: podSecurityPolicy: enabled: true provisioner: podSecurityPolicy: enabled: true
Шаг 2.
Устанавливаем в кластер чарт:
helm upgrade -i ceph-csi-rbd ceph-csi/ceph-csi-rbd -f rbd.yml -n ceph-csi-rbd --create-namespace
Смотрим ключ доступа для юзера admin (в production правильно создавать отдельного юзера с правами на запись):
ceph auth get-key client.admin
Шаг 3.
Создаем secret.yaml:
--- apiVersion: v1 kind: Secret metadata: name: csi-rbd-secret namespace: ceph-csi-rbd stringData: userID: admin userKey: AQDLRcZfInoxGxAALugbHb0LYQPuwMho6KN0xw==
Выполняем команду:
kubectl apply -f secret.yaml
Шаг 4.
Создаем storageclass.yaml:
--- apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: csi-rbd-sc provisioner: rbd.csi.ceph.com parameters: clusterID: 52cb0d47-30e1-4d30-acd6-c2f51dc48505 pool: kuberbd 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 kubectl apply -f storageclass.yaml
Шаг 5.
Создаем pvc.yaml:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: rbd-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 2Gi storageClassName: csi-rbd-sc
Выполняем:
kubectl apply -f pvc.yaml
Проверим в графическом интерфейсе ceph наличие созданных нами пулов:
Пулы присутствуют, встроенный дашборд и grafana позволят в базовом варианте мониторить нагрузку на наш кластер. Более тонкая настройка мониторинга и алертинга — тема отдельных статей.
В итоге мы получили пригодный для обучения и тестирования различных сценариев работы кластер ceph. Как клиента подключили кластер k8s в режиме cephfs и rbd, что дало возможность создавать pv на основе pvc в автоматическом режиме посредством dynamic provisioning.