Модуль CEPH CSI

В платформе “Штурвал” в кластере доступны для установки драйверы Ceph Container Storage Interface (CSI) для RBD, CephFS:

  • Модуль Ceph CSI - CephFS (shturval-ceph-cephfs);
  • Модуль Ceph CSI - CephRBD (shturval-ceph-rbd).

В кластерах Kubernetes модули позволяют использовать виртуальный жесткий диск (RBD) или сетевую файловую систему (FS) для хранения данных.

Модули Ceph CSI не являются критически важными сервисами для работы платформы “Штурвал”. Для корректной работы Модулей Ceph CSI в кластере должен работать Модуль управления сетями кластера (shturval-networking).

Обратите внимание! До настройки shturval-ceph-cephfs в платформе “Штурвал”, при конфигурации Storage на стороне CephFS должна быть создана группа подтомов (subvolumegroup) с именем “csi”.

Команда создания subvolumegroup
ceph fs subvolumegroup create ВВЕДИТЕ-ИМЯ-ФАЙЛОВОЙ-СИСТЕМЫ csi

Если при создании кластера были установлены Модули Ceph CSI, то в созданном кластере ручной настройки не потребуется.

Чтобы включить модули в созданном кластере, в графическом интерфейсе платформы перейдите в раздел Сервисы и репозитории и откройте страницу Установленные сервисы и найдите Модуль Ceph CSI.

Для установки выберите необходимый чарт (shturval-ceph-cephfs или shturval-ceph-rbd) и нажмите Управлять. В открывшемся окне выберите нужную версию. Рекомендуется создать для устанавливаемого чарта новый неймспейс.

После выбора версий в правой стороне экрана появятся доступные values чарта. Ниже представлены рекомендуемые параметры для конфигурации.

CEPH FS

Пример customvalues
csiConfig:
  - clusterID: <ваше значение параметра>
    monitors:
      - <ваше значение параметра>
      - <ваше значение параметра>
      - <ваше значение параметра>
secret:
  # Specifies whether the secret should be created
  create: true
  name: <ваше значение параметра>
  # Key values correspond to a user name and its key, as defined in the
  # ceph cluster. User ID should have required access to the 'pool'
  # specified in the storage class
  adminID: <ваше значение параметра>
  adminKey: <ваше значение параметра>
cephconf: |
    <ваша конфигурация кластера ceph>

    # Workaround for http://tracker.ceph.com/issues/23446
    fuse_set_user_groups = false

    # ceph-fuse which uses libfuse2 by default has write buffer size of 2KiB
    # adding 'fuse_big_writes = true' option by default to override this limit
    # see https://github.com/ceph/ceph-csi/issues/1928
    fuse_big_writes = true    
storageClass:
  # Specifies whether the Storage class should be created
  create: true
  name: <ваше значение параметра>
  # Annotations for the storage class
  # Example:
  # annotations:
  #   storageclass.kubernetes.io/is-default-class: "true"
  annotations: {}

  # String representing a Ceph cluster to provision storage from.
  # Should be unique across all Ceph clusters in use for provisioning,
  # cannot be greater than 36 bytes in length, and should remain immutable for
  # the lifetime of the StorageClass in use.
  clusterID: <ваше значение параметра>
  # (required) CephFS filesystem name into which the volume shall be created
  # eg: fsName: myfs
  fsName: <ваше значение параметра>
  # (optional) Ceph pool into which volume data shall be stored
  # pool: <cephfs-data-pool>
  # For eg:
  # pool: "replicapool"
  pool: ""
  # (optional) Comma separated string of Ceph-fuse mount options.
  # For eg:
  # fuseMountOptions: debug
  fuseMountOptions: ""
  # (optional) Comma separated string of Cephfs kernel mount options.
  # Check man mount.ceph for mount options. For eg:
  # kernelMountOptions: readdir_max_bytes=1048576,norbytes
  kernelMountOptions: ""
  # (optional) The driver can use either ceph-fuse (fuse) or
  # ceph kernelclient (kernel).
  # If omitted, default volume mounter will be used - this is
  # determined by probing for ceph-fuse and mount.ceph
  # mounter: kernel
  mounter: ""
  # (optional) Prefix to use for naming subvolumes.
  # If omitted, defaults to "csi-vol-".
  # volumeNamePrefix: "foo-bar-"
  volumeNamePrefix: <ваше значение параметра>
  # The secrets have to contain user and/or Ceph admin credentials.
  provisionerSecret: <ваше значение параметра>
  # If the Namespaces are not specified, the secrets are assumed to
  # be in the Release namespace.
  provisionerSecretNamespace: ""
  controllerExpandSecret: <ваше значение параметра>
  controllerExpandSecretNamespace: ""
  nodeStageSecret: <ваше значение параметра>
  nodeStageSecretNamespace: ""
  reclaimPolicy: <ваше значение параметра>
  allowVolumeExpansion: true
  mountOptions: []
  # Mount Options
  # Example:
  # mountOptions:
  #   - discard
nodeplugin:
  tolerations:
  - key: <ваше значение параметра>
    operator: <ваше значение параметра>
    value: <ваше значение параметра>
    effect: <ваше значение параметра>
ПараметрОписаниеТип данныхПример
clusterIDУникальный идентификатор кластера Cephstringmy-cluster-id
monitorsСписок IP-адресов мониторинга Cepharray192.168.1.1
secret.nameИмя создаваемого секретаstringceph-secret
secret.adminIDИдентификатор сервисной учетной записи для доступа к Cephstringclient.admin
secret.adminKeyКлюч сервисной учетной записи для доступа к Cephstringsdfdff
cephconfКонфигурация Ceph в тектовом форматеstring[global] auth cluster required = cephx auth service required = cephx auth client required = cephx
storageClass.nameИмя создаваемого Storage Classstringcsi-cephfs-sc
storageClass.clusterIDИдентификатор кластера Cephstringcluster-id
storageClass.fsNameИмя файловой системы CephFS, в которую будет создан PVstringmyfs
storageClass.volumeNamePrefixПрефикс для имен томовstringshturval-
storageClass.provisionerSecretСекрет для Provisioning с учетными данными пользователя и/или администратора Cephstringcephfs-secret
storageClass.provisionerSecretNamespaceНеймспейс, в котором находится секрет для Provisioning с учетными данными пользователя и/или администратора Ceph. Если неймспейс не указан, предполагается, что секрет находится в неймспейсе “Release”stringnamenamespace
storageClass.controllerExpandSecretСекрет для расширения контроллераstringceph-expand-secret
storageClass.controllerExpandSecretNamespaceНеймспейс, в котором находится секрет для расширения контроллера. Если неймспейс не указан, предполагается, что секрет находится в неймспейсе “Release”stringnamenamespace
storageClass.nodeStageSecretСекрет для монтирования узлаstringcsi-cephfs-secret
storageClass.controllerExpandSecretNamespaceНеймспейс, в котором находится секрет Секрет для монтирования узла. Если неймспейс не указан, предполагается, что секрет находится в неймспейсе “Release”stringnamenamespace
storageClass.reclaimPolicyПолитика управления жизненным циклом тома (возможные значения: Retain, Delete, Recycle)stringDelete
nodeplugin.tolerations.keyКлюч toleration (разрешение размещения)stringrole
nodeplugin.tolerations.operatorОператор проверки условия tolerationstringEqual
nodeplugin.tolerations.valueЗначение ключа tolerationstringinfra
nodeplugin.tolerations.effectЭффект tolerationstringNoSchedule

Требования к правам доступа сервисной учетной записи

client.kubecephfs mon ‘allow r’ mgr ‘allow rw’ mds ‘allow rws’ osd ‘allow rw pool=cephfs_data, allow rw pool=cephfs_metadata’

CEPH RBD

Пример customvalues
csiConfig:
  - clusterID: <ваше значение параметра>
    monitors:
      - <ваше значение параметра>
      - <ваше значение параметра>
      - <ваше значение параметра>
storageClass:
  # Specifies whether the storageclass should be created
  create: true
  name: <ваше значение параметра>

  # Use Thick Provisioning for this storage class. Default: false. Enabled if not false.
  thickProvision: false

  # Annotations for the storage class
  # Example:
  # annotations:
  #   storageclass.kubernetes.io/is-default-class: "true"
  annotations: {}

  # (required) String representing a Ceph cluster to provision storage from.
  # Should be unique across all Ceph clusters in use for provisioning,
  # cannot be greater than 36 bytes in length, and should remain immutable for
  # the lifetime of the StorageClass in use.
  clusterID: <ваше значение параметра>

  # (optional) If you want to use erasure coded pool with RBD, you need to
  # create two pools. one erasure coded and one replicated.
  # You need to specify the replicated pool here in the `pool` parameter, it is
  # used for the metadata of the images.
  # The erasure coded pool must be set as the `dataPool` parameter below.
  # dataPool: <ec-data-pool>
  dataPool: ""

  # (required) Ceph pool into which the RBD image shall be created
  # eg: pool: replicapool
  pool:  <ваше значение параметра>

  # (optional) RBD image features, CSI creates image with image-format 2 CSI
  # RBD currently supports `layering`, `journaling`, `exclusive-lock`,
  # `object-map`, `fast-diff`, `deep-flatten` features.
  # Refer https://docs.ceph.com/en/latest/rbd/rbd-config-ref/#image-features
  # for image feature dependencies.
  # imageFeatures: layering,journaling,exclusive-lock,object-map,fast-diff
  imageFeatures: ""

  # (optional) Specifies whether to try other mounters in case if the current
  # mounter fails to mount the rbd image for any reason. True means fallback
  # to next mounter, default is set to false.
  # Note: tryOtherMounters is currently useful to fallback from krbd to rbd-nbd
  # in case if any of the specified imageFeatures is not supported by krbd
  # driver on node scheduled for application pod launch, but in the future this
  # should work with any mounter type.
  # tryOtherMounters: false

  # (optional) uncomment the following to use rbd-nbd as mounter
  # on supported nodes
  # mounter: rbd-nbd
  mounter: ""

  # (optional) ceph client log location, eg: rbd-nbd
  # By default host-path /var/log/ceph of node is bind-mounted into
  # csi-rbdplugin pod at /var/log/ceph mount path. This is to configure
  # target bindmount path used inside container for ceph clients logging.
  # See docs/rbd-nbd.md for available configuration options.
  # cephLogDir: /var/log/ceph
  cephLogDir: ""

  # (optional) ceph client log strategy
  # By default, log file belonging to a particular volume will be deleted
  # on unmap, but you can choose to just compress instead of deleting it
  # or even preserve the log file in text format as it is.
  # Available options `remove` or `compress` or `preserve`
  # cephLogStrategy: remove
  cephLogStrategy: ""

  # (optional) Prefix to use for naming RBD images.
  # If omitted, defaults to "csi-vol-".
  # volumeNamePrefix: "foo-bar-"
  volumeNamePrefix: ""

  # (optional) Instruct the plugin it has to encrypt the volume
  # By default it is disabled. Valid values are "true" or "false".
  # A string is expected here, i.e. "true", not true.
  # encrypted: "true"
  encrypted: ""

  # (optional) Use external key management system for encryption passphrases by
  # specifying a unique ID matching KMS ConfigMap. The ID is only used for
  # correlation to configmap entry.
  encryptionKMSID: ""
  

  # Add topology constrained pools configuration, if topology based pools
  # are setup, and topology constrained provisioning is required.
  # For further information read TODO<doc>
  # topologyConstrainedPools: |
  #   [{"poolName":"pool0",
  #     "dataPool":"ec-pool0" # optional, erasure-coded pool for data
  #     "domainSegments":[
  #       {"domainLabel":"region","value":"east"},
  #       {"domainLabel":"zone","value":"zone1"}]},
  #    {"poolName":"pool1",
  #     "dataPool":"ec-pool1" # optional, erasure-coded pool for data
  #     "domainSegments":[
  #       {"domainLabel":"region","value":"east"},
  #       {"domainLabel":"zone","value":"zone2"}]},
  #    {"poolName":"pool2",
  #     "dataPool":"ec-pool2" # optional, erasure-coded pool for data
  #     "domainSegments":[
  #       {"domainLabel":"region","value":"west"},
  #       {"domainLabel":"zone","value":"zone1"}]}
  #   ]
  topologyConstrainedPools: []

  # (optional) mapOptions is a comma-separated list of map options.
  # For krbd options refer
  # https://docs.ceph.com/docs/master/man/8/rbd/#kernel-rbd-krbd-options
  # For nbd options refer
  # https://docs.ceph.com/docs/master/man/8/rbd-nbd/#options
  # Format:
  # mapOptions: "<mounter>:op1,op2;<mounter>:op1,op2"
  # An empty mounter field is treated as krbd type for compatibility.
  # eg:
  # mapOptions: "krbd:lock_on_read,queue_depth=1024;nbd:try-netlink"
  mapOptions: ""

  # (optional) unmapOptions is a comma-separated list of unmap options.
  # For krbd options refer
  # https://docs.ceph.com/docs/master/man/8/rbd/#kernel-rbd-krbd-options
  # For nbd options refer
  # https://docs.ceph.com/docs/master/man/8/rbd-nbd/#options
  # Format:
  # unmapOptions: "<mounter>:op1,op2;<mounter>:op1,op2"
  # An empty mounter field is treated as krbd type for compatibility.
  # eg:
  # unmapOptions: "krbd:force;nbd:force"
  unmapOptions: ""

  # The secrets have to contain Ceph credentials with required access
  # to the 'pool'.
  provisionerSecret: <ваше значение параметра>
  # If Namespaces are left empty, the secrets are assumed to be in the
  # Release namespace.
  provisionerSecretNamespace: <ваше значение параметра>
  controllerExpandSecret: <ваше значение параметра>
  controllerExpandSecretNamespace: <ваше значение параметра>
  nodeStageSecret: <ваше значение параметра>
  nodeStageSecretNamespace: <ваше значение параметра>
  # Specify the filesystem type of the volume. If not specified,
  # csi-provisioner will set default as `ext4`.
  fstype: <ваше значение параметра>
  reclaimPolicy: <ваше значение параметра>
  allowVolumeExpansion: true
  mountOptions: []
  # Mount Options
  # Example:
  # mountOptions:
  #   - discard

# Mount the host /etc/selinux inside pods to support
# selinux-enabled filesystems
selinuxMount: true

secret:
  # Specifies whether the secret should be created
  create: true
  name: <ваше значение параметра>
  # Key values correspond to a user name and its key, as defined in the
  # ceph cluster. User ID should have required access to the 'pool'
  # specified in the storage class
  userID: <ваше значение параметра>
  userKey: <ваше значение параметра>
  # Encryption passphrase
  # encryptionPassphrase: test_passphrase

# This is a sample configmap that helps define a Ceph configuration as required
# by the CSI plugins.
# Sample ceph.conf available at
# https://github.com/ceph/ceph/blob/master/src/sample.ceph.conf Detailed
# documentation is available at
# https://docs.ceph.com/en/latest/rados/configuration/ceph-conf/
cephconf: |
    <ваша конфигурация кластера ceph>
nodeplugin:
  tolerations:
  - key: <ваше значение параметра>
    operator: <ваше значение параметра>
    value: <ваше значение параметра>
    effect: <ваше значение параметра>
ПараметрОписаниеТип данныхПример
clusterIDУникальный идентификатор кластера Cephstringmy-cluster-id
monitorsСписок IP-адресов мониторинга Cepharray192.168.1.1
secret.nameИмя создаваемого секретаstringcephrbd-secret
secret.userIDИдентификатор сервисной учетной записи для доступа к Cephstringclient.admin
secret.userKeyКлюч сервисной учетной записи для доступа к Cephstringsdfdff
cephconfКонфигурация Ceph в текстовом форматеstring[global] auth cluster required = cephx auth service required = cephx auth client required = cephx
storageClass.nameИмя создаваемого Storage Classstringcsi-cephrbd-sc
storageClass.clusterIDИдентификатор кластера Cephstringcluster-id
storageClass.poolПул Ceph, в котором должен быть создан RBD-образstringkuberbd
storageClass.provisionerSecretСекрет для Provisioning с учетными данными пользователя и/или администратора Cephstringcsi-rbd-secret
storageClass.provisionerSecretNamespaceНеймспейс, в котором находится секрет для Provisioning с учетными данными пользователя и/или администратора Ceph. Если неймспейс не указан, предполагается, что секрет находится в неймспейсе “Release”stringnamenamespace
storageClass.controllerExpandSecretСекрет для расширения контроллераstringceph-expand-secret
storageClass.controllerExpandSecretNamespaceНеймспейс, в котором находится секрет для расширения контроллера. Если неймспейс не указан, предполагается, что секрет находится в неймспейсе “Release”stringnamenamespace
storageClass.nodeStageSecretСекрет для монтирования узлаstringcsi-cephrbd-secret
storageClass.controllerExpandSecretNamespaceНеймспейс, в котором находится секрет Секрет для монтирования узла. Если неймспейс не указан, предполагается, что секрет находится в неймспейсе “Release”stringnamenamespace
storageClass.fstypeТип файловой системы тома. По умолчанию ext4stringext4
storageClass.reclaimPolicyПолитика управления жизненным циклом тома (возможные значения: Retain, Delete, Recycle)stringDelete
nodeplugin.tolerations.keyКлюч toleration (разрешение размещения)stringrole
nodeplugin.tolerations.operatorОператор проверки условия tolerationstringEqual
nodeplugin.tolerations.valueЗначение ключа tolerationstringinfra
nodeplugin.tolerations.effectЭффект toleration. Допустимые значения: NoSchedule, PreferNoSchedule, NoExecutestringNoSchedule

Требования к правам доступа сервисной учетной записи

client.kuberbd mon ‘profile rbd’ osd ‘profile rbd pool=kuberbd’

Особенности настройки

Если необходимо подключить несколько экземпляров CEPH FS или CEPH RBD в одном кластере:

  1. Установите экземпляры сервисов в разные неймспейсы кластера.
  2. В параметр driverName пропишите произвольные различные между экземплярами сервисов значения.
  3. Значение порта в параметре nodePlugin.httpMetrics.ContainerPort сделайте уникальным для каждого экземпляра сервиса.