1. Amazon EBS CSI Driver 설치
이번 실습은 3장 Amazon EKS 원클릭 배포 환경에서 진행합니다.
그리고 새롭게 인프라를 배포하면 아래 기본 설정 명령을 입력 후 진행 바랍니다.
기본 설정 명령어
1.1. Amazon EBS CSI Driver 설치 및 IRSA 생성
Amazon EBS CSI Driver의 권한을 위임하기 위한 인증 절차로 IRSA 구성을 선행하고 Amazon EBS CSI Driver를 설치합니다.
Amazon EBS CSI Driver 버전 정보
aws eks describe-addon-versions \
--addon-name aws-ebs-csi-driver \
--kubernetes-version 1.26 \
--query "addons[].addonVersions[].[addonVersion, compatibilities[].defaultVersion]" \
--output text
Bash
복사
# Amazon EBS CSI Driver 버전 정보 (True = 기본 설치 버전)
IRSA 생성
eksctl create iamserviceaccount \
--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
Bash
복사
# AWS 관리형 IAM Policy인 AmazonEBSCSIDriverPolicy 사용
eksctl get iamserviceaccount --cluster ${CLUSTER_NAME}
Bash
복사
# IRSA 확인
Amazon EBS CSI Driver Add-On 설치
eksctl create addon --name aws-ebs-csi-driver\
--cluster ${CLUSTER_NAME}\
--service-account-role-arn arn:aws:iam::${ACCOUNT_ID}:role/AmazonEKS_EBS_CSI_DriverRole\
--force
Bash
복사
# aws-ebs-csi-driver add-on 설치
1.2. Amazon EBS CSI Driver 설치 확인
Amazon EKS 클러스터 Add-On 확인
eksctl get addon --cluster ${CLUSTER_NAME}
Bash
복사
# 클러스터에 설치된 add-on 확인
Amazon EBS CSI Driver의 컨테이너 확인
kubectl get pod -n kube-system -l app=ebs-csi-controller -o jsonpath='{.items[0].spec.containers[*].name}' ; echo
Bash
복사
# ebs-csi-controller 파드에 컨테이너 확인
kubectl get daemonset -n kube-system -l app.kubernetes.io/name=aws-ebs-csi-driver -o jsonpath='{.items[0].spec.template.spec.containers[*].name}' ; echo
Bash
복사
# ebs-csi-node 데몬셋에 컨테이너 확인
csinode 확인
kubectl get csinodes
Bash
복사
# csinodes 확인
2. Amazon EBS CSI Driver의 정적 프로비저닝 구성
Amazon EBS CSI Driver 환경에서 정적 프로비저닝을 구성합니다.
2.1. EBS 볼륨 생성
EBS 볼륨 수동 생성
aws ec2 create-volume \
--size 5 \
--availability-zone ap-northeast-2c \
--volume-type gp3 \
--tag-specifications 'ResourceType=volume,Tags=[{Key=Name,Value=static-ebs-vol}]'
Bash
복사
# EBS 볼륨 생성 - 가용 영역: ap-northeast-2c
EBS_ID=$(aws ec2 describe-volumes --query "Volumes[?Tags[?Value=='static-ebs-vol']].[VolumeId]" --output text); echo $EBS_ID
Bash
복사
# EBS 볼륨 ID 변수 선언
aws ec2 describe-volumes --volume-ids $EBS_ID | jq
Bash
복사
# 생성된 EBS 볼륨 확인
신규 터미널 - 모니터링
watch -d kubectl get pod,pv,pvc
Bash
복사
# [신규 터미널] pod, pv, pvc 모니터링
2.2. 정적 프로비저닝 구성 - PV, PVC, 파드 생성 및 확인
정적 프로비저닝 - PV 생성
curl -s -O https://raw.githubusercontent.com/cloudneta/cnaeblab/master/_data/ebs_sp_pv.yaml
Bash
복사
# yaml 파일 다운로드
cat ebs_sp_pv.yaml | yh
Bash
복사
# yaml 파일 확인
sed -i "s/vol-01234567890123456/$EBS_ID/g" ebs_sp_pv.yaml; cat ebs_sp_pv.yaml | yh
Bash
복사
# EBS 볼륨 ID 치환
kubectl apply -f ebs_sp_pv.yaml
Bash
복사
# PV 생성
kubectl describe pv | yh
Bash
복사
# PV 정보 확인
정적 프로비저닝 - PVC 생성
curl -s -O https://raw.githubusercontent.com/cloudneta/cnaeblab/master/_data/ebs_sp_pvc.yaml
Bash
복사
# yaml 파일 다운로드
cat ebs_sp_pvc.yaml | yh
Bash
복사
# yaml 파일 확인
kubectl apply -f ebs_sp_pvc.yaml
Bash
복사
# PVC 생성
정적 프로비저닝 - 파드 생성
curl -s -O https://raw.githubusercontent.com/cloudneta/cnaeblab/master/_data/ebs_sp_pod.yaml
Bash
복사
# yaml 파일 다운로드
cat ebs_sp_pod.yaml | yh
Bash
복사
# yaml 파일 확인
kubectl apply -f ebs_sp_pod.yaml
Bash
복사
# 파드 생성
볼륨 정보 확인
kubectl get VolumeAttachment
Bash
복사
# VolumeAttachment 확인
kubectl exec -it ebs-sp-app -- sh -c 'df -hT --type=ext4'
Bash
복사
# 파드에서 마운트 대상의 디스크 사용 확인
kubectl df-pv
Bash
복사
# 클러스터 내 PV의 디스크 사용 확인 (krew tool)
2.3. 데이터 유지 확인
파드에서 데이터 확인
kubectl exec ebs-sp-app -- tail -f /data/out.txt
Bash
복사
# 파드에서 out.txt 파일 확인
컨테이너 프로세스 재시작 후 확인
kubectl exec ebs-sp-app -c app -- kill -s SIGINT 1
Bash
복사
# 컨테이너 프로세스 강제 종료 후 재시작
kubectl exec ebs-sp-app -- tail -f /data/out.txt
Bash
복사
# 파드에서 out.txt 파일 확인
파드 재생성 후 확인
kubectl delete pod ebs-sp-app
kubectl apply -f ebs_sp_pod.yaml
Bash
복사
# 파드 삭제 후 생성
kubectl exec ebs-sp-app -- head /data/out.txt
kubectl exec ebs-sp-app -- tail -f /data/out.txt
Bash
복사
# 파드에서 out.txt 파일 확인
실습 종료 후 자원 삭제
kubectl delete pod ebs-sp-app
Bash
복사
# 파드 삭제
kubectl delete pvc ebs-sp-claim
Bash
복사
# PVC 삭제
kubectl delete pv ebs-sp-pv
Bash
복사
# PV 삭제
aws ec2 delete-volume --volume-id $EBS_ID
aws ec2 describe-volumes --volume-ids $EBS_ID | jq
Bash
복사
# 수동으로 생성한 EBS 볼륨 삭제 후 확인
Note: PVC를 삭제하면 PV는 Released 상태로 전환되는데 현재 볼륨을 보존한 상태로 사용 가능한 상태가 아닙니다. 즉, PVC를 다시 생성해도 해당 PV를 사용할 수 없는 것으로 PV 상태를 강제로 Available 상태로 전환시켜야 합니다.
kubectl patch pv ebs-sp-pv -p ‘{“spec”:{“claimRef”: null}}’
3. Amazon EBS CSI Driver의 동적 프로비저닝 구성
Amazon EBS CSI Driver 환경에서 동적 프로비저닝을 구성합니다.
3.1. 동적 프로비저닝 구성 - StorageClass, PVC, 파드 생성 및 확인
신규 터미널 - 모니터링
watch -d kubectl get pod,pv,pvc,sc
Bash
복사
# [신규 터미널 1] pod, pv, pvc, sc 모니터링
while true; do aws ec2 describe-volumes --filters Name=tag:ebs.csi.aws.com/cluster,Values=true --query "Volumes[].{VolumeId: VolumeId, VolumeType: VolumeType, InstanceId: Attachments[0].InstanceId, State: Attachments[0].State}" --output text; date; sleep 1; done
Bash
복사
# [신규 터미널 2] 동적 프로비저닝으로 생성되는 EBS 볼륨 확인
StorageClass 생성
curl -s -O https://raw.githubusercontent.com/cloudneta/cnaeblab/master/_data/ebs_dp_sc.yaml
Bash
복사
# yaml 파일 다운로드
cat ebs_dp_sc.yaml | yh
Bash
복사
# yaml 파일 확인
kubectl apply -f ebs_dp_sc.yaml
Bash
복사
# StorageClass 생성
kubectl describe sc ebs-dp-sc
Bash
복사
# StorageClass 확인
PVC 생성
curl -s -O https://raw.githubusercontent.com/cloudneta/cnaeblab/master/_data/ebs_dp_pvc.yaml
Bash
복사
# yaml 파일 다운로드
cat ebs_dp_pvc.yaml | yh
Bash
복사
# yaml 파일 확인
kubectl apply -f ebs_dp_pvc.yaml
Bash
복사
# PVC 생성
파드 생성
curl -s -O https://raw.githubusercontent.com/cloudneta/cnaeblab/master/_data/ebs_dp_pod.yaml
Bash
복사
# yaml 파일 다운로드
cat ebs_dp_pod.yaml | yh
Bash
복사
# yaml 파일 확인
kubectl apply -f ebs_dp_pod.yaml
Bash
복사
# 파드 생성
3.2. 정보 확인
ebs-csi-controller의 provisioner 로그 확인
kubectl get pod -n kube-system
Bash
복사
# kube-system 네임 스페이스에 파드 확인
CSI_CTR_1=$(kubectl get pod -n kube-system -l app=ebs-csi-controller -o jsonpath='{.items[0].metadata.name}') ; echo $CSI_CTR_1
CSI_CTR_2=$(kubectl get pod -n kube-system -l app=ebs-csi-controller -o jsonpath='{.items[1].metadata.name}') ; echo $CSI_CTR_2
Bash
복사
# ebs-csi-controller 이름 변수 선언
kubectl logs $CSI_CTR_1 -n kube-system -c csi-provisioner --tail 10
kubectl logs $CSI_CTR_2 -n kube-system -c csi-provisioner --tail 10
Bash
복사
# ebs-csi-controller의 provisioner 로그 확인 (Primary 대상에서 확인)
PV 확인
kubectl describe pv | yh
Bash
복사
# pv 정보 확인
ebs-csi-controller의 attacher 로그 확인
kubectl logs $CSI_CTR_1 -n kube-system -c csi-attacher --tail 10
kubectl logs $CSI_CTR_2 -n kube-system -c csi-attacher --tail 10
Bash
복사
# ebs-csi-controller의 attacher 로그 확인 (Primary 대상에서 확인)
볼륨 확인
kubectl get VolumeAttachment
Bash
복사
# VolumeAttachment 확인
aws ec2 describe-volumes --volume-ids $(kubectl get pv -o jsonpath="{.items[0].spec.csi.volumeHandle}") | jq
Bash
복사
# 동적으로 추가된 EBS 볼륨 상세 정보 확인
kubectl exec -it ebs-dp-app -- sh -c 'df -hT --type=ext4'
Bash
복사
# 파드에서 마운트 대상의 디스크 사용 확인
kubectl df-pv
Bash
복사
# 클러스터 내 PV의 디스크 사용 확인 (krew tool)
파드에서 데이터 확인
kubectl exec ebs-dp-app -- tail -f /data/out.txt
Bash
복사
# 파드에서 out.txt 파일 확인
3.3. 볼륨 사이즈 증가
스토리지 용량 증가
kubectl get pvc ebs-dp-claim -o jsonpath={.status.capacity.storage} ; echo
Bash
복사
# pvc에 정의된 스토리지 용량
kubectl patch pvc ebs-dp-claim -p '{"spec":{"resources":{"requests":{"storage":"10Gi"}}}}'
Bash
복사
# pvc에 정의된 스토리지 용량을 증가 (4Gi -> 10Gi)
정보 확인
kubectl exec -it ebs-dp-app -- sh -c 'df -hT --type=ext4'
Bash
복사
# 파드에서 마운트 대상의 디스크 사용 확인
kubectl df-pv
Bash
복사
# 클러스터 내 PV의 디스크 사용 확인 (krew tool)
ebs-csi-controller의 resizer 로그 확인
kubectl logs $CSI_CTR_1 -n kube-system -c csi-resizer --tail 10
kubectl logs $CSI_CTR_2 -n kube-system -c csi-resizer --tail 10
Bash
복사
# ebs-csi-controller의 resizer 로그 확인 (Primary 대상에서 확인)
실습 종료 후 자원 삭제
kubectl delete pod ebs-dp-app
Bash
복사
# 파드 삭제
kubectl delete pvc ebs-dp-claim
Bash
복사
# PVC 삭제
kubectl delete sc ebs-dp-sc
Bash
복사
# StorageClass 삭제
4. Amazon Volume Snapshot Controller 구성
Amazon EBS CSI Driver 환경에서 Amazon Volume Snapshot Controller를 구성합니다.
4.1. Amazon Volume Snapshot Controller 설치
external-snapshotter CRDs 설치 및 확인
curl -s -O https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/client/config/crd/snapshot.storage.k8s.io_volumesnapshots.yaml
curl -s -O https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/client/config/crd/snapshot.storage.k8s.io_volumesnapshotclasses.yaml
curl -s -O https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/client/config/crd/snapshot.storage.k8s.io_volumesnapshotcontents.yaml
Bash
복사
# external-snapshotter CRDs 다운로드
kubectl apply -f snapshot.storage.k8s.io_volumesnapshots.yaml,snapshot.storage.k8s.io_volumesnapshotclasses.yaml,snapshot.storage.k8s.io_volumesnapshotcontents.yaml
Bash
복사
# external-snapshotter CRDs 설치
kubectl get crd | grep snapshot
Bash
복사
# external-snapshotter CRDs 확인
snapshot-controller 설치 및 확인
curl -s -O https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/deploy/kubernetes/snapshot-controller/rbac-snapshot-controller.yaml
curl -s -O https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/deploy/kubernetes/snapshot-controller/setup-snapshot-controller.yaml
Bash
복사
# snapshot-controller 다운로드
kubectl apply -f rbac-snapshot-controller.yaml,setup-snapshot-controller.yaml
Bash
복사
# snapshot-controller 설치
kubectl get deploy -n kube-system snapshot-controller
kubectl get pod -n kube-system -l app=snapshot-controller
Bash
복사
# snapshot-controller 확인
VolumeSnapshotClass 생성
curl -s -O https://raw.githubusercontent.com/kubernetes-sigs/aws-ebs-csi-driver/master/examples/kubernetes/snapshot/manifests/classes/snapshotclass.yaml
Bash
복사
# yaml 파일 다운로드
cat snapshotclass.yaml | yh
Bash
복사
# yaml 파일 확인
kubectl apply -f snapshotclass.yaml
Bash
복사
# VolmeSnapshotClass 생성
kubectl get vsclass
Bash
복사
# VolmeSnapshotClass 확인
4.2. 동적 프로비저닝 환경 재구성
StorageClass, PVC, 파드 생성
kubectl apply -f ebs_dp_sc.yaml
kubectl apply -f ebs_dp_pvc.yaml
kubectl apply -f ebs_dp_pod.yaml
Bash
복사
# 자원 생성
파드에서 데이터 확인
kubectl exec ebs-dp-app -- tail -f /data/out.txt
Bash
복사
# 파드에서 out.txt 파일 확인
4.3. EBS 볼륨 스냅샷 생성 및 확인
VolumeSnapshot 생성
curl -s -O https://raw.githubusercontent.com/cloudneta/cnaeblab/master/_data/ebs_vol_snapshot.yaml
Bash
복사
# yaml 파일 다운로드
cat ebs_vol_snapshot.yaml | yh
Bash
복사
# yaml 파일 확인
kubectl apply -f ebs_vol_snapshot.yaml
Bash
복사
# VolmeSnapshot 생성
kubectl get volumesnapshot
kubectl get volumesnapshotcontents
Bash
복사
# VolumeSnapshot 확인
kubectl get volumesnapshotcontents -o jsonpath='{.items[*].status.snapshotHandle}' ; echo
Bash
복사
# VolumeSnapshot ID 확인
강제로 장애 재현
kubectl delete pod ebs-dp-app && kubectl delete pvc ebs-dp-claim
Bash
복사
# 파드와 PVC 강제 삭제
4.4. EBS 볼륨 스냅샷 복원
PVC 생성 - 스냅샷 복원 설정
curl -s -O https://raw.githubusercontent.com/cloudneta/cnaeblab/master/_data/ebs_snapshot_restore_pvc.yaml
Bash
복사
# yaml 파일 다운로드
cat ebs_snapshot_restore_pvc.yaml | yh
Bash
복사
# yaml 파일 확인
kubectl apply -f ebs_snapshot_restore_pvc.yaml
Bash
복사
# PVC 생성 (restore)
파드 생성 - 스냅샷 복원 PVC 설정
curl -s -O https://raw.githubusercontent.com/cloudneta/cnaeblab/master/_data/ebs_snapshot_restore_pod.yaml
Bash
복사
# yaml 파일 다운로드
cat ebs_snapshot_restore_pod.yaml | yh
Bash
복사
# yaml 파일 확인
kubectl apply -f ebs_snapshot_restore_pod.yaml
Bash
복사
# 파드 생성 (restore)
파드에서 데이터 확인
kubectl exec ebs-dp-app -- tail -f /data/out.txt
Bash
복사
# 파드에서 out.txt 파일 확인
ebs-csi-controller의 snapshotter 로그 확인
kubectl logs $CSI_CTR_1 -n kube-system -c csi-snapshotter --tail 10
kubectl logs $CSI_CTR_2 -n kube-system -c csi-snapshotter --tail 10
Bash
복사
# ebs-csi-controller의 snapshotter 로그 확인 (Primary 대상에서 확인)
실습 종료 후 자원 삭제
kubectl delete pod ebs-dp-app && kubectl delete pvc ebs-snapshot-restored-claim && kubectl delete sc ebs-dp-sc && kubectl delete volumesnapshots ebs-volume-snapshot
Bash
복사
# 파드, PVC, StorageClass, VolumeSnapshot 삭제
Warning: 다음 섹션의 실습을 이어서 진행할 것으로 Amazon EKS 원클릭 배포를 유지합니다. 혹시나 다음 섹션을 진행하지 않을 경우 3장 Amazon EKS 원클릭 배포를 삭제해 주길 바랍니다.
여기까지 3장의 Amazon EBS CSI Driver 실습을 마칩니다.
수고하셨습니다 :)