본문 바로가기

Storage

[실습] EKS - Persistent Volume을 pod에 연결하기 (EBS, EFS, FSX for Lustre)

반응형

안녕하세요 서후아빠입니다. ^_^

이번 세션은 미리 구성된 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

 

[실습] EKS - Cluster (eksctl, AWS 콘솔), Ingress Controller, Image

안녕하세요 서후아빠입니다. ^_^ 이번 세션은 미리 구성된 VPC에 eksctl과 AWS 콘솔을 각각 이용하여 EKS 클러스터를 배포하는 실습을 해보겠습니다. EKS 클러스터 배포는 AWS 콘솔, eksctl, CloudFormation, CD

sh-t.tistory.com

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)

dynamic_provisioning.txt
0.01MB

첨부 파일에서 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   

API 설명 : PV, PVC

동적 볼륨 프로비저닝 샘플 : EBS, EFS, FSx for Lustre
정적 볼륨 프로비저닝 샘플 : EBSEFSFSx for Lustre

반응형