EKS를 설치하고 나면 기본적으로 해야할 일이 있다. 기본 gp2 StorageClass를 사용하지 않고 gp3 기반의 ebs-sc 스토리지 클래스 사용하고 prometheus, grafana, loki, ingress 등 여러 필수 요소들도 설치해야 한다.
오늘은 그 중 ebs-sc csi driver 설치 및 사용법을 정리하였다.
TL; DR
- 코드 및 스크립트를 이용하여 eks ebs-sc 스토리지 클래스 설치 가능하다.
- 코드 기반이라 반복 사용이 가능하며 작업 시간도 10분 내외만 소요된다.
AWS의 많은 것들이 그렇듯이 eks csi-driver 설치 작업도 aws 공식 문서를 보고 따라하면 대부분 가능하다. (그래서 굳이 이렇게 블로그를 쓰는 이유도 없기는 하다. 하지만 나의 편집본이 작은 도움이라도 될 수 있어 남겨본다. 솔직히 나에게 가장 큰 도움이 되겠지만.)
eks csi-driver 설치 참조
https://docs.aws.amazon.com/eks/latest/userguide/managing-ebs-csi.html
먼저 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 설치 작업을 공유하였다.
'쿠버네티스 일반' 카테고리의 다른 글
EKS 무중단 업그레이드 경험 공유 (1) | 2023.03.10 |
---|---|
파이썬으로 여러 쿠버네티스의 클러스터 정보 가져오기 (0) | 2022.11.05 |
Strimzi Kafka Operator - Kafka 토픽 생성 (0) | 2022.06.12 |
Strimzi Kafka Operator 실습 (0) | 2022.06.10 |
온프렘 아재의 eks 사용기 (2) | 2022.03.06 |