Содержание

k8s: Настройка, установка, мониторинг, подключение Ceph к кластеру

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

Настраиваем подключение кластера 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) и сразу экспортим набор переменных чарта:

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.