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. Ручная установка
-
Клонируйте репозиторий:
git clone https://github.com/yandex-cloud/k8s-csi-s3.git
-
Создайте секрет с учетными данными 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 в выбранном облаке. -
Перейдите в репозиторий и установите драйвер в кластер.
kubectl create -f deploy/kubernetes/provisioner.yaml kubectl create -f deploy/kubernetes/driver.yaml kubectl create -f deploy/kubernetes/csi-s3.yaml
-
Создайте Storage Class.
kubectl create -f deploy/kubernetes/examples/storageclass.yaml
4. Тестирование
-
Создайте PVC используя новый Storage Class:
kubectl create -f deploy/kubernetes/examples/pvc.yaml
-
Проверьте привязки 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
-
Создайте тестовый под, в который монтируется том:
kubectl create -f deploy/kubernetes/examples/pod.yaml
-
Проверьте состояние пода. Если он запущен, значит проблем с интеграцией нет.
-
Убедитесь, что там смонтирован:
$ 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.