안녕하세요 서후아빠입니다. ^_^
이번 세션은 미리 구성된 EKS 클러스터에 다양한 Storage를 Pod에 연결하는 실습을 해보겠습니다. 비용적으로 가장 저렴한 것은 EBS이지만, EBS에 연결되는 Pod는 동일한 Worker Node에서 배포되어야 하는 제약 조건이 있습니다. 이 부분에 대한 방안은 추후에 다시 살펴보도록 하겠습니다. 개인적으로는 EFS나 FSx도 EKS 콘솔에서 CSI Driver Controller를 Add-on하는 기능이 있으면 좋겠습니다.
※ 동적 볼륨 프로비저닝 : CSI 드라이버 컨트롤러 설치 > Storage Class 배포 > PVC 배포 > Pod 배포
정적 볼륨 프로비저닝 : CSI 드라이버 컨트롤러 설치 > PV 배포 > PVC 배포 > Pod 배포
사전 작업
Cloud9 환경 및 EKS 클러스터 생성 등은 아래 링크를 참조 바랍니다.
2023.06.02 - [Compute] - [실습] EKS - Cluster (eksctl, AWS 콘솔), Ingress Controller, Image
1단계 : CSI 드라이버 컨트롤러 설치
Worker Node는 최소 2개 이상으로 진행하세요. 1개로 진행 시 배포 중 "1 node(s) didn't have free ports for the requested pod ports." 에러 메시지 발생됩니다. |
EBS CSI 드라이버 컨트롤러 (EKS 콘솔에서 Add-on 하는 기능 존재)
# 작업 폴더 생성
mkdir -p ~/environment/clusterA/controller/ebs-csi-controller
cd ~/environment/clusterA/controller/ebs-csi-controller
# EBS CSI 드라이버 컨트롤러용 Service Account (SA, K8S에서 관리하는 사용자 계정) 생성 및 IAM Policy 연결
eksctl create iamserviceaccount --cluster clusterA --namespace kube-system --name ebs-csi-controller-sa --role-name AmazonEKS_EBS_CSI_DriverRole --role-only --attach-policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy --override-existing-serviceaccounts --approve
kubectl describe sa ebs-csi-controller-sa -n kube-system
# EBS CSI 드라이버 스냅샷 관련 Component 설치 (csi-driver add-on 하고, snapshot component를 설치하면 snapshot 비정상 동작)
wget https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/client/config/crd/snapshot.storage.k8s.io_volumesnapshotclasses.yaml
wget https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/deploy/kubernetes/snapshot-controller/rbac-snapshot-controller.yaml
wget https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/deploy/kubernetes/snapshot-controller/setup-snapshot-controller.yaml
kubectl apply -f snapshot.storage.k8s.io_volumesnapshotclasses.yaml
kubectl apply -f rbac-snapshot-controller.yaml
kubectl apply -f setup-snapshot-controller.yaml
# EBS CSI 드라이버 추가 기능 추가
eksctl create addon --cluster clusterA --name aws-ebs-csi-driver --service-account-role-arn arn:aws:iam::111111111111:role/AmazonEKS_EBS_CSI_DriverRole --force
kubectl get pod -A | grep csi | grep ebs
kubectl get daemonsets ebs-csi-node -n kube-system
Fargate Pod의 볼륨은 연결할 수 없습니다. 참고 URL : https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/ebs-csi.html |
EFS CSI 드라이버 컨트롤러
# 작업 폴더 생성
mkdir -p ~/environment/clusterA/controller/efs-csi-controller
cd ~/environment/clusterA/controller/efs-csi-controller
# EFS CSI 드라이버 컨트롤러용 IAM Policy 생성
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
# EFS CSI 드라이버 컨트롤러용 Service Account (SA, K8S에서 관리하는 사용자 계정) 생성 및 IAM Policy 연결
eksctl create iamserviceaccount --cluster clusterA --namespace kube-system --name efs-csi-controller-sa --attach-policy-arn arn:aws:iam::111111111111:policy/AmazonEKS_EFS_CSI_Driver_Policy --region ap-northeast-2 --approve
kubectl describe sa efs-csi-controller-sa -n kube-system
# EFS CSI 드라이버 컨트롤러 배포 파일 다운로드(가급적 최신 버전을 받으세요) 및 수정
kubectl kustomize "github.com/kubernetes-sigs/aws-efs-csi-driver/deploy/kubernetes/overlays/stable/?ref=master" > public-ecr-driver.yaml
sudo vi public-ecr-driver.yaml
1 apiVersion: v1 # 삭제
2 kind: ServiceAccount # 삭제
3 metadata: # 삭제
4 labels: # 삭제
5 app.kubernetes.io/name: aws-efs-csi-driver # 삭제
6 name: efs-csi-controller-sa # 삭제, 이전 단계에서 efs-csi-controller-sa를 생성했으므로 불필요
7 namespace: kube-system # 삭제
...
# EFS CSI 드라이버 컨트롤러 배포
kubectl apply -f public-ecr-driver.yaml
kubectl get pod -A | grep csi | grep efs
kubectl get daemonsets efs-csi-node -n kube-system
Windows 기반 컨테이너 이미지와 호환되지 않습니다. 참고 URL : https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/efs-csi.html |
FSx for Lustre CSI 드라이버 컨트롤러
# 작업 폴더 생성
mkdir -p ~/environment/clusterA/controller/fsx-csi-controller
cd ~/environment/clusterA/controller/fsx-csi-controller
# FSx for Lustre CSI 드라이버 컨트롤러용 Service Account (SA, K8S에서 관리하는 사용자 계정) 생성 및 IAM Policy 연결
eksctl create iamserviceaccount --cluster clusterA --namespace kube-system --name fsx-csi-controller-sa --attach-policy-arn arn:aws:iam::aws:policy/AmazonFSxFullAccess --role-name AmazonEKSFSxLustreCSIDriverFullAccess --region ap-northeast-2 --approve
kubectl describe sa fsx-csi-controller-sa -n kube-system
# FSx for Lustre CSI 드라이버 컨트롤러 배포 파일 다운로드(가급적 최신 버전을 받으세요) 및 수정
kubectl kustomize "github.com/kubernetes-sigs/aws-fsx-csi-driver/deploy/kubernetes/overlays/stable/?ref=master" > public-ecr-driver.yaml
sudo vi public-ecr-driver.yaml
1 apiVersion: v1 # 삭제
2 kind: ServiceAccount # 삭제
3 metadata: # 삭제
4 labels: # 삭제
5 app.kubernetes.io/name: aws-fsx-csi-driver # 삭제
6 name: fsx-csi-controller-sa # 삭제, 이전 단계에서 fxs-csi-controller-sa를 생성했으므로 불필요
7 namespace: kube-system # 삭제
...
# FSx for Lustre CSI 드라이버 컨트롤러 배포
kubectl apply -f public-ecr-driver.yaml
kubectl get pod -A | grep csi | grep fsx
kubectl get daemonsets fsx-csi-node -n kube-system
kubectl annotate serviceaccount -n kube-system fsx-csi-controller-sa eks.amazonaws.com/role-arn=arn:aws:iam::111111111111:role/AmazonEKSFSxLustreCSIDriverFullAccess --overwrite=true
Fargate에서는 드라이버가 지원되지 않습니다. 참고 URL : https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/fsx-csi.html |
2단계 : 동적 볼륨 프로비저닝 경우
볼륨 연결 순서는 아래와 같습니다. 1. Storage Class를 배포합니다. 2. PVC를 배포합니다. 3. Pod 배포되면서 PVC 호출합니다. 4. PVC는 Storage Class를 확인하고, PVC와 바인딩된 Storage Class(=PV)를 Pod 볼륨으로 연결됩니다. (즉, PV가 자동으로 생성됨) Storage Class - EBS : Worker Node에 연결된 EBS를 의미하는 것이 아니라, 별도 생성되는 볼륨을 의미하며, AZ 종속적입니다 - EFS는 2개의 서브넷 지정이 가능하나, FSx for Lustre는 1개의 서브넷 지정만 가능합니다. |
샘플 yaml 파일 (storageclass.yaml, pvc.yaml, deployment.yaml)
첨부 파일에서 EFS ID, Subnets, security-groups은 수정해서 사용하시기 바랍니다. |
배포
# 작업 폴더 생성 (첨부 파일의 내용을 여기에 붙여넣기)
mkdir -p ~/environment/clusterA/volume/dynamic_provisioning
cd ~/environment/clusterA/volume/dynamic_provisioning
# 배포 (Storage class > PVC > Pod 순서대로 배포)
kubectl apply -f first-ebs-sc.yaml
kubectl apply -f second-efs-sc.yaml
kubectl apply -f third-fsx-sc.yaml
kubectl apply -f first-ebs-pvc.yaml
kubectl apply -f second-efs-pvc.yaml
kubectl apply -f third-fsx-pvc.yaml
kubectl apply -f first-deployment.yaml
kubectl apply -f second-deployment.yaml
kubectl apply -f third-deployment.yaml
# 배포 결과 확인
kubectl get storageclass
kubectl get pvc
kubectl get pod
# default storageclass 변경
kubectl patch storageclass gp2 -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'
kubectl get storageclass | grep gp3
default storageclass는 1개만 설정 가능하며 기본 제공되는 storage class는 gp2입니다. PVC - Status가 Bound로 변경되기 전에 5~10분 동안 Pending될 수 있으니 Bound 될 때까지 대기하세요. - 배포된 PVC를 삭제하면 영구 볼륨(EBS, EFS, FSx)도 삭제되므로 주의하시기 바랍니다. (Storage Class의 persistentVolumeReclaimPolicy 기본값 : Delete) kubernetes.io/csi: attacher.MountDevice failed to create newCsiDriverClient: driver name efs.csi.aws.com not found in the list of registered CSI driver 에러 발생하면서 마운트 실패 - CSI Driver 설치 시 누락되거나 에러가 발생한 경우로 CSI Driver로 재설치 |
마운트 상태 및 pod간 파일 공유 확인
# pod명 확인 (예시)
kubectl get pod
NAME READY STATUS RESTARTS AGE
pod-001 1/1 Running 0 8m10s
pod-002 1/1 Running 0 8m10s
# 1번 pod에 접근하여 샘플 파일 생성
kubectl exec -it pod-001 /bin/bash
root@pod-001# df -h | grep data
/dev/nvme1n1 9.7G 24K 9.7G 1% /data // EBS 경우
127.0.0.1:/ 8.0E 0 8.0E 0% /data // EFS 경우
10.0.5.10@tcp:/bskz3bmv 1.1T 7.8M 1.1T 1% /data // FSx 경우
root@pod-001# touch /data/sample
# 2번 pod에 접근하여 샘플 파일 확인
kubectl exec -it pod-002 /bin/bash
root@pod-002# ls -l /data/ | grep sample
-rw-r--r-- 1 root root 0 Jun 19 04:45 sample
depolyment.yaml에 의해서 배포된 pods는 동일한 Storage Class를 공유합니다. - EBS : "EC2 > Vloumes"에서 first-depolyment.yaml에 의해서 생성된 EBS 1개 확인됨 - EFS : "EFS > File systems > 선택 > Access points(tab)"에서 second-depolyment.yaml에 의해 생성된 AP 1개 확인됨 - FSx : "FSx > File systems"에서 third-depolyment.yaml에 의해서 생성된 FSx 1개 확인됨 |
2단계 : 정적 볼륨 프로비저닝 경우 (프로젝트 투입으로 지연, 작성 중)
참고 URL
CSI Driver 배포 파일 : EBS, EFS, FSx for Lustre
보안 그룹 : EFS, FSx for Lustre
동적 볼륨 프로비저닝 샘플 : EBS, EFS, FSx for Lustre
정적 볼륨 프로비저닝 샘플 : EBS, EFS, FSx for Lustre
'Storage' 카테고리의 다른 글
[실습] EBS 볼륨(xfs 파일시스템) 연결 및 확장에 대해서 구성하기 (0) | 2023.03.10 |
---|---|
[실습] DataSync 이용한 서로 다른 AWS 계정간 S3 bucket 동기화(sync) 구성하기 (2) | 2023.02.27 |
[실습] EC2에 EFS 볼륨 연결(mount) 구성하기 (0) | 2023.02.27 |
[실습] FSx or PlugIn(goofys, s3fs) 이용하여 EC2에 S3 bucket 연결(mount) 구성하기 (0) | 2023.02.16 |
[실습] AWS CLI 이용한 서로 다른 AWS 계정간 S3 bucket 동기화(sync) 구성하기 (2) | 2023.02.16 |