====== k8s: Настройка, установка, мониторинг, подключение Ceph к кластеру ======
**Ceph** — инструмент, позволяющий построить распределенное хранилище данных с большим диапазоном возможностей подключения хранилища клиентам. Возможно подключение как в режиме блочных устройств (rbd), так и в режиме файловой системы (cephfs). В рамках сегодняшней статьи рассмотрим установку на тестовый кластер версии ceph 15 octopus и подключение созданного кластера к кластеру k8s, c возможностью автоматического создания на основе технологии DP ( dynamic provisioning).
**За основу тестового кластера ceph взяты:**
* Три виртуальные машины в конфигурации 4gb ram, 2 ядра, диск под систему 20 gb, пустой диск sdb на 50 gb.
* Операционная система — centos 8.
Демоны 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
==== Настраиваем подключение кластера k8s к кластеру ceph в варианте cephfs ====
**Шаг 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.
==== Подключаем ceph в режиме rbd к кластеру kubernetes ====
Теперь настроим тестовое подключение в режиме 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|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.