Search

EBS CSI Driver

CSI

컨테이너 오케스트레이션 시스템과 Storage Controller ( Plugin ) 사이의 Interface이며, gRPC 기반으로 구성되어 있다
CSI는 Storage를 제어하는 Plugin, Volume Life Cycle, 컨테이너 오케스트레이션 시스템과 CSI Plugin 사이의 인터페이스를 정의한다

EBS CSI Driver

Kubernetes와 EBS 볼륨 간의 통합을 단순화하는 역할
Kubernetes 클러스터 내에서 EBS 볼륨을 쉽게 프로비저닝하고 관리 가능
Kubernetes 클러스터에서 EBS 볼륨을 효율적으로 관리하고 데이터를 안전하게 보호가능

내부 구조

구성 요소
설명
Controller Plugin
- 클러스터 내에서 1개만 실행 - PersistentVolume 생성/삭제 등 API 호출 담당 (CreateVolume, DeleteVolume 등) - AWS EC2 API를 호출해서 EBS 볼륨을 조작
Node Plugin
- 각 노드에 데몬셋으로 실행 - 볼륨 Attach/Detach, Mount/Unmount 담당 - 노드에 실제 디바이스를 연결하고 Pod에 마운트
Provisioner
- Kubernetes와 연동해 PVC 요청을 감지하고, Controller에 볼륨 생성을 요청
Attacher
- PV이 바인딩되었을 때 Attach/Detach 요청을 감지하고 처리

데이터 흐름

1.
PVC 생성
2.
External Provisioner가 PVC 감지 후 Controller에 CreateVolume 요청
3.
Controller가 AWS EC2 API로 EBS 볼륨 생성
4.
PVC PV 바인딩
5.
Pod이 스케쥴되면 Node Plugin이 해당 노드에서 Attach Mount 수행

성능

1.
비용 효율성
gp3는 gp2보다 성능 대비 저렴하다. 같은 성능을 제공하면서도 가격이 최대 20% 저렴할 수 있다.
2.
Kubernetes에서의 손쉬운 통합
Kubernetes에서 EBS 볼륨을 자동으로 프로비저닝하고, 마운트할 수 있다.

CSI의 구성 요소

Provisioner : PV 생성
Attacher : Pod가 PVC 사용 시, PV를 Mount
Controller : Volume 생성 및 삭제
NodeServer : Pod가 배포될 Node에 Volume이 Mount될 수 있도록 환경 구성

Plugin 은 쿠버네티스와 같은 CO의 명령에 따라서 스토리지를 컨트롤하는 컨트롤러이다

컨트롤러 Plugin : 스토리지 중앙 관리 기능을 담당하며, 아무 노드에서 동작해도 상관 없다
노드 Plugin : 컨테이너가 동작하는 모든 노드에서 동작하는 Plugin으로, 각 Node를 제어한다

Volume Life Cycle

• CREATED -> NODE READY -> Volume Ready -> PUBLISHED -> Delete Volume
실습

ENV

CLUSTER_NAME="<EKS_CLUSTER_NAME>" CLUSTER_OIDC=$(aws eks describe-cluster --name $CLUSTER_NAME --query "cluster.identity.oidc.issuer" --output text | cut -c 9-100) ACCOUNT=$(aws sts get-caller-identity --query "Account" --output text)
Shell
복사

EBS CSI 드라이버 신뢰 정책 생성

cat << EOF > aws-ebs-csi-driver-trust-policy.json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::ACCOUNT_ID:oidc-provider/OIDC" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "OIDC:aud": "sts.amazonaws.com" } } } ] } EOF
Shell
복사

sed 명령어로 취환

sed -i "s|ACCOUNT_ID|$ACCOUNT|g" aws-ebs-csi-driver-trust-policy.json sed -i "s|OIDC|$CLUSTER_OIDC|g" aws-ebs-csi-driver-trust-policy.json
Shell
복사

IAM 역할 생성

aws iam create-role --role-name AmazonEKS_EBS_CSI_DriverRole --assume-role-policy-document file:///home/ec2-user/aws-ebs-csi-driver-trust-policy.json
Shell
복사

IAM 역할에 정책 연결

aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy --role-name AmazonEKS_EBS_CSI_DriverRole
Shell
복사
cat << EOF > ebs-policy.json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:CreateVolume", "ec2:DeleteVolume", "ec2:AttachVolume", "ec2:DetachVolume", "ec2:DescribeVolumes", "ec2:DescribeVolumeStatus", "ec2:ModifyVolume", "ec2:CreateTags" ], "Resource": "*" } ] } EOF
Shell
복사

aws-ebs-csi-driver addon 연결

eksctl create addon --name aws-ebs-csi-driver --cluster $CLUSTER_NAME --service-account-role-arn arn:aws:iam::$ACCOUNT:role/AmazonEKS_EBS_CSI_DriverRole --force
Shell
복사

IAM 정책 생성

aws iam create-policy --policy-name EKSNodeEBSPolicy --policy-document file://ebs-policy.json
Shell
복사

IAM 역할에 정책 연결

aws iam attach-role-policy --role-name eksctl-skills-eks-cluster-nodegrou-NodeInstanceRole-2WJlpda63OIk --policy-arn <EKSNodeEBSPolicy_정책_ARN_>
Shell
복사

IAM 역할에 대한 정책 확인

aws iam list-attached-role-policies --role-name eksctl-skills-eks-cluster-nodegrou-NodeInstanceRole-2WJlpda63OIk
Shell
복사

PVC & Pod 확인

kubectl get pvc -n dev-ns kubectl get pods -n dev-ns
Shell
복사

애플리케이션 배포 및 CSI 드라이버 작동 여부 확인

sc.yaml
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: ebs-sc provisioner: ebs.csi.aws.com volumeBindingMode: WaitForFirstConsumer
YAML
복사
kubectl apply -f sc.yaml
Shell
복사
pvc.yaml
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: ebs-claim namespace: dev-ns spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: ebs-sc
YAML
복사
kubectl apply -f pvc.yaml
Shell
복사
deployment.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment namespace: dev-ns spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80 volumeMounts: - mountPath: /usr/share/nginx/html name: ebs-claim volumes: - name: ebs-claim persistentVolumeClaim: claimName: ebs-claim
YAML
복사
kubectl apply -f deployment.yaml
YAML
복사
kubectl get pod -n kube-system kubectl get sa -n kube-system kubectl describe storageclass ebs-sc # kubectl exec -it app -- cat /data/out.txt
Shell
복사
WaitForFirstConsumer 모드
컨테이너 스케줄링과 관련된 Kubernetes의 기능입니다.
PersistentVolumeClaim 을 사용하는 파드가 생성될 때까지 PersistentVolume 의 바인딩과 프로비저닝을 지연시킵니다.
PersistentVolume 은 파드의 스케줄링 제약 조건에 의해 지정된 토폴로지에 따라 선택되거나 프로비전됩니다.