본문 바로가기

AWS

[EKS] Amazon EBS CSI Driver 설치 및 사용하기

반응형

EBS CSI드라이버에서는 Amazon EKS 클러스터가 영구 볼륨을 위해 Amazon EBS 볼륨의 수명 주기를 관리할 수 있게 해주는 CSI 인터페이스를 제공한다.

⇒ EBS CSI 드라이버를 EKS 클러스터에 배포하고 제대로 동작하는지 확인

 

순서

1. IRSA를 위한 IAM Policy 생성 (EBS CLI Controller 파드를 위한 정책 생성)
2. 기 생성한 IAM 정책을 IAM Role에 연결
    a. IAM Role의 신뢰 관계는 EKS의 OIDC
    b. Condition에는 ebs-csi-controller-sa 서비스어카운트만 허용한다.
3. EBS CSI Driver 설치
4. 동작 테스트 및 Log 확인

 

 

IAM Policy (JSON) to Terraform data block

=> IAM Policy를 Terraform data block에서 사용할 수 있도록 도와주는 웹 사이트이다. (아주 편함)

URL : https://flosell.github.io/iam-policy-json-to-terraform/

 

 

// CSI Driver
data "aws_iam_policy_document" "csi_driver" {
  statement {
    sid       = ""
    effect    = "Allow"
    resources = ["*"]

    actions = [
      "ec2:CreateSnapshot",
      "ec2:AttachVolume",
      "ec2:DetachVolume",
      "ec2:ModifyVolume",
      "ec2:DescribeAvailabilityZones",
      "ec2:DescribeInstances",
      "ec2:DescribeSnapshots",
      "ec2:DescribeTags",
      "ec2:DescribeVolumes",
      "ec2:DescribeVolumesModifications",
    ]
  }

  statement {
    sid    = ""
    effect = "Allow"

    resources = [
      "arn:aws:ec2:*:*:volume/*",
      "arn:aws:ec2:*:*:snapshot/*",
    ]

    actions = ["ec2:CreateTags"]

    condition {
      test     = "StringEquals"
      variable = "ec2:CreateAction"

      values = [
        "CreateVolume",
        "CreateSnapshot",
      ]
    }
  }

  statement {
    sid    = ""
    effect = "Allow"

    resources = [
      "arn:aws:ec2:*:*:volume/*",
      "arn:aws:ec2:*:*:snapshot/*",
    ]

    actions = ["ec2:DeleteTags"]
  }

  statement {
    sid       = ""
    effect    = "Allow"
    resources = ["*"]
    actions   = ["ec2:CreateVolume"]

    condition {
      test     = "StringLike"
      variable = "aws:RequestTag/ebs.csi.aws.com/cluster"
      values   = ["true"]
    }
  }

  statement {
    sid       = ""
    effect    = "Allow"
    resources = ["*"]
    actions   = ["ec2:CreateVolume"]

    condition {
      test     = "StringLike"
      variable = "aws:RequestTag/CSIVolumeName"
      values   = ["*"]
    }
  }

  statement {
    sid       = ""
    effect    = "Allow"
    resources = ["*"]
    actions   = ["ec2:DeleteVolume"]

    condition {
      test     = "StringLike"
      variable = "ec2:ResourceTag/CSIVolumeName"
      values   = ["*"]
    }
  }

  statement {
    sid       = ""
    effect    = "Allow"
    resources = ["*"]
    actions   = ["ec2:DeleteVolume"]

    condition {
      test     = "StringLike"
      variable = "ec2:ResourceTag/ebs.csi.aws.com/cluster"
      values   = ["true"]
    }
  }

  statement {
    sid       = ""
    effect    = "Allow"
    resources = ["*"]
    actions   = ["ec2:DeleteSnapshot"]

    condition {
      test     = "StringLike"
      variable = "ec2:ResourceTag/CSIVolumeSnapshotName"
      values   = ["*"]
    }
  }

  statement {
    sid       = ""
    effect    = "Allow"
    resources = ["*"]
    actions   = ["ec2:DeleteSnapshot"]

    condition {
      test     = "StringLike"
      variable = "ec2:ResourceTag/ebs.csi.aws.com/cluster"
      values   = ["true"]
    }
  }
}

 

IAM Role이 생성되었으므로 이 Role을 통해 CSI-Driver Controller 파드에 부착 (IRSA)

 

Manifest를 이용한 CSI Driver Controller 배포

GitHub 리포지토리를 로컬 시스템에 복제

git clone <https://github.com/kubernetes-sigs/aws-ebs-csi-driver.git>

 

디렉터리 이동

cd aws-ebs-csi-driver/deploy/kubernetes/base/

 

 

(Option) EBS Volume이 생성될 때 Tag를 자동으로 생성되게 하고 싶은 경우

 

아래와 같이 extra-tags를 지정해주면 된다. 이는 물론 CSI Driver Docs를 보면 자세히 나온다.

...
containers:
        - name: ebs-plugin
          image: amazon/aws-ebs-csi-driver:latest
          imagePullPolicy: IfNotPresent
          args:
            # - {all,controller,node} # specify the driver mode
            - --endpoint=$(CSI_ENDPOINT)
            - --logtostderr
            - --v=5
            - --extra-tags=department=accounting,environment=dev
...

 

 

kustomization.yaml 파일에서 Region에 맞게 Image 변경 (ap-northeast-2)

cd ../overlays/stable/ecr

➜  ecr git:(master) ✗ pwd
/home/user/git/kubernetes/aws-ebs-csi-driver/deploy/kubernetes/overlays/stable/ecr

➜  ecr git:(master) ✗ ls
kustomization.yaml

➜  ecr git:(master) ✗ vim kustomization.yaml

kubectl apply -k ../ecr

 

7번째 줄 => 이미지의 리전 변경

 

- ebs-csi-controller-sa Kubernetes 서비스 어카운트에 주석을 지정

kubectl annotate serviceaccount ebs-csi-controller-sa \\
    -n kube-system \\
    eks.amazonaws.com/role-arn=arn:aws:iam::111122223333:role/AmazonEKS_EBS_CSI_DriverRole

 

- 드라이버 포드를 삭제합니다.
   역할에 할당된 IAM 정책의 IAM 권한을 사용하여 자동으로 재배포

kubectl delete pods \\
    -n kube-system \\
    -l=app=ebs-csi-controller

 

Pod 제한수가 있으므로 혹시 모르니 Node Group의 수를 1개 → 2개로 증가

 

(이 부분은 진행하지 않으셔도 됨)

➜  EKS-2 git:(dev) ✗ kubectl get nodes -o jsonpath="{range .items[*]}{.metadata.labels['beta\\.kubernetes\\.io\\/instance-type']}{'\\t'}{.status.capacity.pods}{'\\n'}{end}"
t3.medium       17

➜  EKS-2 git:(dev) ✗ kubectl get pods -A | wc -l
11

증가한 이후

➜  EKS-2 git:(dev) ✗ kubectl get nodes -o jsonpath="{range .items[*]}{.metadata.labels['beta\\.kubernetes\\.io\\/instance-type']}{'\\t'}{.status.capacity.pods}{'\\n'}{end}"
t3.medium       17
t3.medium       17

➜  EKS-2 git:(dev) ✗
➜  EKS-2 git:(dev) ✗
➜  EKS-2 git:(dev) ✗ kubectl get pods -A | wc -l
13

 

다시 Controller 재생성한 뒤 확인

➜  kubernetes kubectl get pod -n kube-system -l "app.kubernetes.io/name=aws-ebs-csi-driver,app.kubernetes.io/instance=aws-ebs-csi-driver"
NAME                                  READY   STATUS    RESTARTS   AGE
ebs-csi-controller-79c664c46f-kqxwv   5/5     Running   0          88s
ebs-csi-controller-79c664c46f-zqz7v   5/5     Running   0          88s
ebs-csi-node-2dlf9                    3/3     Running   0          88s
ebs-csi-node-vlnmx                    3/3     Running   0          88s

 

샘플 애플리케이션을 통해 CSI 드라이버가 작동 중인지 확인하기

 

아래의 App 테스트 코드를 그대로 따라하기

: 링크 접속한 뒤 따라하면 됨

https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/ebs-csi.html

 

 

 

Helm으로 설치된 Controller 패키지 삭제

혹시 Helm3로 설치하였고 실습을 마무리하였다면 패키지를 삭제해준다.

➜  dynamic-provisioning git:(master) helm -n kube-system uninstall aws-ebs-csi-driver
W1116 17:36:06.061538    7786 warnings.go:70] policy/v1beta1 PodDisruptionBudget is deprecated in v1.21+, unavailable in v1.25+; use policy/v1 PodDisruptionBudget
release "aws-ebs-csi-driver" uninstalled

 

문제 해결

CSI Driver가 권한 문제로 Volume을 생성하지 못하여 PVC가 Pending 상태였음

caused by: AccessDenied: Not authorized to perform sts:AssumeRoleWithWebIdentity

 

기 생성된 서비스 어카운트의 이름은 아래와 같지만

 

Terraform을 통해 생성된 Principle은 아래와 같이 다르다. 즉, Principle에서 Allow가 되지 않음

 

ebs-csi-controller-sa <-> csi_driver

 

ServiceAccount Principle를 변경

 

PV 잘 부착된 모습

 

 

 

 

 

 

다른 Zone의 Pod와 Volume을 공유하고 싶다면 AWS에서 제공하는 NFS 서비스인 EFS 사용을 고려할 수 있으며, 이 때 EKS 환경이라면 EFS CSI Driver를 사용할 수 있다.

 

EBS CSI Driver와 같이 따라오는 친구가 EFS CSI Driver이다.

 

전체적인 과정은 EBS CSI Driver와 유사하며, 다른 글에서 정리해보겠음

 

반응형