쿠버네티스 일반

EKS CSI Driver 설치

Jerry_이정훈 2022. 6. 15. 14:04
728x90

EKS를 설치하고 나면 기본적으로 해야할 일이 있다. 기본 gp2 StorageClass를 사용하지 않고 gp3 기반의 ebs-sc 스토리지 클래스 사용하고 prometheus, grafana, loki, ingress 등 여러 필수 요소들도 설치해야 한다.

 

오늘은 그 중 ebs-sc csi driver 설치 및 사용법을 정리하였다.

 

TL; DR

  • 코드 및 스크립트를 이용하여 eks ebs-sc 스토리지 클래스 설치 가능하다.
  • 코드 기반이라 반복 사용이 가능하며 작업 시간도 10분 내외만 소요된다.

Photo by Megat Irfan on Unsplash

AWS의 많은 것들이 그렇듯이 eks csi-driver 설치 작업도 aws 공식 문서를 보고 따라하면 대부분 가능하다. (그래서 굳이 이렇게 블로그를 쓰는 이유도 없기는 하다. 하지만 나의 편집본이 작은 도움이라도 될 수 있어 남겨본다. 솔직히 나에게 가장 큰 도움이 되겠지만.)

 

eks csi-driver 설치 참조

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

 

Managing the Amazon EBS CSI driver as an Amazon EKS add-on - Amazon EKS

Managing the Amazon EBS CSI driver as an Amazon EKS add-on To improve security and reduce the amount of work, you can manage the Amazon EBS CSI driver as an Amazon EKS add-on. For information about Amazon EKS add-ons, see Amazon EKS add-ons. You can add th

docs.aws.amazon.com

 

먼저 CSI(Container Storage Interface)란 스토리지 관련 기능을 쿠버네티스 코어 기능에서 분리하여 각 벤더 별로 스냅샷, 볼륨 확장 등의 스토리지 부가 기능을 자유롭게 확장할 수 있도록 만든 인터페이스이다. 

 

eks에서 ebs-sc csi driver 설치는 eks add-on으로 하는 방법과 수동으로 설치하는 방법 2가지가 있다. 불과 올해 초까지만 해도 수동으로 설치해야 snapshot을 지원했는데 이제 add-on으로 설치해도 snapshot 기능을 지원해서 add-on 설치 방법을 사용하였다. 수동 설치도 어렵지 않는데 add-on이 그나마 aws에서 관리를 하니 심적인 안정감이 더 있는게 사실이기는 해서 add-on 방식을 사용한다.

 

csi-driver를 설치하려면 먼저 IAM policy, role, SA 생성이 필요하다. aws 가이드에 따라 설치한다.

$ (⎈ |kr-stage-new:psmdb) 
## 각자 region, cluster 이름을 입력한다. 
REGION=ap-northeast-2
CLUSTER_NAME=new-switch-stage

eksctl create iamserviceaccount \
  --region $REGION \
  --name ebs-csi-controller-sa \
  --namespace kube-system \
  --cluster $CLUSTER_NAME \
  --attach-policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy \
  --approve \
  --role-only \
  --role-name AmazonEKS_EBS_CSI_DriverRole

나는 기존에 seoul 리전이 아니라 oregon 리전의 클러스터에서 이미 위 policy, role을 사용해서 같은 script로 seoul 리전 작업 시 에러가 발생하였다. policy, role 이름을 각각 AmazonEBSCSIDriverPolicy01, AmazonEKS_EBS_CSI_DriverRole01 로 변경하고 AWS GUI Console에서 수동으로 작업해서 작업을 완료할 수 있었다. 

 

service account를 만들고 다음으로 snapshot 관련 component를 설치한다. 이게 순서가 중요한데, csi-driver add-on 설치후에 snapshot component를 설치하면 snapshot이 제대로 동작하지 않는다고 한다. 

 

해당 내용 스크린샷

snapshot component는 위 링크를 참조하면 조금 복잡한데, 간단히 아래와 같이 하면된다. 

$ (⎈ |kr-stage-new:kube-system) k apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/client/config/crd/snapshot.storage.k8s.io_volumesnapshotclasses.yaml
k apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/client/config/crd/snapshot.storage.k8s.io_volumesnapshotcontents.yaml
k apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/client/config/crd/snapshot.storage.k8s.io_volumesnapshots.yaml

customresourcedefinition.apiextensions.k8s.io/volumesnapshotclasses.snapshot.storage.k8s.io configured
customresourcedefinition.apiextensions.k8s.io/volumesnapshotcontents.snapshot.storage.k8s.io configured
customresourcedefinition.apiextensions.k8s.io/volumesnapshots.snapshot.storage.k8s.io configured

## 이미 설치한 내역이 있어 'unchanged'라고 나온다. 새롭게 설치하면 'created'라고 나올 것이다.
# jerry @ Jerrys-MacBook-Pro in ~/Downloads [13:20:02]
$ (⎈ |kr-stage-new:kube-system) k apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/deploy/kubernetes/snapshot-controller/rbac-snapshot-controller.yaml

serviceaccount/snapshot-controller unchanged
clusterrole.rbac.authorization.k8s.io/snapshot-controller-runner unchanged
clusterrolebinding.rbac.authorization.k8s.io/snapshot-controller-role unchanged
role.rbac.authorization.k8s.io/snapshot-controller-leaderelection unchanged
rolebinding.rbac.authorization.k8s.io/snapshot-controller-leaderelection unchanged

# jerry @ Jerrys-MacBook-Pro in ~/Downloads [13:20:08]
$ (⎈ |kr-stage-new:kube-system) k apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/deploy/kubernetes/snapshot-controller/setup-snapshot-controller.yaml

deployment.apps/snapshot-controller unchanged

snapshot이 끝났으니 다음으로 csi-driver add-on 설치한다.

## account id는 각자 id로 변경한다.
$ (⎈ |kr-stage-new:kube-system) eksctl create addon --region $REGION --name aws-ebs-csi-driver --cluster $CLUSTER_NAME --service-account-role-arn arn:aws:iam::XXXXXXXXXX:role/AmazonEKS_EBS_CSI_DriverRole01 --force
2022-06-15 13:23:22 [ℹ]  Kubernetes version "1.22" in use by cluster "new-switch-stage"
2022-06-15 13:23:22 [ℹ]  using provided ServiceAccountRoleARN "arn:aws:iam::886632063643:role/AmazonEKS_EBS_CSI_DriverRole01"
2022-06-15 13:23:22 [ℹ]  creating addon
2022-06-15 13:24:53 [ℹ]  addon "aws-ebs-csi-driver" active

다음으로 csi-driver를 사용하는 storage class를 설치한다. storage class란 PVC 할당 시 사용하는 비슷한 성격의 스토리지의 묶음 정도로 이해하면 된다.

## 02.ebs-default-storageclass.yaml 이름으로 만들었다.
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ebs-sc
  annotations:
    storageclass.kubernetes.io/is-default-class: "true"
provisioner: ebs.csi.aws.com
volumeBindingMode: WaitForFirstConsumer
  • metadata.annotations:
    신규로 만드는 ebs-sc 스토리지 클래스를 default 스토리지 클래스로 설정한다. eks 생성 시 기본 제공하는 'gp2'보다 'gp3' 기반이라 성능과 가격 측면에서 우월하다. 

위 storage class yaml 파일을 이용해서 storage class 만든다.

$ (⎈ |kr-stage-new:kube-system) ka 02.ebs-default-storageclass.yaml
storageclass.storage.k8s.io/ebs-sc created

default storage class는 2개가 될 수 없으니 eks 생성 시 기본 제공하는 gp2 스토리지 클래스의 default storage class 설정을 아래 patch 명령어로 해제한다.

$ (⎈ |kr-stage-new:kube-system) kubectl patch storageclass gp2 -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'
storageclass.storage.k8s.io/gp2 patched

스토리지 클래스를 확인하면 ebs-sc가 default storage class 지정되어 만들어졌고 기본 gp2 storage class는 default 설정이 해제된 걸 확인할 수 있다.

$ (⎈ |kr-stage-new:kube-system) k get sc
NAME               PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
ebs-sc (default)   ebs.csi.aws.com         Delete          WaitForFirstConsumer   false                  63s
gp2                kubernetes.io/aws-ebs   Delete          WaitForFirstConsumer   false                  7d3h

이제 새롭게 생성한 ebs-sc로 PVC가 정상적으로 잘 만들어지는지 확인한다. 그리고 해당 PVC를 파드에 연결하면 해당 볼륨에 이상없이 쓰기 작업이 되는지 확인한다. 

## ebs-pvc.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: ebs-claim
  namespace: default
spec:
  accessModes:
    - ReadWriteOnce
 ## 새롭게 생성한 storage class 이름을 지정한다.
  storageClassName: ebs-sc
  resources:
    requests:
      storage: 4Gi
 
 ## pvc-pod.yml
 apiVersion: v1
kind: Pod
metadata:
  name: pvc-pod
  namespace: default
spec:
  containers:
  - name: app
    image: centos
    command: ["/bin/sh"]
    args: ["-c", "while true; do echo $(date -u) >> /data/out.txt; sleep 5; done"]
    volumeMounts:
    - name: persistent-storage
      mountPath: /data
  volumes:
  - name: persistent-storage
    persistentVolumeClaim:
    ## 위에서 생성한 PVC 이름을 지정한다.
      claimName: ebs-claim

 위 2개의 YAML 파일로 POD와 PVC를 만든다.

$ (⎈ |kr-stage-new:default) k apply -f ebs-pvc.yaml -f pvc-pod.yaml

# 파드와 PVC가 정상적으로 생성된다.
$ (⎈ |kr-stage-new:default) k get pvc,pod
NAME                              STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/ebs-claim   Bound    pvc-83ce5812-8ab3-400f-b2e4-ca971e2f43a2   4Gi        RWO            ebs-sc         19m

NAME          READY   STATUS    RESTARTS   AGE
pod/pvc-pod   1/1     Running   0          19m

파드에 PVC 마운트한 디렉토리 /data/out.txt를 cat으로 확인하면 정상적으로 파일이 쓰여지는 걸 확인할 수 있다. 새롭게 생성한 ebs-sc 스토리지 클래스가 정상적으로 작동하는 걸 알 수 있다. 이제 gp2 안쓰고 ebs-sc 사용하면 된다.

$ (⎈ |kr-stage-new:default) k exec pvc-pod -- cat /data/out.txt
Wed Jun 15 04:28:14 UTC 2022
Wed Jun 15 04:28:19 UTC 2022
Wed Jun 15 04:28:24 UTC 2022
Wed Jun 15 04:28:29 UTC 2022

이상, EKS를 새롭게 만들고 나면 작업해야 하는 EBS CSI Driver 설치 작업을 공유하였다.

반응형