CSI для S3

Это интерфейс контейнерного хранилища CSI для S3 (или S3-совместимого) хранилища. Он может динамически выделять бакеты и монтировать их с помощью fuse mount в любой контейнер.

1. Предварительные условия

  • У вас есть доступ к кластеру с учетной записью, имеющей роль cluster-admin в Kubernetes.

  • Вы установили утилиту kubectl для работы с Kubernetes.

  • У вас есть доступ в S3 бакет с правами управления хранилища и настройки доступа к API.

2. Автоматическая установка

Установите Helm chart опубликованный в GitHub:

helm repo add yandex-s3 https://yandex-cloud.github.io/k8s-csi-s3/charts
helm install csi-s3 yandex-s3/csi-s3

3. Ручная установка

  1. Клонируйте репозиторий:

    git clone https://github.com/yandex-cloud/k8s-csi-s3.git
  2. Создайте секрет с учетными данными S3.

    apiVersion: v1
    kind: Secret
    metadata:
      name: csi-s3-secret
      namespace: kube-system
    stringData:
      accessKeyID: <project>:<client_id> (1)
      secretAccessKey: <client_secret_key> (1)
      endpoint: https://s3.k2.cloud (2)
    1 Данные API.
    2 Ссылка на S3 endpoint в выбранном облаке.
  3. Перейдите в репозиторий и установите драйвер в кластер.

    kubectl create -f deploy/kubernetes/provisioner.yaml
    kubectl create -f deploy/kubernetes/driver.yaml
    kubectl create -f deploy/kubernetes/csi-s3.yaml
  4. Создайте Storage Class.

    kubectl create -f deploy/kubernetes/examples/storageclass.yaml

4. Тестирование

  1. Создайте PVC используя новый Storage Class:

    kubectl create -f deploy/kubernetes/examples/pvc.yaml
  2. Проверьте привязки PVC:

    $ kubectl get pvc csi-s3-pvc
    NAME         STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    csi-s3-pvc   Bound     pvc-c5d4634f-8507-11e8-9f33-0e243832354b   5Gi        RWO            csi-s3         9s
  3. Создайте тестовый под, в который монтируется том:

    kubectl create -f deploy/kubernetes/examples/pod.yaml
  4. Проверьте состояние пода. Если он запущен, значит проблем с интеграцией нет.

  5. Убедитесь, что там смонтирован:

    $ kubectl exec -ti csi-s3-test-nginx bash
    $ mount | grep fuse
    pvc-035763df-0488-4941-9a34-f637292eb95c: on /usr/share/nginx/html/s3 type fuse.geesefs (rw,nosuid,nodev,relatime,user_id=65534,group_id=0,default_permissions,allow_other)
    $ touch /usr/share/nginx/html/s3/hello_world

5. Дополнительная конфигурация

5.1. Бакет

По умолчанию, csi-s3 создаст новый бакет для каждого тома. Имя бакета будет соответствовать ID тома. Если вы хотите, чтобы ваши тома находились в заранее созданном бакете, то вы можете просто указать бакет в параметрах Storage Class:

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: csi-s3-existing-bucket
provisioner: ru.yandex.s3.csi
parameters:
  mounter: geesefs
  options: "--memory-limit 1000 --dir-mode 0777 --file-mode 0666"
  bucket: some-existing-bucket-name

Если имя бакета указано, он будет создан, если не существует на бэкенде. Каждый том получит свой префикс в бакете, соответствующий идентификатору тома. При удалении тома также будет удален только префикс.

5.2. Статическая инициализация

Если вы хотите смонтировать уже существующий бакет или префикс внутри уже существующего бакета и не хотите, чтобы csi-s3 удалял его при удалении PV, вы можете использовать статическую инициализацию.

Для этого нужно исключить storageClassName в PersistentVolumeClaim и вручную создать PersistentVolume с соответствующим claimRef, как в следующем примере: deploy/kubernetes/examples/pvc-manual.yaml.

6. Устранение неполадок

6.1. Проблемы при создании PVC

Проверьте журналы провайдера:

kubectl logs -l app=csi-provisioner-s3 -c csi-s3

6.2. Проблемы при создании контейнеров

  1. Убедитесь, что для параметра MountPropagation не установлено значение false.

  2. Проверьте журналы S3-драйвера:

    kubectl logs -l app=csi-s3 -c csi-s3