Ceph — это масштабируемая распределённая система хранения с высокой доступностью и отказоустойчивостью. Deckhouse Kubernetes Platform (DKP) обеспечивает интеграцию Ceph-кластера при помощи модуля csi-ceph. Это даёт возможность динамически управлять хранилищем и использовать StorageClass на основе RADOS Block Device (RBD) или CephFS.

На этой странице представлены инструкции по подключению Ceph в Deckhouse, настройке аутентификации, созданию объектов StorageClass, а также проверке работоспособности хранилища.

Для работы со снимками требуется подключенный модуль snapshot-controller.

Миграция с модуля ceph-csi

При переключении на модуль csi-ceph с модуля ceph-csi выполняется автоматическая миграция, но её запуск требует предварительной подготовки:

  1. Установите количество реплик в ноль для всех операторов (redis, clickhouse, kafka и др.). Исключение: оператор prometheus будет отключён автоматически.

  2. Отключите модуль ceph-csi и включите csi-ceph.

  3. Дождитесь завершения операции. В логах DKP должно появиться сообщение “Finished migration from Ceph CSI module”.

  4. Проверьте работоспособность. Для этого создайте тестовые поды и PVC для проверки CSI.

  5. Верните операторы в рабочее состояние (установите количество реплик обратно).

Если Ceph StorageClass был создан не через ресурс CephCSIDriver, потребуется ручная миграция. Обратитесь в техподдержку.

Подключение к Ceph-кластеру

Для подключения Ceph-кластера следуйте пошаговым инструкциям ниже. Все команды выполняйте на машине с административным доступом к API Kubernetes.

  1. Выполните команду для активации модуля csi-ceph:

    d8 s module enable csi-ceph
    
  2. Дождитесь перехода модуля в состояние Ready:

    d8 k get module csi-ceph -w
    
  3. Убедитесь, что все поды в пространстве имён d8-csi-ceph находятся в состоянии Running или Completed и развёрнуты на всех узлах кластера:

    d8 k -n d8-csi-ceph get pod -owide -w
    
  4. Для настройки подключения к Ceph-кластеру примените ресурс CephClusterConnection.

    Пример команды:

    d8 k apply -f - <<EOF
    apiVersion: storage.deckhouse.io/v1alpha1
    kind: CephClusterConnection
    metadata:
      name: ceph-cluster-1
    spec:
      # FSID/UUID Ceph-кластера.
      # Получить FSID/UUID Ceph-кластера можно с помощью команды `ceph fsid`.
      clusterID: 2bf085fc-5119-404f-bb19-820ca6a1b07e
      # Список IP-адресов ceph-mon в формате 10.0.0.10:6789.
      monitors:
        - 10.0.0.10:6789
      # Имя пользователя без `client.`.
      # Получить имя пользователя можно с помощью команды `ceph auth list`.
      userID: admin
      # Ключ авторизации, соответствующий userID.
      # Получить ключ авторизации можно с помощью команды `ceph auth get-key client.admin`.
      userKey: AQDiVXVmBJVRLxAAg65PhODrtwbwSWrjJwssUg==
    EOF
    
  5. Проверьте создание подключения командой (Phase должна быть в статусе Created):

    d8 k get cephclusterconnection ceph-cluster-1
    
  6. Создайте объект StorageClass при помощи ресурса CephStorageClass. Ручное создание StorageClass без использования CephStorageClass может привести к ошибкам.

    Пример создания StorageClass на основе RBD:

    d8 k apply -f - <<EOF
    apiVersion: storage.deckhouse.io/v1alpha1
    kind: CephStorageClass
    metadata:
      name: ceph-rbd-sc
    spec:
      clusterConnectionName: ceph-cluster-1
      reclaimPolicy: Delete
      type: RBD
      rbd:
        defaultFSType: ext4
        pool: ceph-rbd-pool
    EOF
    

    Пример создания StorageClass на основе файловой системы Ceph:

    d8 k apply -f - <<EOF
    apiVersion: storage.deckhouse.io/v1alpha1
    kind: CephStorageClass
    metadata:
      name: ceph-fs-sc
    spec:
      clusterConnectionName: ceph-cluster-1
      reclaimPolicy: Delete
      type: CephFS
      cephFS:
        fsName: cephfs
    EOF
    
  7. Проверьте, что созданные ресурсы CephStorageClass перешли в состояние Created:

    d8 k get cephstorageclass
    

    В результате будет выведена информация о созданных ресурсах CephStorageClass:

    NAME          PHASE     AGE
    ceph-rbd-sc   Created   1h
    ceph-fs-sc    Created   1h
    
  8. Проверьте созданный StorageClass:

    d8 k get sc
    

    В результате будет выведена информация о созданном StorageClass:

    NAME          PROVISIONER        RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
    ceph-rbd-sc   rbd.csi.ceph.com   Delete          WaitForFirstConsumer   true                   15s
    ceph-fs-sc    rbd.csi.ceph.com   Delete          WaitForFirstConsumer   true                   15s
    

Настройка подключения к Ceph-кластеру завершена. Вы можете использовать созданный StorageClass для создания PersistentVolumeClaim в ваших приложениях.

Дополнительная информация

Получение списка томов RBD, разделённого по узлам

Для мониторинга и диагностики полезно знать, какие RBD-тома подключены к каждому узлу кластера. Следующая команда позволяет получить детальную информацию о маппинге томов:

d8 k -n d8-csi-ceph get po -l app=csi-node-rbd -o custom-columns=NAME:.metadata.name,NODE:.spec.nodeName --no-headers \
  | awk '{print "echo "$2"; kubectl -n d8-csi-ceph exec  "$1" -c node -- rbd showmapped"}' | bash

Поддерживаемые версии Ceph-кластеров

Модуль csi-ceph предъявляет требования к версии Ceph-кластера, чтобы обеспечить совместимость и стабильную работу. Официально поддерживаются версии Ceph >= 16.2.0. На практике текущая версия модуля обычно работает и с кластерами >= 14.2.0, но для надёжной эксплуатации рекомендуется обновить Ceph до актуальной поддерживаемой версии.

Поддерживаемые режимы работы томов

Различные типы хранилища Ceph поддерживают разные режимы доступа к томам, что важно учитывать при планировании архитектуры приложений.

  • RBD — поддерживает только ReadWriteOnce (RWO) — доступ к тому только с одного узла кластера.
  • CephFS — поддерживает ReadWriteOnce (RWO) и ReadWriteMany (RWX) — одновременный доступ к тому с нескольких узлов кластера.

Разрешения (caps) для пользователей в Ceph

Для обеспечения корректной работы модуля csi-ceph пользователи Ceph должны иметь соответствующие разрешения (caps). Необходимые разрешения зависят от используемого типа хранилища. Ниже приведены примеры правильных конфигураций разрешений для различных сценариев.

RBD

Для одного пула с названием rbd требуются следующие разрешения:

[client.name]
        key = key
        caps mgr = "profile rbd pool=rbd"
        caps mon = "profile rbd"
        caps osd = "profile rbd pool=rbd"

CephFS

Перед настройкой разрешений CephFS убедитесь, что в CephFS создан subvolumegroup csi (или другой, указанный в Custom resources).

Создать новый subvolumegroup можно командой на узле управления Ceph:

ceph fs subvolumegroup create <fs_name> <group_name>

Например, для создания subvolumegroup csi для файловой системы myfs:

ceph fs subvolumegroup create myfs csi

Требуемые разрешения для CephFS с названием myfs:

[client.name]
        key = key
        caps mds = "allow rwps fsname=myfs"
        caps mgr = "allow rw"
        caps mon = "allow r fsname=myfs"
        caps osd = "allow rw tag cephfs data=myfs, allow rw tag cephfs metadata=myfs"

CephFS + RBD

Для пользователя, которому необходим доступ к CephFS myfs и RBD пулу rbd, объедините разрешения следующим образом:

[client.name]
        key = key
        caps mds = "allow rwps fsname=myfs"
        caps mgr = "allow rw,profile rbd pool=rbd"
        caps mon = "allow r fsname=myfs,profile rbd"
        caps osd = "allow rw tag cephfs metadata=myfs, allow rw tag cephfs data=myfs,profile rbd pool=rbd"