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 바인딩
PV 바인딩5.
Pod이 스케쥴되면 Node Plugin이 해당 노드에서 Attach
Mount 수행
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 은 파드의 스케줄링 제약 조건에 의해 지정된 토폴로지에 따라 선택되거나 프로비전됩니다.






