AWS EFS CSI Driver

개요

4.RESOURCE/KNOWLEDGE/AWS/AWSNFS 스토리지Amazon Elastic File System를 사용하는 CSI 드라이버.
nfs인 만큼 기본적으로 파일시스템으로서 프로비저닝된 상태의 스토리지를 제공받을 수 있다.

EBS CSI Driver와의 차이

AWS EBS CSI Driver와 다른 점이 몇 가지 있다.

구조


다른 nfs 서버와 동작 역시 다르지 않다.
미리 프로비저닝된 하나의 efs 볼륨의 내부를 활용해 공간을 마운팅해주는 방식이다.
이미 존재하는 공간을 활용하는 것이니 활용하고자 하는 VPC에 마운팅할 수 있도록 타겟 세팅을 해줘야 한다.
기본적으로 하나의 pvc는 efs에 하나의 액세스포인트를 생성하며, 이를 기반으로 마운팅을 지점을 파드에 제공한다.

설치

EKS의 경우 애드온으로 쉽게 설치가 가능하다.
컨트롤러 역할을 할 파드에는 당연히 IRSA라던가, 하는 권한 설정이 필요하다.

resource "aws_eks_addon" "efs_csi" {
  cluster_name                = module.eks.cluster_name
  addon_name                  = "aws-efs-csi-driver"
  addon_version = "v2.1.4-eksbuild.1"
  resolve_conflicts_on_update = "PRESERVE"
  configuration_values = jsonencode({ })
  service_account_role_arn = module.efs_csi_irsa.iam_role_arn
}

module "efs_csi_irsa" {
  source  = "terraform-aws-modules/iam/aws//modules/iam-role-for-service-accounts-eks"
  version = "5.52.2"
  role_name = "efs-csi"

  attach_efs_csi_policy = true
  force_detach_policies = true

  oidc_providers = {
    eks = {
      provider_arn = module.eks.oidc_provider_arn
      namespace_service_accounts = ["kube-system:efs-csi-controller-sa"]
    }
  }
}

테라폼 딸깍으로 광명 찾을 수도 있다!

주의할 건, 미리 만들어진 Amazon Elastic File System가 있는 상태여야 한다는 것이다.
이 efs를 사용하고자 하는 클러스터에 미리 타겟포인트를 파두어야 해당 경로로 접근하여 efs를 스토리지로 활용할 수 있게 된다.

세팅

aws efs describe-file-systems --query "FileSystems[*].FileSystemId" --output text

efs 볼륨 id를 먼저 알아내야 한다.

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: efs-sc
provisioner: efs.csi.aws.com
parameters:
  provisioningMode: efs-ap # 엑세스엔드포인트 모드. 다른 것 불가능
  fileSystemId: fs-92107410
  directoryPerms: "700"
  basePath: "/dynamic_provisioning" # 해당 볼륨의 어디를 활용할 건지
  subPathPattern: "${.PVC.namespace}/${.PVC.name}" # optional
  ensureUniqueDirectory: "true" # 알아서 디렉 이름이 고유하도록 uuid 붙이는 설정
  reuseAccessPoint: "false" # optional

스토리지 클래스는 이런 식으로 만들어준다.

  csi:
    driver: efs.csi.aws.com
    volumeHandle: fs-e8a95a42::fsap-068c22f0246419f75

pv에 바로 명시해서 세팅을 한다면 이렇게 volumeHandle 부분에 만들어진 efs 볼륨 id를 적어주면 된다.
특정 액세스포인트로 한정을 더 짓고 싶다면 위처럼 {fs id}::{ap id}로 조금 더 구체적으로 적어준다.

레포지토리 문서에서는 정적 프로비저닝을 추천하는데, 그 이유는 동적 프로비저닝 시 액세스 포인트 유저 신원이 적용되기 때문이다.
nfs에서도 마운팅 이후 일어나는 작업이 실제 파일시스템에 어떻게 될지 지정을 할 수 있는데, 현재 동적 프로비저닝 때는 무조건 액세스포인트에서 설정되는 유저 정보가 파일에 기록된다는 듯 하다.

관련 문서

이름 noteType created

참고