Amazon EFS로 탄력적 파일 시스템 스토리지 사용하기

Amazon EFS로 탄력적 파일 시스템 스토리지 사용하기 (Use elastic file system storage with Amazon EFS)

Amazon EFS(Elastic File System)는 서버리스, 완전 탄력적 파일 스토리지를 제공해 스토리지 용량과 성능을 프로비저닝하거나 관리하지 않고도 파일 데이터를 공유할 수 있게 해줘요. Amazon EFS CSI(Container Storage Interface) 드라이버는 AWS에서 실행되는 Kubernetes 클러스터가 Amazon EFS 파일 시스템을 영구 볼륨으로 마운트할 수 있게 해줘요. 이 주제는 Amazon EFS CSI 드라이버를 Amazon EKS 클러스터에 배포하는 방법을 보여줘요.

출처: 문서

본문

고려 사항 (Considerations)

  • Amazon EFS CSI 드라이버는 Windows 기반 컨테이너 이미지와 호환되지 않아요.
  • Fargate 노드에서는 영구 볼륨에 동적 프로비저닝을 사용할 수 없지만 정적 프로비저닝은 사용할 수 있어요.
  • 동적 프로비저닝은 드라이버 1.2 이상이 필요해요. 드라이버 1.1 버전을 사용하는 영구 볼륨에는 지원되는 모든 Amazon EKS 클러스터 버전(Amazon EKS 지원 버전 참고)에서 정적 프로비저닝을 사용할 수 있어요.
  • 이 드라이버의 버전 1.3.2 이상은 Amazon EC2 Graviton 기반 인스턴스를 포함한 Arm64 아키텍처를 지원해요.
  • 이 드라이버의 버전 1.4.2 이상은 파일 시스템 마운트에 FIPS 사용을 지원해요.
  • Amazon EFS의 리소스 할당량(quota)을 기록해 두세요. 자세한 내용은 Amazon EFS 할당량을 참고하세요.
  • 버전 2.0.0부터 이 드라이버는 TLS 연결에 stunnel 대신 efs-proxy를 사용해요. efs-proxy를 사용하면 실행 중인 노드의 코어 수 + 1만큼의 스레드를 열어요.
  • Amazon EFS CSI 드라이버는 Amazon EKS Hybrid Nodes와 호환되지 않아요.

사전 요구 사항 (Prerequisites)

Amazon EFS CSI 드라이버는 AWS IAM(Identity and Access Management) 권한이 필요해요.

  • AWS는 EKS Pod Identities 사용을 제안해요. 자세한 내용은 EKS Pod Identities 설정 개요를 참고하세요.
  • 서비스 계정용 IAM 역할 및 클러스터용 IAM OIDC(OpenID Connect) 프로바이더 설정에 대한 내용은 클러스터용 IAM OIDC 프로바이더 생성하기를 참고하세요.
  • 기기 또는 AWS CloudShell에 AWS CLI(Command Line Interface) 버전 2.12.3 이상 또는 버전 1.27.160 이상이 설치되고 구성되어 있어야 해요. 현재 버전을 확인하려면 aws --version | cut -d / -f2 | cut -d ' ' -f1을 사용하세요. yum, apt-get, macOS용 Homebrew 같은 패키지 관리자는 최신 AWS CLI보다 몇 버전 뒤처진 경우가 많아요. 최신 버전을 설치하려면 AWS Command Line Interface 사용 설명서의 aws configure로 설치 및 빠른 구성하기를 참고하세요. AWS CloudShell에 설치된 AWS CLI 버전도 최신 버전보다 몇 버전 뒤처질 수 있어요. 업데이트하려면 AWS CloudShell 사용 설명서의 홈 디렉터리에 AWS CLI 설치하기를 참고하세요.
  • 기기 또는 AWS CloudShell에 kubectl 명령줄 도구가 설치되어 있어야 해요. 버전은 클러스터의 Kubernetes 버전과 같거나 최대 한 마이너 버전 앞뒤일 수 있어요. 예를 들어 클러스터 버전이 1.29라면 kubectl 버전 1.28, 1.29, 1.30을 사용할 수 있어요. kubectl을 설치하거나 업그레이드하려면 kubectl 및 eksctl 설정하기를 참고하세요.

참고

Fargate에서 실행되는 Pod는 수동 드라이버 설치 단계 없이 Amazon EFS 파일 시스템을 자동으로 마운트해요.

1단계: IAM 역할 생성

Amazon EFS CSI 드라이버는 파일 시스템과 상호작용하기 위해 IAM 권한이 필요해요. IAM 역할을 만들고 arn:aws:iam::aws:policy/service-role/AmazonEFSCSIDriverPolicy 관리형 정책을 연결해요.

참고

Amazon EFS와 Amazon S3 파일 시스템 스토리지를 모두 사용하려면 IAM 역할에 AmazonEFSCSIDriverPolicy와 AmazonS3FilesCSIDriverPolicy 관리형 정책을 모두 연결해야 해요. Amazon S3 파일 시스템 스토리지에 대한 자세한 내용은 Amazon EFS CSI 드라이버로 Amazon S3 파일 시스템 스토리지 사용하기를 참고하세요.

이 절차를 구현하려면 다음 도구 중 하나를 사용할 수 있어요: eksctl, AWS Management Console, AWS CLI.

참고

이 절차의 구체적인 단계는 드라이버를 Amazon EKS 추가 기능으로 사용할 때를 위해 작성됐어요. 자체 관리형 설치에 대한 자세한 내용은 GitHub의 Set up driver permission(드라이버 권한 설정)을 참고하세요.

eksctl

Pod Identities 사용 시: 다음 명령으로 eksctl로 IAM 역할과 Pod Identity 연결을 만들어요. my-cluster를 클러스터 이름으로 바꾸세요. AmazonEKS_EFS_CSI_DriverRole도 다른 이름으로 바꿀 수 있어요.

export cluster_name=my-cluster
export role_name=AmazonEKS_EFS_CSI_DriverRole
eksctl create podidentityassociation \
    --service-account-name efs-csi-controller-sa \
    --namespace kube-system \
    --cluster $cluster_name \
    --role-name $role_name \
    --permission-policy-arns arn:aws:iam::aws:policy/service-role/AmazonEFSCSIDriverPolicy

서비스 계정용 IAM 역할 사용 시: 다음 명령으로 eksctl로 IAM 역할을 만들어요. my-cluster를 클러스터 이름으로 바꾸세요. AmazonEKS_EFS_CSI_DriverRole도 다른 이름으로 바꿀 수 있어요.

export cluster_name=my-cluster
export role_name=AmazonEKS_EFS_CSI_DriverRole
eksctl create iamserviceaccount \
    --name efs-csi-controller-sa \
    --namespace kube-system \
    --cluster $cluster_name \
    --role-name $role_name \
    --role-only \
    --attach-policy-arn arn:aws:iam::aws:policy/service-role/AmazonEFSCSIDriverPolicy \
    --approve
TRUST_POLICY=$(aws iam get-role --output json --role-name $role_name --query 'Role.AssumeRolePolicyDocument' | \
    sed -e 's/efs-csi-controller-sa/efs-csi-*/' -e 's/StringEquals/StringLike/')
aws iam update-assume-role-policy --role-name $role_name --policy-document "$TRUST_POLICY"

AWS Management Console

다음을 실행해 AWS Management Console로 IAM 역할을 만들어요.

  1. https://console.aws.amazon.com/iam/ 에서 IAM 콘솔을 엽니다.
  2. 왼쪽 탐색 창에서 Roles를 선택합니다.
  3. Roles 페이지에서 Create role을 선택합니다.
  4. Select trusted entity 페이지에서 다음을 수행합니다.
    • EKS Pod Identities 사용 시:
      • Trusted entity type 섹션에서 AWS service를 선택합니다.
      • Service or use case 드롭다운에서 EKS를 선택합니다.
      • Use case 섹션에서 EKS - Pod Identity를 선택합니다.
      • Next를 선택합니다.
    • 서비스 계정용 IAM 역할 사용 시:
      • Trusted entity type 섹션에서 Web identity를 선택합니다.
      • Identity provider에서 클러스터의 OpenID Connect 프로바이더 URL(Amazon EKS의 Overview 아래에 표시됨)을 선택합니다.
      • Audience에서 sts.amazonaws.com을 선택합니다.
      • Next를 선택합니다.
  5. Add permissions 페이지에서 다음을 수행합니다.
    • Filter policies 상자에 AmazonEFSCSIDriverPolicy를 입력합니다.
    • 검색 결과로 반환된 AmazonEFSCSIDriverPolicy 왼쪽의 확인란을 선택합니다.
    • Next를 선택합니다.
  6. Name, review, and create 페이지에서 다음을 수행합니다.
    • Role name에 AmazonEKS_EFS_CSI_DriverRole 같은 역할의 고유 이름을 입력합니다.
    • Add tags (Optional) 아래에서 태그를 키-값 쌍으로 연결해 역할에 메타데이터를 추가합니다. IAM에서 태그 사용에 대한 자세한 내용은 IAM 사용 설명서의 IAM 리소스 태그 지정하기를 참고합니다.
    • Create role을 선택합니다.
  7. 역할이 생성된 후:
    • EKS Pod Identities 사용 시:
      1. Amazon EKS 콘솔을 엽니다.
      2. 왼쪽 탐색 창에서 Clusters를 선택한 다음, EKS Pod Identity 연결을 구성하려는 클러스터 이름을 선택합니다.
      3. Access 탭을 선택합니다.
      4. Pod Identity associations에서 Create를 선택합니다.
      5. IAM role 드롭다운을 선택하고 새로 만든 역할을 선택합니다.
      6. Kubernetes namespace 필드를 선택하고 kube-system을 입력합니다.
      7. Kubernetes service account 필드를 선택하고 efs-csi-controller-sa를 입력합니다.
      8. Create를 선택합니다. Pod Identity 연결 생성에 대한 자세한 내용은 Pod Identity 연결 생성하기(AWS 콘솔)를 참고합니다.
    • 서비스 계정용 IAM 역할 사용 시:
      1. 역할을 선택해 편집을 위해 엽니다.
      2. Trust relationships 탭을 선택한 다음 Edit trust policy를 선택합니다.
      3. 다음 줄과 유사한 줄을 찾습니다.
        "oidc.eks.region-code.amazonaws.com/id/:aud": "sts.amazonaws.com"
        
      4. 이전 줄 위에 다음 줄을 추가합니다. 을 클러스터가 있는 AWS 리전으로 바꾸고, 을 클러스터의 OIDC 프로바이더 ID로 바꿉니다.
        "oidc.eks..amazonaws.com/id/:sub": "system:serviceaccount:kube-system:efs-csi-*",
        
      5. Condition 연산자를 "StringEquals"에서 "StringLike"로 수정합니다.
      6. Update policy를 선택해 마칩니다.

AWS CLI

다음 명령으로 AWS CLI를 사용해 IAM 역할을 만들어요.

Pod Identities 사용 시:

  1. pods.eks.amazonaws.com 서비스에 AssumeRole 및 TagSession 작업을 부여하는 IAM 역할을 만들어요. 다음 내용을 aws-efs-csi-driver-trust-policy-pod-identity.json이라는 파일에 복사해요.
    {
        "Version":"2012-10-17",
        "Statement": [
            {
                "Sid": "AllowEksAuthToAssumeRoleForPodIdentity",
                "Effect": "Allow",
                "Principal": {
                    "Service": "pods.eks.amazonaws.com"
                },
                "Action": [
                    "sts:AssumeRole",
                    "sts:TagSession"
                ]
            }
        ]
    }
    
  2. 역할을 만들어요. my-cluster를 클러스터 이름으로 바꾸세요. AmazonEKS_EFS_CSI_DriverRole도 다른 이름으로 바꿀 수 있어요.
    export cluster_name=my-cluster
    export role_name=AmazonEKS_EFS_CSI_DriverRole
    aws iam create-role \
      --role-name $role_name \
      --assume-role-policy-document file://"aws-efs-csi-driver-trust-policy-pod-identity.json"
    
  3. 다음 명령으로 필요한 AWS 관리형 정책을 역할에 연결해요.
    aws iam attach-role-policy \
      --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEFSCSIDriverPolicy \
      --role-name $role_name
    
  4. 다음 명령으로 Pod Identity 연결을 만들어요. ``을 계정 ID로 바꾸세요.
    aws eks create-pod-identity-association --cluster-name $cluster_name --role-arn {arn-aws}iam:::role/$role_name --namespace kube-system --service-account efs-csi-controller-sa
    
    Pod Identity 연결 생성에 대한 자세한 내용은 Pod Identity 연결 생성하기(AWS 콘솔)를 참고합니다.

서비스 계정용 IAM 역할 사용 시:

  1. 클러스터의 OIDC 프로바이더 URL을 확인해요. my-cluster를 클러스터 이름으로 바꾸세요. AmazonEKS_EFS_CSI_DriverRole도 다른 이름으로 바꿀 수 있어요.
    export cluster_name=my-cluster
    export role_name=AmazonEKS_EFS_CSI_DriverRole
    aws eks describe-cluster --name $cluster_name --query "cluster.identity.oidc.issuer" --output text
    
    예시 출력은 다음과 같아요.
    https://oidc.eks..amazonaws.com/id/
    
    명령 출력이 None이면 사전 요구 사항을 검토하세요.
  2. AssumeRoleWithWebIdentity 작업을 부여하는 IAM 역할을 만들어요. 다음 내용을 aws-efs-csi-driver-trust-policy.json이라는 파일에 복사해요. 을 계정 ID로 바꾸고, 과 ``을 이전 단계에서 반환된 값으로 바꾸세요.
    {
      "Version":"2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "arn:aws:iam::123456789012:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringLike": {
              "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:kube-system:efs-csi-*",
              "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com"
            }
          }
        }
      ]
    }
    
  3. 역할을 만들어요.
    aws iam create-role \
      --role-name $role_name \
      --assume-role-policy-document file://"aws-efs-csi-driver-trust-policy.json"
    
  4. 다음 명령으로 필요한 AWS 관리형 정책을 역할에 연결해요.
    aws iam attach-role-policy \
      --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEFSCSIDriverPolicy \
      --role-name $role_name
    

2단계: Amazon EFS CSI 드라이버 가져오기

Amazon EKS 추가 기능을 통해 Amazon EFS CSI 드라이버를 설치하는 것을 권장해요. 클러스터에 Amazon EKS 추가 기능을 추가하려면 Amazon EKS 추가 기능 생성하기를, 추가 기능에 대한 자세한 내용은 Amazon EKS 추가 기능을 참고하세요. Amazon EKS 추가 기능을 사용할 수 없다면, 그 이유에 대한 issue를 Containers roadmap GitHub 저장소에 제출하는 것을 권장해요.

중요

Amazon EFS 드라이버를 Amazon EKS 추가 기능으로 추가하기 전에 클러스터에 자체 관리형 버전의 드라이버가 설치되어 있지 않은지 확인하세요. 있다면 GitHub의 Amazon EFS CSI 드라이버 제거하기(Uninstalling the Amazon EFS CSI Driver)를 참고하세요.

또는 Amazon EFS CSI 드라이버의 자체 관리형 설치는 GitHub의 Installation(설치)을 참고하세요.

3단계: Amazon EFS 파일 시스템 생성

Amazon EFS 파일 시스템을 만들려면 GitHub의 Amazon EKS용 Amazon EFS 파일 시스템 생성하기(Create an Amazon EFS file system for Amazon EKS)를 참고하세요.

4단계: 샘플 애플리케이션 배포

다양한 샘플 앱을 배포하고 필요에 따라 수정할 수 있어요. 자세한 내용은 GitHub의 Examples(예시)를 참고하세요.

더 알아보기 (Learn more)