Есть у яндекса вот такой интересный проект, который позволяет подключить в k8s S3 в качестве хранилища.
Работает с любым хранилищем типа S3, например у нас ceph.
Развертывание с помощью GitOps системы fluxcd.
На самом верхнем уровне apps создаем директорию csi-s3, внутри helmrelease.yaml:
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: csi-s3
namespace: csi-s3
spec:
interval: 10m
releaseName: csi-s3
chart:
spec:
chart: csi-s3
version: "0.43.0"
sourceRef:
kind: HelmRepository
name: csi-s3
namespace: flux-system
values:
storageClass:
create: false
secret:
create: false
Тут только ставим приложение, без создания storageClass или секретов для конкретного бакета.
HelmRepository:
apiVersion: source.toolkit.fluxcd.io/v1
kind: HelmRepository
metadata:
name: csi-s3
namespace: flux-system
spec:
interval: 1h0m0s
url: https://yandex-cloud.github.io/k8s-csi-s3/charts
И
kustomization.yaml:apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- repository.yaml
- helmrelease.yaml
Далее на уровне конкретного кластера, я завел директорию storageclasses c описанием одного storageClass под одного приложение. У меня это shuffle.
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: csi-s3-shuffle
provisioner: ru.yandex.s3.csi
parameters:
mounter: geesefs
options: "--memory-limit 1000 --dir-mode 0777 --file-mode 0666"
bucket: shuffle-dev
csi.storage.k8s.io/provisioner-secret-name: csi-s3-secret
csi.storage.k8s.io/provisioner-secret-namespace: shuffle
csi.storage.k8s.io/controller-publish-secret-name: csi-s3-secret
csi.storage.k8s.io/controller-publish-secret-namespace: shuffle
csi.storage.k8s.io/node-stage-secret-name: csi-s3-secret
csi.storage.k8s.io/node-stage-secret-namespace: shuffle
csi.storage.k8s.io/node-publish-secret-name: csi-s3-secret
csi.storage.k8s.io/node-publish-secret-namespace: shuffle
Секрет
csi-s3-secret уже идет на уровне приложения. В моем случае гит репозиторий с приложением лежит в другом месте, во flux просто подключается. Соответственно там я описываю секрет вида:apiVersion: v1
kind: Secret
metadata:
namespace: shuffle
name: csi-s3-secret
annotations:
vault.security.banzaicloud.io/vault-serviceaccount: "<vault_sa>"
vault.security.banzaicloud.io/vault-addr: "<vault_address"
vault.security.banzaicloud.io/vault-role: "<vault_role"
vault.security.banzaicloud.io/vault-path: "<vault_k8s_auth_path>"
stringData:
accessKeyID: "vault:path/to/secret#S3_ACCESS_KEY"
secretAccessKey: "vault:path/to/secret#S3_SECRET_KEY"
endpoint: https://<s3_domain>
Секрет создается с помощью vault webhooks от bank-vault.
Итого - во flux описываем storageClass-ы под приложения/неймспесы и так далее, в конкретных приложениях уже секреты с кредами.
#k8s
#s3