Важно!!!
Статья не закончена!
Ceph — это программная платформа хранения данных с открытым исходным кодом. Она реализует объектное хранилище на распределенном компьютерном кластере и предоставляет интерфейс для трех типов хранилищ: блочных, объектных и файловых. Цель Ceph — предоставить бесплатную распределенную платформу хранения данных без единой точки отказа, обладающую высокой масштабируемостью и гарантирующую сохранность ваших данных.
В этой статье мы рассмотрим архитектуру Ceph, настроим собственный кластер хранения Ceph и обсудим архитектурные решения, которые вам неизбежно придётся принять. Мы развернём Ceph в кластере Kubernetes, используя облачный оркестратор хранения Rook.
В кластере Ceph есть основные 3 роли которые может иметь узел:
Так же есть 2 дополнительные роли:
Нужны ли RGW и MDS для Kubernetes?
На текущий момент существует 3 подхода (+ RGW для организации S3 хранилища) к их связи:
Способ | Простота | Подходит для | Нужные компоненты Ceph |
---|---|---|---|
RBD (вручную) | Средняя | Блочные диски (аналог EBS) | MON, OSD, MGR |
Ceph CSI (RBD) | Лучший вариант | Автоматическое управление томами | MON, OSD, MGR |
CephFS | Сложнее | Файловое хранилище (аналог NFS) | MON, OSD, MGR, MDS |
RGW (S3) | Отдельная тема | Объектное хранилище (аналог MinIO) | MON, OSD, MGR, RGW |
Самый походящий способом связывания сегодня это использование CSI (Container Storage Interface) драйвера, который позволяет динамически управлять хранилищем. Это обеспечивает гибкость и масштабируемость, что делает его лучшей практикой для продакшн-сред. За нас это все настроит Rook.
На каждой машине нашего кластера будут работать все три демона. Соответственно, демоны монитора и менеджера как служебные, и демоны OSD для дисков нашей виртуальной машины. Используемый дистрибутив - Red Hat Enterprise Linux 10.0.
Развертывание будет осуществляться с помощью Rook. Документация расположена тут.
Перед началом на каждом сервере должно быть корректное время. Желательно использование одного и того же NTP сервера.
На каждом узле рекомендуется иметь по 3 диска. 1 - Система, 2 - Хранилище, 3 - Хранилище + Журнал
К тому же, если OSD (дисков) в кластере будет меньше 4, то будет использоваться репликация, за место эффективного Erasure Coding.
Актуальную версию Ceph можно узнать на официальном сайте.
Узлы которые будут использоваться с ролью OSD, нужно подготовить к добавлению в кластер Ceph.
Диски которые будут использоваться в качестве хранилища должны быть подключены к машинам, но не иметь на них данных (ни ФС, ни таблицы разделов). Если на них что-то есть, то данные будут автоматически стерты (я не проверял, но должно быть именно так).
У вас уже должен быть установлен Helm кластере.
На любой из Control Plane (или на удаленном узле с kubeconfig) выполните установку Rook Operator:
# Создаем namespace для Rook
kubectl create namespace rook-ceph
# Добавляем репозиторий Rook (если еще не добавлен)
helm repo add rook-release https://charts.rook.io/release
# Устанавливаем Rook Operator с помощью Helm
helm install --create-namespace --namespace rook-ceph rook-ceph rook-release/rook-ceph --version v1.7.4
Создаем файл cluster.yaml:
apiVersion: ceph.rook.io/v1
kind: CephCluster
metadata:
name: rook-ceph
namespace: rook-ceph
spec:
dataDirHostPath: /var/lib/rook
mon:
count: 3
# запрещает размещать несколько MON на одном узле (правильно для production)
allowMultiplePerNode: false
volumeClaimTemplate:
spec:
storageClassName: ""
resources:
requests:
storage: 10Gi # Место под служебные данные мониторов (рассчитываете самостоятельно)
cephVersion:
image: quay.io/ceph/ceph:v19.2.2
allowUnsupported: false
dashboard:
enabled: true
ssl: true
monitoring:
enabled: true
network:
provider: host
storage:
useAllNodes: false
useAllDevices: false
nodes:
- name: "ceph-1.k8s.rhel"
devices:
- name: "sdb"
- name: "sdc"
config:
osdsPerDevice: "1" # 1 OSD на устройство
- name: "ceph-2.k8s.rhel"
devices:
- name: "sdb"
- name: "sdc"
config:
osdsPerDevice: "1"
- name: "ceph-3.k8s.rhel"
devices:
- name: "sdb"
- name: "sdc"
config:
osdsPerDevice: "1"
mgr:
modules:
- name: pg_autoscaler
enabled: true
- name: prometheus # Для мониторинга
enabled: true
resources:
# Ограничения ресурсов для 4CPU/4RAM нод
mon:
limits:
cpu: "1"
memory: "2Gi"
requests:
cpu: "500m"
memory: "1Gi"
mgr:
limits:
cpu: "1"
memory: "2Gi"
requests:
cpu: "500m"
memory: "1Gi"
osd:
limits:
cpu: "2" # OSD требуют больше CPU
memory: "2Gi"
requests:
cpu: "1"
memory: "1Gi"
# Для малого кластера стоит уменьшить стандартные тайминиги
# (в большом это можно не указывать)
healthCheck:
daemonHealth:
mon:
interval: "45s"
osd:
interval: "60s"
status:
interval: "60s"
disruptionManagement:
managePodBudgets: true
osdMaintenanceTimeout: 30
Примените манифест:
kubectl apply -f cluster.yaml
После чего подождите пару минут.
Для проверки можете использовать:
# Проверяем состояние подов
kubectl -n rook-ceph get pods
# Проверяем состояние кластера Ceph
kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- ceph status
# Проверяем OSD
kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- ceph osd status
Дождитесь пока все поды будут в состоянии Running или Completed.