Интеграция S3 в Kubernetes позволяет приложениям работать с объектным хранилищем как с обычной файловой системой. В Timeweb Cloud для этого используется CSI S3 (Container Storage Interface), который обеспечивает прозрачное подключение S3-бакетов к подам Kubernetes. Рассмотрим, как настроить использование CSI S3 в кластере Kubernetes.
При создании нового кластера Kubernetes в Timeweb Cloud на этапе выбора «Дополнения» можно включить поддержку CSI S3.
Если кластер уже создан, добавить CSI S3 можно следующим образом:
Перейдите во вкладку «Дополнения» на странице управления кластером.
Нажмите на три точки рядом с дополнением CSI S3 и выберите «Установить».
В появившемся окне выберите существующий S3-бакет, создайте новый или подключите внешний бакет S3.
После выбора бакета нажмите «Установить» и дождитесь завершения процесса. После установки бакет будет доступен для использования в кластере, и никаких дополнительных настроек не потребуется.
Чтобы убедиться, что CSI S3 успешно установлен и подключен, выполните команду для получения списка StorageClass
:
kubectl get storageclass csi-s3 -o yaml
Также вы можете просмотреть данные для подключения S3, выполнив следующую команду:
kubectl get secret csi-s3-secret -n csi-s3 -o yaml
Данные будут представлены в секции data
, в формате base64
.
S3 — это объектное хранилище, и Kubernetes не может напрямую взаимодействовать с ним, так как Kubernetes работает с файловыми системами и блочными устройствами. Для подключения используется PersistentVolumeClaim
(PVC), который позволяет приложениям запрашивать доступ к S3 через CSI-драйвер. Для монтирования S3-бакета используется FUSE-прослойка geesefs
, которая обеспечивает доступ к файлам в S3 как к обычной файловой системе.
Важно отметить, что CSI S3 не является полноценной POSIX-совместимой файловой системой. Это решение подходит для хранения статических файлов, таких как изображения, CSS, JS, конфигурационные файлы, или другие данные, которые не требуют высокой дисковой активности. Из-за отсутствия полной POSIX-совместимости могут возникнуть проблемы с размещением баз данных или других приложений, которые пытаются изменить права доступа или владельца файлов и папок. Также не поддерживаются частичная перезапись файлов и создание жестких ссылок (hardlinks).
PVC выполняет роль «заявки» на хранилище. Это запрос к Kubernetes с просьбой предоставить хранилище с определенными параметрами. В ответ на этот запрос Kubernetes создает соответствующий PersistentVolume (PV), который затем связывается с PVC, обеспечивая доступ к хранилищу. Таким образом, CSI S3 преобразует объектное хранилище в том, который можно монтировать в поды.
Ниже представлен пример манифеста PersistentVolumeClaim
для подключения к S3:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: csi-s3-pvc
namespace: default
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
storageClassName: csi-s3
apiVersion
и kind
: Указывают, что данный ресурс является PersistentVolumeClaim
версии v1.metadata
: Содержит имя PVC (csi-s3-pvc
) и указывает, что он создается в неймспейсе default
.accessModes
: Задает режим доступа к хранилищу. В данном случае используется ReadWriteMany
, что означает возможность чтения и записи в хранилище несколькими подами одновременно.resources.requests.storage
: Указывает, что PVC запрашивает 5 GiB пространства в хранилище. Этот объем может быть использован приложением для хранения файлов.storageClassName
: Указывает, что используется StorageClass с именем csi-s3
. Чтобы приложение могло использовать PVC, его необходимо подключить в манифесте Deployment. Пример ниже демонстрирует, как контейнер с образом Nginx использует подключенный PVC:
apiVersion: apps/v1
kind: Deployment
metadata:
name: s3-app-deployment
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: s3-app
template:
metadata:
labels:
app: s3-app
spec:
containers:
- name: s3-app-container
image: nginx
volumeMounts:
- name: s3-storage
mountPath: /usr/share/nginx/html
volumes:
- name: s3-storage
persistentVolumeClaim:
claimName: csi-s3-pvc
apiVersion
и kind
: Указывают, что данный ресурс является Deployment версии apps/v1
.metadata
: Содержит имя деплоймента (s3-app-deployment
) и указывает, что он создается в неймспейсе default
.replicas
: Задает количество реплик (в данном случае — 1), что позволяет масштабировать приложение.template
: Содержит спецификацию пода, который будет развернут в составе деплоймента.containers
: Описывает контейнеры, входящие в состав пода. В этом примере используется контейнер с образом nginx
.volumeMounts
: Определяет точку монтирования тома в контейнере. В данном случае PVC монтируется в каталог /usr/share/nginx/html
, чтобы контейнер мог использовать данные, хранящиеся в S3.volumes
: Описывает тома, используемые в поде. Здесь указано, что том s3-storage
связан с PVC csi-s3-pvc
. Это значит, что данные из S3 будут доступны контейнерам через этот том.Использование PVC позволяет приложению получить доступ к данным в S3, а также упрощает управление доступом и масштабирование, обеспечивая каждой реплике доступ к общим данным.