Amazon EKS에서 영구 스토리지를 사용하려면 어떻게 해야 하나요?

8분 분량
0

Amazon Elastic Kubernetes Service(Amazon EKS)에서 영구 스토리지를 사용하려고 합니다.

간략한 설명

다음 옵션 중 하나를 사용하여 Amazon EKS에서 영구 스토리지를 설정합니다.

이 옵션 중 하나를 사용하려면 다음 섹션에 안내된 단계를 하나 선택해 완료하세요.

  • 옵션 A: Amazon EBS CSI 드라이버 배포 및 테스트
  • 옵션 B: Amazon EFS CSI 드라이버 배포 및 테스트

이 문서의 명령에는 kubectl 버전 1.14 이상이 필요합니다. 사용 중인 kubectl 버전을 보려면 다음 명령을 실행합니다.

kubectl version --client --short

참고: 최신 버전의 드라이버를 설치하는 것이 가장 좋습니다. 자세한 내용은 GitHub 리포지토리에서 Amazon EBS CSI 드라이버Amazon EFS CSI 드라이버를 참고하세요.

해결 방법

**참고:**AWS Command Line Interface(AWS CLI) 명령을 실행할 때 오류가 발생하는 경우, 최신 버전의 AWS CLI를 사용하고 있는지 확인하세요.

각 섹션의 단계를 완료하기 전에 다음을 실행하세요.

  1. AWS CLI를 설치합니다.

  2. 정책을 생성하고 Amazon EKS 워커 노드 역할인 CSI 드라이버 역할에 연결하기 위해 AWS Identity and Access Management(IAM) 권한을 설정합니다.
    참고:다음 섹션의 명령이 항상--region 변수를 사용하는 것은 아닙니다. --region 번수를 사용하지 않는 경우 명령은 AWS 리전의 기본 설정값을 사용합니다. 기본 설정값을 확인하려면, AWS CLI 구성 명령을 실행하세요.

  3. Amazon EKS 클러스터를 생성하고 워커 노드를 클러스터에 연결합니다.
    참고: kubectl get nodes 명령을 실행하여 워커 노드가 클러스터에 연결되어 있는지 확인합니다.

  4. 다음 명령을 실행하여 클러스터에 AWS IAM OpenID Connect(OIDC) 공급자가 있는지 확인합니다.

    aws eks describe-cluster --name your_cluster_name --query "cluster.identity.oidc.issuer" --output text

    참고: your_cluster_name을 클러스터 이름으로 바꿉니다.

  5. IAM OIDC 공급자가 구성되었는지 확인합니다.

    aws iam list-open-id-connect-providers | grep OIDC_PROVIDER_ID

    참고: OIDC 공급자의 ID를 해당 OIDC ID로 바꿉니다. 계정에 OpenIDConnect 공급자가 없음이라는 오류 메시지가 표시되면 IAM OIDC 공급자를 생성해야 합니다.

  6. eksctl를 설치하거나 업데이트합니다.

  7. IAM OIDC 공급자 생성:

    eksctl utils associate-iam-oidc-provider --cluster my-cluster --approve

    참고: my-cluster를 클러스터 이름으로 바꿉니다.

옵션 A: Amazon EBS CSI 드라이버 배포 및 테스트

Amazon EBS CSI 드라이버를 배포합니다.

  1. 다음 예와 비슷한 IAM 신뢰 정책 파일을 생성합니다.

    cat <<EOF > trust-policy.json
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "arn:aws:iam::YOUR_AWS_ACCOUNT_ID:oidc-provider/oidc.eks.YOUR_AWS_REGION.amazonaws.com/id/YOUR_OIDC ID"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "oidc.eks.YOUR_AWS_REGION.amazonaws.com/id/<XXXXXXXXXX45D83924220DC4815XXXXX>:aud": "sts.amazonaws.com",
              "oidc.eks.YOUR_AWS_REGION.amazonaws.com/id/<XXXXXXXXXX45D83924220DC4815XXXXX>:sub": "system:serviceaccount:kube-system:ebs-csi-controller-sa"
            }
          }
        }
      ]
    }
    EOF

    참고: YOUR_AWS_ACCOUNT_ID를 계정 ID로 바꿉니다. YOUR_AWS_REGION을 사용자의 리전으로 바꿉니다. OIDC ID를 IAM OIDC 공급자를 생성한 출력으로 바꿉니다.

  2. Amazon_EBS_CSI_Driver라는 IAM 역할을 생성합니다.

    aws iam create-role \
     --role-name AmazonEKS_EBS_CSI_Driver \
     --assume-role-policy-document file://"trust-policy.json"
  3. EBS CSI 드라이버의 AWS 관리형 IAM 정책을 생성한 IAM 역할에 연결합니다.

    aws iam attach-role-policy \
    --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy \
    --role-name AmazonEKS_EBS_CSI_Driver
  4. Amazon EBS CSI 드라이버를 배포합니다.

    aws eks create-addon \
     --cluster-name my-cluster \
     --addon-name aws-ebs-csi-driver \
     --service-account-role-arn arn:aws:iam::
    YOUR_AWS_ACCOUNT_ID:role/AmazonEKS_EBS_CSI_DriverRole

    참고: my-cluster를 클러스터 이름으로 바꾸고 YOUR_AWS_ACCOUNT_ID를 계정 ID로 바꿉니다.

    Kustomize, Helm 또는 Amazon EKS 관리형 애드온을 사용하여 EBS CSI 드라이버를 배포할 수 있습니다. 이 예시에서는 Amazon EKS 애드온 특성을 사용하여 드라이버를 배포합니다. 자세한 내용은 GitHub의 aws-ebs-csi-driver 설치 안내서를 참고하세요.

  5. EBS CSI 드라이버가 성공적으로 설치되었는지 확인합니다.

    eksctl get addon --cluster my-cluster | grep ebs

    성공적으로 설치되면 다음과 같은 출력을 반환합니다.

    aws-ebs-csi-driver    v1.20.0-eksbuild.1    ACTIVE    0    arn:aws:iam::YOUR_AWS_ACCOUNT_ID:role/AmazonEKS_EBS_CSI_Driver

Amazon EBS CSI 드라이버를 테스트합니다.

포드에 동적 프로비저닝을 사용하는 샘플 애플리케이션으로 Amazon EBS CSI 드라이버를 테스트할 수 있습니다. Amazon EBS 볼륨은 요청 시 프로비저닝됩니다.

  1. AWS GitHub에서 aws-ebs-csi-driver 리포지토리를 복제합니다.

    git clone https://github.com/kubernetes-sigs/aws-ebs-csi-driver.git
  2. 작업 디렉터리를 Amazon EBS 드라이버 테스트 파일이 있는 폴더로 변경합니다.

    cd aws-ebs-csi-driver/examples/kubernetes/dynamic-provisioning/
  3. 테스트에 필요한 Kubernetes 리소스를 생성합니다.

    kubectl apply -f manifests/

    참고: kubectl명령은 스토리지 클래스, 영구 볼륨 클레임 (PVC), 포드를 생성합니다. 포드는 PVC를 참조합니다. Amazon EBS 볼륨은 포드가 생성될 때만 프로비저닝됩니다. 자세한 내용은 스토리지 클래스 및 쿠버네티스 웹사이트의 영구 볼륨 클레임을 참조하세요.

  4. ebs-sc 스토리지 클래스를 설명합니다.

    kubectl describe storageclass ebs-sc
  5. 기본 네임스페이스의 포드를 확인하고 app 포드의 상태가 실행 중으로 변경될 때까지 기다립니다. 예를 들면 다음과 같습니다.

    kubectl get pods --watch
  6. PVC를 참조하는 포드로 인해 생성된 영구 볼륨을 확인합니다.

    kubectl get pv
  7. 영구 볼륨 정보를 확인합니다.

    kubectl describe pv your_pv_name

    참고:****your_pv_name을 이전 6단계 섹션에서 반환된 영구 볼륨의 이름으로 바꿉니다. 출력의 Source.VolumeHandle 속성 값은 계정에 생성된 물리적 Amazon EBS 볼륨의 ID입니다.

  8. 포드가 볼륨에 데이터를 쓰고 있는지 확인합니다.

    kubectl exec -it app -- cat /data/out.txt

    참고: 명령 출력에는 /data/out.txt 파일에 저장된 현재 날짜 및 시간이 표시됩니다. 이 파일에는 일, 월, 날짜 및 시간이 포함됩니다.

옵션 B: Amazon EFS CSI 드라이버 배포 및 테스트

CSI 드라이버를 배포하기 전에 CSI 드라이버의 서비스 계정이 사용자를 대신해 AWS API를 호출하도록 허용하는 IAM 역할을 생성합니다.

  1. GitHub에서 IAM 정책 문서를 다운로드합니다.

    curl -o iam-policy-example.json https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/docs/iam-policy-example.json
  2. IAM 정책을 생성합니다.

    aws iam create-policy \
        --policy-name AmazonEKS_EFS_CSI_Driver_Policy \
        --policy-document file://iam-policy-example.json
  3. 다음 명령을 실행해 클러스터의 OIDC 공급자 URL을 확인합니다.

    aws eks describe-cluster --name your_cluster_name --query "cluster.identity.oidc.issuer" --output text

    참고: 3단계에서 your_cluster_name을 클러스터 이름으로 바꿉니다.

  4. 다음 IAM 신뢰 정책을 생성한 다음, Kubernetes 서비스 계정에 AssumeRoleWithWebIdentity 작업을 부여합니다.

    cat <<EOF > trust-policy.json
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "arn:aws:iam::YOUR_AWS_ACCOUNT_ID:oidc-provider/oidc.eks.YOUR_AWS_REGION.amazonaws.com/id/<XXXXXXXXXX45D83924220DC4815XXXXX>"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "oidc.eks.YOUR_AWS_REGION.amazonaws.com/id/<XXXXXXXXXX45D83924220DC4815XXXXX>:sub": "system:serviceaccount:kube-system:efs-csi-controller-sa"
            }
          }
        }
      ]
    }
    EOF

    참고: 4단계에서 YOUR_AWS_ACCOUNT_ID를 계정 ID로 바꿉니다. YOUR_AWS_REGION을 사용자의 리전으로 바꿉니다. XXXXXXXXXX45D83924220DC4815XXXXX를 3단계에서 반환된 값으로 바꿉니다.

  5. IAM 역할을 생성합니다.

    aws iam create-role \
      --role-name AmazonEKS_EFS_CSI_DriverRole \
      --assume-role-policy-document file://"trust-policy.json"
  6. 새 IAM 정책을 역할에 연결합니다.

    aws iam attach-role-policy \
      --policy-arn arn:aws:iam::<AWS_ACCOUNT_ID>:policy/AmazonEKS_EFS_CSI_Driver_Policy \
      --role-name AmazonEKS_EFS_CSI_DriverRole
  7. 다음 내용을 efs-service-account.yaml 파일에 저장합니다.

    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      labels:
        app.kubernetes.io/name: aws-efs-csi-driver
      name: efs-csi-controller-sa
      namespace: kube-system
      annotations:
        eks.amazonaws.com/role-arn: arn:aws:iam::<AWS_ACCOUNT_ID>:role/AmazonEKS_EFS_CSI_DriverRole
  8. 클러스터에 Kubernetes 서비스 계정을 생성합니다. Kubernetes 서비스 계정 efs-csi-controller-sa에는 생성한 IAM 역할로 주석이 지정됩니다.

    kubectl apply -f efs-service-account.yaml
  9. 매니페스트를 다운로드하여 공용 Amazon ECR 레지스트리에 저장된 이미지를 사용해 드라이버를 설치합니다.

    kubectl kustomize "github.com/kubernetes-sigs/aws-efs-csi-driver/deploy/kubernetes/overlays/stable/?ref=release-1.5" > public-ecr-driver.yaml

    참고: Helm을 사용하여 EFS CSI 드라이버를 설치하고 AWS 프라이빗 또는 공용 레지스트리로 Kustomize를 설치할 수 있습니다. 자세한 내용은 Amazon EFS CSI 드라이버 설명서를 참고하세요.

    이후 public-ecr-driver.yaml 파일을 편집하여 efs-csi-controller-sa 매니페스트를 제거합니다.

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      labels:
        app.kubernetes.io/name: aws-efs-csi-driver
      name: efs-csi-controller-sa
      namespace: kube-system

Amazon EFS CSI 드라이버 배포

Amazon EFS CSI 드라이버를 사용하면, ReadWriteMany 모드를 통해 동시에 여러 포드를 볼륨에 쓰도록 할 수 있습니다.

  1. Amazon EFS CSI 드라이버를 배포하려면 매니페스트를 적용합니다.

    kubectl apply -f public-ecr-driver.yaml
  2. 클러스터에 AWS Fargate 포드(노드 없음)만 있는 경우 다음 명령을 사용하여 드라이버를 배포합니다(모든 리전).

    kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/deploy/kubernetes/base/csidriver.yaml

Amazon EFS 파일 시스템 생성

  1. Amazon EKS 클러스터의 VPC ID를 가져옵니다.

    aws eks describe-cluster --name your_cluster_name --query "cluster.resourcesVpcConfig.vpcId" --output text

    참고: 3단계에서 your_cluster_name을 클러스터 이름으로 바꿉니다.

  2. VPC 클러스터의 CIDR 범위를 확인합니다.

    aws ec2 describe-vpcs --vpc-ids YOUR_VPC_ID --query "Vpcs[].CidrBlock" --output text

    참고: 4단계에서 YOUR_VPC_ID를 이전 3단계 섹션의 VPC ID로 바꿉니다.

  3. Amazon EFS 마운트 지점의 인바운드 네트워크 파일 시스템(NFS) 트래픽을 허용하는 보안 그룹을 생성합니다.

    aws ec2 create-security-group --description efs-test-sg --group-name efs-sg --vpc-id YOUR_VPC_ID

    참고: YOUR_VPC_ID를 이전 3단계 섹션의 출력값으로 바꿉니다. 나중에 사용할 수 있도록 GroupId를 저장합니다.

  4. VPC의 리소스가 Amazon EFS 파일 시스템과 통신할 수 있도록 NFS 인바운드 규칙을 추가합니다.

    aws ec2 authorize-security-group-ingress --group-id sg-xxx --protocol tcp --port 2049 --cidr YOUR_VPC_CIDR

    참고: YOUR_VPC_CIDR를 이전 4단계 섹션의 출력값으로 바꿉니다. sg-xxx를 이전 5단계 섹션의 보안 그룹 ID로 바꿉니다.

  5. Amazon EKS 클러스터를 위한 Amazon EFS 파일 시스템을 생성합니다.

    aws efs create-file-system --creation-token eks-efs

    참고: 나중에 사용할 수 있도록 FileSystemId를 저장합니다.

  6. Amazon EFS용 마운트 대상을 생성하려면 다음 명령을 실행합니다.

    aws efs create-mount-target --file-system-id FileSystemId --subnet-id SubnetID --security-group sg-xxx

    중요: 워커 노드가 실행 중인 가용 영역에서 SubnetID를 사용 중인 모든 가용 영역에 명령을 실행해야 합니다. FileSystemId를 이전 7단계 섹션(Amazon EFS 파일 시스템을 생성한 단계)의 출력으로 바꿉니다. sg-xxx를 이전 5단계(보안 그룹을 생성한 단계)의 출력으로 바꿉니다. SubnetID를 워커 노드에서 사용하는 서브넷으로 바꿉니다. 여러 서브넷에 마운트 대상을 생성하려면 서브넷 ID마다 개별적으로 8단계에 안내된 명령을 실행해야 합니다. 워커 노드가 실행 중인 각 가용 영역에 마운트 대상을 만드는 것이 가장 좋습니다.

    참고: 워커 노드가 실행되는 모든 가용 영역에 마운트 대상을 생성할 수 있습니다. 그러면 마운트 대상이 있는 가용 영역의 모든 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스가 파일 시스템을 사용할 수 있습니다.

이제 Amazon EFS 파일 시스템과 마운트 대상이 실행되었으며 클러스터의 포드에서 사용할 수 있습니다.

Amazon EFS CSI 드라이버 테스트

동일한 파일에 쓰는 두 개의 포드를 배포하여 Amazon EFS CSI 드라이버를 테스트할 수 있습니다.

  1. AWS GitHub에서 aws-efs-csi-driver 리포지토리를 복제합니다.

    git clone https://github.com/kubernetes-sigs/aws-efs-csi-driver.git
  2. 작업 디렉터리를 Amazon EFS CSI 드라이버 테스트 파일이 있는 폴더로 변경합니다.

    cd aws-efs-csi-driver/examples/kubernetes/multiple_pods/
  3. 이전에 생성한 Amazon EFS 파일 시스템 ID를 검색합니다.

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

    참고: 3단계의 명령으로 반환되는 결과가 둘 이상인 경우 이전에 저장한 Amazon EFS 파일 시스템 ID를 사용할 수 있습니다.

  4. specs/pv.yaml 파일에서 spec.csi.volumeHandle 값을 이전 단계의 Amazon EFS FileSystemId로 바꿉니다.

  5. 테스트에 필요한 Kubernetes 리소스를 생성합니다.

    kubectl apply -f specs/

    참고: 5단계에서 안내된 kubectl 명령을 실행하면 Amazon EFS 스토리지 클래스, PVC, 영구 볼륨, 포드 2개(app1app2)를 생성합니다.

  6. 기본 네임스페이스에 영구 볼륨 목록을 만들고 default/efs-claim 클레임이 포함된 영구 볼륨을 찾습니다.

    kubectl get pv efs-pv
  7. 영구 볼륨에 대해 설명합니다.

    kubectl describe pv efs-pv
  8. 두 포드가 파일에 데이터를 쓰고 있는지 테스트합니다.

    kubectl exec -it app1 -- tail /data/out1.txt  
    kubectl exec -it app2 -- tail /data/out1.txt

    1분 정도 기다립니다. 포드 2개가 /data/out1.txt에 기록한 현재 날짜가 출력에 표시됩니다.

    관련 정보

    Amazon EFS 문제 해결

AWS 공식
AWS 공식업데이트됨 일 년 전