Search
moon
sun

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 은 파드의 스케줄링 제약 조건에 의해 지정된 토폴로지에 따라 선택되거나 프로비전됩니다.