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