Интеграция с Object Storage
Container Storage Interface позволяет динамически резервировать бакеты Yandex Object Storage и монтировать их к подам кластера Managed Service for Kubernetes. При этом можно монтировать уже существующие бакеты или создавать новые.
Чтобы воспользоваться возможностями Container Storage Interface:
См. также:
- Как использовать Container Storage Interface при работе с 
PersistentVolume. - Примеры создания 
PersistentVolume. 
Подготовка рабочего окружения
- Создайте сервисный аккаунт с ролью 
storage.editor. - Создайте статический ключ доступа для сервисного аккаунта. Сохраните идентификатор ключа и секретный ключ — они понадобятся при установке Container Storage Interface.
 - Создайте бакет Object Storage, который будет смонтирован к 
PersistentVolume. Сохраните имя бакета — оно понадобится при установке Container Storage Interface. - 
Установите kubectl
 и настройте его на работу с созданным кластером. 
Настройка Container Storage Interface
- 
Создайте файл
secret.yaml, в котором укажите настройки доступа для Container Storage Interface:--- apiVersion: v1 kind: Secret metadata: namespace: kube-system name: csi-s3-secret stringData: accessKeyID: <идентификатор_ключа_доступа> secretAccessKey: <секретный_ключ> endpoint: https://storage.yandexcloud.kzВ полях
accessKeyIDиsecretAccessKeyукажите полученные ранее идентификатор и значение секретного ключа. - 
Создайте файл с описанием класса хранилища
storageclass.yaml:--- kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: csi-s3 provisioner: ru.yandex.s3.csi parameters: mounter: geesefs options: "--memory-limit=1000 --dir-mode=0777 --file-mode=0666" bucket: <имя_существующего_бакета> csi.storage.k8s.io/provisioner-secret-name: csi-s3-secret csi.storage.k8s.io/provisioner-secret-namespace: kube-system csi.storage.k8s.io/controller-publish-secret-name: csi-s3-secret csi.storage.k8s.io/controller-publish-secret-namespace: kube-system csi.storage.k8s.io/node-stage-secret-name: csi-s3-secret csi.storage.k8s.io/node-stage-secret-namespace: kube-system csi.storage.k8s.io/node-publish-secret-name: csi-s3-secret csi.storage.k8s.io/node-publish-secret-namespace: kube-systemПараметр
bucketопциональный. Задайте его, чтобы использовать существующий бакет. Эта настройка актуальна только для динамическихPersistentVolume. - 
Клонируйте GitHub-репозиторий
 , содержащий актуальный драйвер Container Storage Interface:git clone https://github.com/yandex-cloud/k8s-csi-s3.git - 
Создайте ресурсы для Container Storage Interface и класс хранилища:
kubectl create -f secret.yaml && \ kubectl create -f k8s-csi-s3/deploy/kubernetes/provisioner.yaml && \ kubectl create -f k8s-csi-s3/deploy/kubernetes/driver.yaml && \ kubectl create -f k8s-csi-s3/deploy/kubernetes/csi-s3.yaml && \ kubectl create -f storageclass.yamlПосле установки драйвера Container Storage Interface и настройки класса хранилища можно создавать статические и динамические
PersistentVolume, которые будут использовать бакеты Object Storage. 
Использование Container Storage Interface
При настроенном Container Storage Interface создание статических и динамических PersistentVolumes имеет свои особенности.
Динамический PersistentVolume
При работе с динамическим PersistentVolume:
- Укажите имя нужного класса хранилища в параметре 
spec.storageClassNameпри созданииPersistentVolumeClaim. - При необходимости укажите имя бакета в параметре 
bucket(в настройках приложения Yandex Cloud Marketplace — поле Общий бакет S3 для томов) при создании класса хранилища. Это влияет на поведение Container Storage Interface:- 
Если при настройке класса хранилища было указано имя бакета, Container Storage Interface создаст отдельный каталог внутри этого бакета на каждый созданный
PersistentVolume. - 
Если при настройке класса хранилища не было указано имя бакета, то Container Storage Interface создаст отдельный бакет на каждый созданный
PersistentVolume. 
 - 
 
См. также пример создания динамического PersistentVolume.
Статический PersistentVolume
При работе со статическим PersistentVolume:
- 
Укажите пустое значение параметра
spec.storageClassNameпри созданииPersistentVolumeClaim. - 
Укажите имя нужного бакета или директории бакета в параметре
spec.csi.volumeHandleпри созданииPersistentVolume. Если такого бакета не существует — создайте его.Примечание
При удалении такого
PersistentVolumeсоответствующий ему бакет не будет удален автоматически. - 
Если вам нужно изменить опции клиента GeeseFS для работы с бакетом, укажите их в параметре
spec.csi.volumeAttributes.optionsпри созданииPersistentVolume. Например, в опции--uidможно указать идентификатор пользователя-владельца всех файлов в хранилище. Список опций GeeseFS см. с помощью командыgeesefs -hили в репозитории на GitHub .Опции GeeseFS, указанные в параметре
parameters.options(в настройках приложения Yandex Cloud Marketplace — поле Опции монтирования GeeseFS) класса хранилища (StorageClass), для статическихPersistentVolumeигнорируются. Подробнее см. в документации Kubernetes . 
См. также пример создания статического PersistentVolume.
Примеры использования
Динамический PersistentVolume
Чтобы использовать Container Storage Interface совместно с динамическим PersistentVolume:
- 
Создайте
PersistentVolumeClaim:- 
Создайте файл
pvc-dynamic.yaml, содержащий описаниеPersistentVolumeClaim:pvc-dynamic.yaml
--- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: csi-s3-pvc-dynamic namespace: default spec: accessModes: - ReadWriteMany resources: requests: storage: 5Gi storageClassName: csi-s3При необходимости измените размер запрашиваемого хранилища в значении параметра
spec.resources.requests.storage. - 
Создайте
PersistentVolumeClaim:kubectl create -f pvc-dynamic.yaml - 
Убедитесь, что
PersistentVolumeClaimперешел в состояниеBound:kubectl get pvc csi-s3-pvc-dynamicРезультат:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE csi-s3-pvc-dynamic Bound pvc-<имя_dynamic-бакета> 5Gi RWX csi-s3 73m 
 - 
 - 
Создайте под для проверки динамического
PersistentVolume.- 
Создайте файл
pod-dynamic.yaml, содержащий описание пода:pod-dynamic.yaml
--- apiVersion: v1 kind: Pod metadata: name: csi-s3-test-nginx-dynamic namespace: default spec: containers: - name: csi-s3-test-nginx image: nginx volumeMounts: - mountPath: /usr/share/nginx/html/s3 name: webroot volumes: - name: webroot persistentVolumeClaim: claimName: csi-s3-pvc-dynamic readOnly: false - 
Создайте под, на котором будет смонтирован бакет для динамического
PersistentVolume:kubectl create -f pod-dynamic.yaml - 
Убедитесь, что под перешел в состояние
Running:kubectl get pods 
 - 
 - 
Создайте в контейнере файл
/usr/share/nginx/html/s3/hello_world. Для этого выполните команду на поде:kubectl exec -ti csi-s3-test-nginx-dynamic -- touch /usr/share/nginx/html/s3/hello_world - 
Убедитесь, что файл попал в бакет:
- Перейдите на страницу каталога и выберите сервис Object Storage.
 - Нажмите на бакет 
pvc-<имя_dynamic-бакета>. Если при настройке класса хранилища было указано имя бакета, то откройте указанный бакет и каталогpvc-<имя_dynamic-бакета>внутри него. 
 
Статический PersistentVolume
Чтобы использовать Container Storage Interface совместно со статическим PersistentVolume:
- 
Создайте
PersistentVolumeClaim:- 
Создайте файл
pvc-static.yaml, содержащий описаниеPersistentVolumeClaim:pvc-static.yaml
--- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: csi-s3-pvc-static namespace: default spec: accessModes: - ReadWriteMany resources: requests: storage: 10Gi storageClassName: ""Для статического
PersistentVolumeимя класса хранилища в параметреspec.storageClassNameне указывается. При необходимости измените размер запрашиваемого хранилища в значении параметраspec.resources.requests.storage. - 
Создайте файл
pv-static.yaml, содержащий описание статическогоPersistentVolume, и укажите в нем значение параметраvolumeHandle:pv-static.yaml
--- apiVersion: v1 kind: PersistentVolume metadata: name: s3-volume spec: storageClassName: csi-s3 capacity: storage: 10Gi accessModes: - ReadWriteMany claimRef: namespace: default name: csi-s3-pvc-static csi: driver: ru.yandex.s3.csi volumeHandle: "<имя_static-бакета>/<путь_к_каталогу_в_бакете>" controllerPublishSecretRef: name: csi-s3-secret namespace: kube-system nodePublishSecretRef: name: csi-s3-secret namespace: kube-system nodeStageSecretRef: name: csi-s3-secret namespace: kube-system volumeAttributes: capacity: 10Gi mounter: geesefs options: "--memory-limit=1000 --dir-mode=0777 --file-mode=0666 --uid=1001"В этом примере настройки GeeseFS для работы с бакетом изменены по сравнению со
StorageClass. В них добавлена опция--uid, в которой указан идентификатор пользователя-владельца всех файлов в хранилище —1001. Подробнее о настройке GeeseFS для статическогоPersistentVolumeсм. выше.В параметре
volumeHandleпуть к каталогу в бакете задается опционально. - 
Создайте
PersistentVolumeClaim:kubectl create -f pvc-static.yaml - 
Создайте статический
PersistentVolume:kubectl create -f pv-static.yaml - 
Убедитесь, что
PersistentVolumeClaimперешел в состояниеBound:kubectl get pvc csi-s3-pvc-staticРезультат:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE csi-s3-pvc-static Bound <имя_PersistentVolume> 10Gi RWX csi-s3 73m 
 - 
 - 
Создайте под для проверки статического
PersistentVolume.- 
Создайте файл
pod-static.yaml, содержащий описание пода:pod-static.yaml
--- apiVersion: v1 kind: Pod metadata: name: csi-s3-test-nginx-static namespace: default spec: containers: - name: csi-s3-test-nginx-static image: nginx volumeMounts: - mountPath: /usr/share/nginx/html/s3 name: s3-volume volumes: - name: s3-volume persistentVolumeClaim: claimName: csi-s3-pvc-static readOnly: false - 
Создайте под, на котором будет смонтирован бакет для статического
PersistentVolume:kubectl create -f pod-static.yaml - 
Убедитесь, что под перешел в состояние
Running:kubectl get pods 
 - 
 - 
Создайте в контейнере файл
/usr/share/nginx/html/s3/hello_world_static. Для этого выполните команду на поде:kubectl exec -ti csi-s3-test-nginx-static -- touch /usr/share/nginx/html/s3/hello_world_static - 
Убедитесь, что файл попал в бакет:
- Перейдите на страницу каталога и выберите сервис Object Storage.
 - Нажмите на бакет 
<имя_static-бакета>. Если вы указали путь к каталогу в бакете в описании статическогоPersistentVolume, то сначала откройте указанный каталог.