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

6분 분량
0

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

간략한 설명

Amazon EKS에서 영구 스토리지를 사용하려면 다음 옵션 중 하나에 대한 단계를 완료하세요.

참고: 최신 버전의 드라이버를 설치하는 것이 가장 좋습니다. 최신 드라이버를 설치하는 방법에 대한 단계는 GitHub 웹 사이트에서 aws-ebs-csi-driveraws-efs-csi-driver를 참조하세요.

해결 방법

참고: AWS Command Line Interface(AWS CLI) 명령 실행 시 오류가 발생하는 경우, AWS CLI 오류 문제 해결을 참고하세요. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하세요.

사전 요구 사항:

  • AWS CLI를 설치합니다.
  • 명령에는 kubectl 버전 1.14 이상을 사용하세요. 자세한 내용을 보려면 ](https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html)kubectl 설치 또는 업데이트[를 참조하세요.
  • AWS Identity and Access Management(IAM) 권한을 생성으로 설정합니다. 그런 다음 Amazon EKS 작업자 노드 역할 CSI 드라이버 역할에 정책을 연결합니다.
  • Amazon EKS 클러스터를 생성하고 워커 노드를 클러스터에 연결합니다.
    참고: kubectl get nodes 명령을 실행하여 워커 노드가 클러스터에 연결되어 있는지 확인합니다.
  • 다음 명령을 실행하여 클러스터에 AWS IAM OpenID Connect(OIDC) 공급자가 있는지 확인합니다.
    aws eks describe-cluster --name your_cluster_name --query "cluster.identity.oidc.issuer" --output text
    참고: your_cluster_name을 클러스터 이름으로 바꿉니다.
  • 다음 명령을 실행하여 IAM OIDC 공급자가 구성되었는지 확인합니다.
    aws iam list-open-id-connect-providers | grep <ID of the oidc provider>
    참고: OIDC 공급자의 ID를 해당 OIDC ID로 바꿉니다. 계정에 "No OpenIDConnect provider found in your account"이라는 오류 메시지가 표시되면 IAM OIDC 공급자를 생성해야 합니다.
  • eksctl를 설치하거나 업데이트합니다. 지침은 eksctl 웹 사이트에서의 설치를 참조하세요.
  • 다음 명령을 실행하여 IAM OIDC 공급자를 생성합니다.
    eksctl utils associate-iam-oidc-provider --cluster my-cluster --approve
    참고: my-cluster를 클러스터 이름으로 바꿉니다.

아마존 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를 해당 AWS 계정 ID로, YOUR_AWS_REGION을 해당 AWS 리전으로, OIDC ID를 해당 OIDC ID로 바꿉니다.

  2. AmazonEKS_EBS_CSI_DriverRole이라는 이름의 IAM 역할을 생성합니다.

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

    aws iam attach-role-policy
    --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy
    --role-name AmazonEKS_EBS_CSI_DriverRole
  4. Amazon EBS CSI 드라이버를 배포합니다.
    참고: Kustomize, Helm 또는 Amazon EKS 관리형 애드온을 사용하여 EBS CSI 드라이버를 배포할 수 있습니다. EBS CSI 드라이버를 배포하는 방법에 대한 지침은 GitHub 웹 사이트에서 설치를 참조하세요.

Amazon EBS CSI 드라이버 테스트

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

Amazon EFS CSI 드라이버

CSI 드라이버의 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

    참고: 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

    참고: YOUR_AWS_ACCOUNT_ID를 해당 계정 ID로, YOUR_AWS_REGION을 해당 AWS 리전으로, XXXXXXXXXX45D83924220DC4815XXXXX를 해당 클러스터의 OIDC 공급자 ID로 바꿉니다.

  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 서비스 계정을 생성합니다.

    kubectl apply -f efs-service-account.yaml

    참고: efs-csi-controller-sa라는 이름의 Kubernetes 서비스 계정에는 생성한 IAM 역할로 주석이 지정됩니다.

  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

    참고: EFS CSI 드라이버를 설치하려면 Helm 및 AWS 프라이빗 또는 퍼블릭 레지스트리로 사용자 정의할 수 있습니다. EFS CSI 드라이버를 설치하는 방법에 대한 지침은 GitHub 웹 사이트에서 AWS EFS CSI 드라이버를 참조하세요.

  10. public-ecr-driver.yaml 파일을 편집하고 efs-csi-controller-sa Kubernetes 서비스 계정 섹션에 IAM 역할의 ARN으로 주석을 추가합니다.

apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    app.kubernetes.io/name: aws-efs-csi-driver
  annotations:
    eks.amazonaws.com/role-arn: arn:aws:iam::<accountid>:role/AmazonEKS\_EFS\_CSI\_DriverRole
  name: efs-csi-controller-sa
  namespace: kube-system

Amazon EFS CSI 드라이버 배포

다음 단계를 완료합니다.

  1. 매니페스트 적용:

    $ 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
    참고: your_cluster_name을 클러스터 이름으로 바꿉니다.
  2. VPC 클러스터의 CIDR 범위를 가져오려면 다음 명령을 실행합니다.
    aws ec2 describe-vpcs --vpc-ids YOUR_VPC_ID --query "Vpcs[].CidrBlock" --output text
    참고: YOUR_VPC_ID를 해당 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를 해당 VPC ID로 바꿉니다. 나중에 사용할 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을 해당 VPC CIDR로, sg-xxx를 보안 그룹 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를 해당 EFS 파일 시스템의 ID로, sg-xxx를 해당 보안 그룹의 ID로, SubnetID를 해당 워커 노드 서브넷의 ID로 바꿉니다. 여러 서브넷에 탑재 대상을 생성하려면 각 서브넷 ID에 대해 명령을 실행합니다. 워커 노드가 실행 중인 각 가용 영역에 마운트 대상을 만드는 것이 가장 좋습니다. 워커 노드가 실행되는 모든 가용 영역에 마운트 대상을 생성할 수 있습니다. 그러면 이러한 가용 영역의 모든 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스가 파일 시스템을 사용할 수 있습니다.

Amazon EFS CSI 드라이버 테스트

동일한 파일에 쓰는 두 개의 포드를 배포하려면 GitHub 웹사이트에서 다중 포드 읽기 쓰기 다수를 참조하세요.

관련 정보

Amazon EFS 문제 해결