베하~!!! 1-Tier팀 입니다.
원래라면 Youtube API 포스팅을 했어야 하지만... 업무 중 알게 된 CSI Driver 에 대한 정보를 공유드리고 싶어 가져왔습니다.!!!
CSI는 Kubernetes 클러스터 내에서 EFS를 사용하기 위한 드라이버로 EFS 파일 시스템을 마운트하여 컨테이너에 공유 스토리지를 제공, 관리할 수 있도록 합니다.
먼저, EKS에서 EFS의 역할부터 알아보도록 하겠습니다.
EFS는 EKS에서 여러 Pod들이 하나의 스토리지를 사용할 수 있도록 합니다.
하나의 AZ에서만 접근할 수 있는 EBS와 달리, EFS는 여러 가용 영역에서 접근할 수 있어 다른 Node에 배포되어 있는 Pod도 스토리지에 접근할 수 있습니다.
EFS를 사용하기 위해서는 드라이버가 설치되어야 하고 적절한 권한(AmazonElasticFileSystemFullAccess)이 필요합니다.
드라이버는 efs provisioner와 efs CSI driver가 있었는데 옛날 프로비저였던 efs provisioner 는 1.24버전 이후에는 사용하지 않고 현재는 CSI driver만 사용합니다.
CSI driver 장점
이전에는 각 플랫폼 별 드라이버를 따로 설치해야 하는 번거로움이 있었지만
CSI driver를 통해 하나의 드라이버로 모든 플랫폼을 제어할 수 있습니다.
CSI driver 특징
유연한 스토리지 공유: EFS CSI 드라이버는 Amazon EFS 파일 시스템을 Kubernetes 클러스터 내의 여러 컨테이너 간에 쉽게 공유할 수 있도록 합니다. 이를 통해 여러 컨테이너가 동일한 파일 시스템에 액세스하여 데이터를 공유하고 동기화할 수 있습니다.
동적 프로비저닝: EFS CSI 드라이버는 필요한 경우에 동적으로 EFS 파일 시스템을 프로비저닝합니다. 이는 클러스터 내에서 새로운 PVC (Persistent Volume Claim)를 생성할 때 필요한 파일 시스템을 자동으로 생성하고 마운트합니다.
쉬운 설정 및 관리: EFS CSI 드라이버는 Kubernetes의 CSI (Container Storage Interface) 표준을 따르므로, 설정 및 관리가 용이합니다. Kubernetes의 Persistent Volume 및 Persistent Volume Claim 개념과 함께 사용되며, 기존의 PVC 관리 방식과 일관된 방식으로 EFS를 사용할 수 있습니다.
스냅샷 및 복원: EFS CSI 드라이버를 사용하면 EFS 파일 시스템의 스냅샷을 생성하고 복원할 수 있습니다. 이는 파일 시스템의 상태를 특정 시점으로 저장하거나 이전 상태로 복원하는 데 유용합니다.
데이터 지속성 및 확장성: EFS는 데이터의 지속성과 확장성을 제공하는 관리형 파일 스토리지 서비스입니다. EFS CSI 드라이버를 통해 EFS를 사용하면 애플리케이션의 데이터를 신뢰성 있게 보호하고 필요한 경우 확장할 수 있습니다.
IAM 정책 및 역할 생성
IAM 정책문서 iam-policy-example.json다운로드
curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/docs/iam-policy-example.json
정책 생성
aws iam create-policy \
--policy-name AmazonEKS_EFS_CSI_Driver_Policy \
--policy-document file://iam-policy-example.json
# Arn 메모
IAM 정책 연결
eksctl create iamserviceaccount \
--cluster myeks \
--namespace kube-system \
--name efs-csi-controller-sa \
--attach-policy-arn arn:aws:iam::계정ID:policy/AmazonEKS_EFS_CSI_Driver_Policy \
--approve \
--region ap-northeast-2
CSI driver 설치방법
helm을 통해 설치할 수 있습니다.
1. helm 설치
curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 > get_helm.sh
chmod 700 get_helm.sh
./get_helm.sh
에러 발생 시
# get_helm.sh의 HELM_INSTALL_DIR을 $PATH와 일치하도록 수정한다.
helm not found. Is /usr/local/bin on your $PATH?
Failed to install helm
For support, go to https://github.com/helm/helm.
CSI driver 설치방법
helm을 통해 설치할 수 있습니다.
1. helm 설치
curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 > get_helm.sh
chmod 700 get_helm.sh
./get_helm.sh
에러 발생 시
# get_helm.sh의 HELM_INSTALL_DIR을 $PATH와 일치하도록 수정한다.
helm not found. Is /usr/local/bin on your $PATH?
Failed to install helm
For support, go to https://github.com/helm/helm.
2. 레퍼지토리 추가
helm repo add aws-efs-csi-driver https://kubernetes-sigs.github.io/aws-efs-csi-driver/
#추가 후 업데이트
helm repo update
3. CSI driver 설치
# 아래 링크에서 리전별 image.repository값 확인
# https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/add-ons-images.html
helm upgrade -i aws-efs-csi-driver aws-efs-csi-driver/aws-efs-csi-driver \
--namespace kube-system \
--set image.repository={리전별 값}/eks/aws-efs-csi-driver \
--set controller.serviceAccount.create=false \
--set controller.serviceAccount.name=efs-csi-controller-sa
EFS 파일 시스템 생성
VPC ID 검색 후 변수 저장
vpc_id=$(aws eks describe-cluster \
--name myeks \
--query "cluster.resourcesVpcConfig.vpcId" \
--output text)
CIDR 범위 변수 저장
cidr_range=$(aws ec2 describe-vpcs \
--vpc-ids $vpc_id \
--query "Vpcs[].CidrBlock" \
--output text \
--region ap-northeast-2)
Mount Point에 대한 Inbound SG 생성
security_group_id=$(aws ec2 create-security-group \
--group-name MyEfsSecurityGroup \
--description "My EFS security group" \
--vpc-id $vpc_id \
--output text)
Cluster VPC에 대한 CIDR -> Inbound Allow SG 생성
aws ec2 authorize-security-group-ingress \
--group-id $security_group_id \
--protocol tcp \
--port 2049 \
--cidr $cidr_range
EKS에 대한 파일 시스템 생성
file_system_id=$(aws efs create-file-system \
--region ap-northeast-2 \
--performance-mode generalPurpose \
--query 'FileSystemId' \
--output text)
Node IP와 Subnet ID, Subnet AZ 확인
aws ec2 describe-subnets \
--filters "Name=vpc-id,Values=$vpc_id" \
--query 'Subnets[*].{SubnetId: SubnetId,AvailabilityZone: AvailabilityZone,CidrBlock: CidrBlock}' \
--output table
Node 가 있는 Subnet에 대한 Mount Targets 추가
aws efs create-mount-target \
--file-system-id $file_system_id \
--subnet-id subnet-0d8be3835fe60e983 \
--security-groups $security_group_id
이렇게 CSI Driver 를 이용하여 EKS에서 EFS를 사용하는 방법에 대해 알아봤습니다.
기존 efs provisioner에 비해 하나의 드라이버로 모든 플랫폼을 제어할 수 있다는 큰 장점 덕분에 더욱 편리한 운영 환경을 구축할 수 있었습니다.
그럼 다음 포스팅에서 뵙겠습니다.!
베빠~~!
'CSP (Cloud Service Provider) > AWS' 카테고리의 다른 글
AWS OpenSearch (0) | 2023.11.10 |
---|---|
[AWS] CloudFormation Stackset (0) | 2023.11.09 |
[AWS] ASG 축소 보호 정책(2) (Protected from Scale-in) (0) | 2023.11.06 |
[AWS] ASG 축소 보호 정책(1) (Protected from Scale-in) (0) | 2023.11.04 |
[AWS] AWS RDS 엔드포인트란? (1) | 2023.11.02 |
댓글