212 July 21, 2024, 4:04 p.m.

Перенос данных в EFS K8s

Задача: перенести данные из локального хранилища, в AWS EFS.

Для достижения поставленной задачи потребуется:

  • установить зависимость aws-efs-csi-driver, у меня используется версия 3.0.0 так как она работает на ARM;
  • создать efs диски;
  • настроить access point;
  • настроить кластер.

Зависимости

Для установки зависимостей можно использовать helm командой:

helm repo add aws-efs-csi-driver https://kubernetes-sigs.github.io/aws-efs-csi-driver/
helm repo update

Далее устанавливаем в kube-system :

helm install aws-efs-csi-driver aws-efs-csi-driver/aws-efs-csi-driver --namespace kube-system

Создание дисков в EFS

Ниже приведен простой код для terraform который разворачивает ресурс.

resource "aws_efs_file_system" "example" {
  creation_token = "example"

  tags = {
    Name = "Example"
  }
}

resource "aws_efs_mount_target" "example" {
  file_system_id  = aws_efs_file_system.cloud.id
  subnet_id       = <ваша сеть>
  security_groups = [<ваша группа безопасности>]
}

Конфигурация точки доступа (access point)

Для этого нужно перейти в консоль AWS (можно через terraform) зайти в созданный ресурс > Access points > задать следующие параметры:

Root directory creation permissions
Owner user ID = 1000
Owner group ID = 1000
Permissions = 0770

Настройка кластера

Для работы с созданным ресурсом требуется добавить такие манифесты:

---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: example-data-sc
provisioner: efs.csi.aws.com
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: example-core-pv
spec:
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  storageClassName: example-data-sc
  csi:
    driver: efs.csi.aws.com
    volumeHandle: fs-00d0<...>a51723::fsap-02ba<...>ecb5f
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: example-data-pvc
spec:
  storageClassName: example-data-sc
  volumeName: example-core-pv
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi

В код deployment добавить volumeMounts и volumes:

        volumeMounts:
          - name: example-data-volume
            mountPath: /var/vmail
            readOnly: false

      volumes:
        - name: email-data-volume
          persistentVolumeClaim:
            claimName: email-data-pvc


Перенос данных

Для этого нужно выполнить команду. Она перенесет все данные, включая права.

rsync -avz /path/to/current/example/ /path/to/dest/example