반응형
개요
kubernetes에서 EFS 볼륨을 사용하는 이유
POD가 올라가는 WorkerNode의 가용영역이 다르기 때문에 어디에 올라가든 상관없은 EFS 볼륨을 사용한다.
(EBS볼륨은 하나의 가용영역에서만 사용 가능하기 때문에, 다른 가용영역의 WokerNode에 올라가면 EBS볼륨을 불러 올 수 없다.)
[ EFS 연결 방식 ]
- static Provisioning 방식
- 서버관리자가 볼륨(EBS, EFS)를 미리 생생해 놓고, PV(Persistent Volume) 리소스와 수동으로 연결을 한다.
- PVC(persistent Volume Claim)가 POD와 PV를 연결을 해준다.
- dynamic Provisioning 방식 (EFS)
- 서버관리자가 볼륨(EFS)과 미리 생성한다.
- POD에서 사용할 볼륨을 요청하면, PVC(persistent Volume Claim)가 PV를 생성해서 EFS와 연결하고, POD와 PV를 연결을 해준다.
- volumeclaimtemplates 방식
- Statefulset에서 “volumeClaimTemplates” 옵션을 사용해서 PVC, PV를 자동으로 생성해서 POD에 연결해준다.
- volumeclaimtemplates 규칙
- volumeClaimTemplates으로 생성한 PVC 이름 규칙
- “volumeClaimTemplates-name”-”statefulset-name”-”replica-index”
- ex) data-pvc-app-temp-0
- volumeClaimTemplates-name : data-pvc
- statefulset-name : app-temp
- volumeClaimTemplates은 StatefulSet에서만 가능하다.
- volumeClaimTemplates으로 생성한 PVC 이름 규칙
1. static provisioning 방식
1. EFS 볼륨 생성
- EFS 파일 시스템 생성
- EFS 네트워크 설정
- 가용 영역은 WorkerNode ASG(EC2)와 동일하게 셋팅
- Subnet은 WorkerNode가 올라가는 private subnet으로 설정
- 보안그룹은 WorkerNode에서 접근 할 수 있도록 EKS cluster SG 설정

2. PV 생성
- pv, pvc, sotrageclass yaml 양식 다운로드
git clone https://github.com/kubernetes-sigs/aws-efs-csi-driver.git
cd aws-efs-csi-driver/examples/kubernetes/multiple_pods/specs
- PV 생성하기
# EFS ID 수정 (fs-xxx)
# EFS ID 확인 명령어
aws efs describe-file-systems --query "FileSystems[*].FileSystemId" --output text
vi pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: efs-pv
spec:
capacity:
storage: 1Gi
volumeMode: Filesystem
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
storageClassName: efs-sc
csi:
driver: efs.csi.aws.com
volumeHandle: fs-xxx
- PVC 생성하기
vi claim.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: efs-claim
namespace: dw # 배포할 namespace 지정
spec:
accessModes:
- ReadWriteMany
storageClassName: efs-sc
resources:
requests:
storage: 1Gi
- PV, PVC, storageclass 배포하기
kubectl apply -f pv.yaml
kubectl apply -f claim.yaml
kubectl apply -f storageclass.yaml
- PV, PVC 배포 상태 확인
kubectl get pvc
kubectl get pv

3. POD 배포
vi nginx-efs.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-test-efs
namespace: dw
spec:
selector:
matchLabels:
app: nginx-test-efs
replicas: 2
template:
metadata:
labels:
app: nginx-test-efs
spec:
containers:
- name: nginx-test
image: xxx.dkr.ecr.ap-southeast-1.amazonaws.com/nginx-dw:1.0
ports:
- containerPort: 80
volumeMounts:
- name: ebs-volume
mountPath: /data
volumes:
- name: ebs-volume
persistentVolumeClaim:
claimName: efs-claim
nodeSelector:
nodegroup-name: infra-ng
kubectl apply -f pod1.yaml -n dw
kubectl apply -f pod2.yaml -n dw
kubectl apply -f nginx-efs.yaml -n dw
- EFS 볼륨에 데이터가 쌓이는지 확인
# EFS 볼륨 데이터 읽기/쓰기 테스트
kubectl exec pod/app1 -n dw -it -- tail /data/out1.txt -f
# app2 pod에서도 EFS 볼륨 공유이 공유되는지 확인
kubectl exec pod/app2 -n dw -it -- tail /data/out1.txt -f
# pod 삭제시 가용영역과 상관없이 다른 WorkerNode으로 배포되는지 확인
2. dynamic provisioning 방식
1. EFS 볼륨 생성
- Static와 동일한 방법으로 EFS볼륨 생성
2. storageclass 배포
- storageclass yaml 양식 다운로드
curl -o storageclass.yaml https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/examples/kubernetes/dynamic_provisioning/specs/storageclass.yaml
- storageclass yaml 수정 및 배포
# EFS ID 수정 (fs-xxx)
# EFS ID 확인 명령어
aws efs describe-file-systems --query "FileSystems[*].FileSystemId" --output text
# storageclass에서 EFS ID 수정
vi storageclass.yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: efs-sc-dynamic
provisioner: efs.csi.aws.com
parameters:
provisioningMode: efs-ap
fileSystemId: fs-xxx # EFS ID 수정
directoryPerms: "700"
gidRangeStart: "1000" # optional
gidRangeEnd: "2000" # optional
basePath: "/dynamic_provisioning" # optional
# storageclass 배포
kubectl apply -f storageclass.yaml
3. PVC, POD 배포
- PVC, POD yaml 양식 다운로드
curl -o pod.yaml https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/examples/kubernetes/dynamic_provisioning/specs/pod.yaml
- PVC, POD 배포
kubectl apply -f pod.yaml -n dw
- 배포 확인
- PVC가 “pvc-123xxx” 이름으로 PV를 생성해서 EFS와 연결
# pvc-123xxx 이름으로 PV를 생성함
k get pvc -ndw
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
efs-claim-dynamic Bound pvc-123xxx 1Gi RWX efs-sc-dynamic 15s
k get pv/pvc-123xxx -ndw
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-123xxx 1Gi RWX Delete Bound dw/efs-claim-dynamic efs-sc-dynamic 53s
3. volumeClaimTemplates 방식
1. EFS 볼륨 생성
- Static와 동일한 방법으로 EFS볼륨 생성
2. storageclass 배포
- storageclass yaml 양식 다운로드
curl -o storageclass.yaml https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/examples/kubernetes/dynamic_provisioning/specs/storageclass.yaml
- storageclass yaml 수정 및 배포
# EFS ID 수정 (fs-xxx)
# EFS ID 확인 명령어
aws efs describe-file-systems --query "FileSystems[*].FileSystemId" --output text
# storageclass에서 EFS ID 수정
vi storageclass.yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: efs-sc-dynamic
provisioner: efs.csi.aws.com
parameters:
provisioningMode: efs-ap
fileSystemId: fs-xxx
directoryPerms: "700"
gidRangeStart: "1000" # optional
gidRangeEnd: "2000" # optional
basePath: "/dynamic_provisioning" # optional
# storageclass 배포
kubectl apply -f storageclass.yaml
3. PVC, POD 배포
- PVC, POD yaml 양식 다운로드
curl -o pod.yaml https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/examples/kubernetes/dynamic_provisioning/specs/pod.yaml
- Statefulset yaml 생성 및 배포
- volumeClaimTemplates 옵션에서 PVC 생성 정보를 넣는다.
- volumeMounts 옵션에서 volumeClaimTemplates의 name을 지정한다.
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: app-temp
namespace: dw
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: app-temp
serviceName: app-temp
template:
metadata:
labels:
app.kubernetes.io/name: app-temp
name: app-temp
spec:
containers:
- name: app-temp
image: centos
command: ["/bin/sh"]
args: ["-c", "while true; do echo $(date -u) >> /data/out; sleep 5; done"]
volumeMounts:
- name: data-pvc
mountPath: /data
volumeClaimTemplates:
- metadata:
name: data-pvc
spec:
accessModes:
- "ReadWriteOnce"
resources:
requests:
storage: "1Gi"
storageClassName: efs-sc-dynamic
kubectl apply -f statefultset.yaml -n dw
- 배포 확인
- PVC가 “pvc-123xxx” 이름으로 PV를 생성해서 EFS와 연결
k get pvc -ndw
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
data-pvc-app-temp-0 Bound pvc-123xxx 1Gi RWO efs-sc-dynamic 13m
k get pv/pvc-123xxx
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-123xxx 1Gi RWO Delete Bound dw/data-pvc-app-temp-0 efs-sc-dynamic 14m
반응형
'인프라 > 시스템 구축' 카테고리의 다른 글
[ EKS ] taint, toleration 설정 (0) | 2023.04.03 |
---|---|
[ EKS ] EBS -> EFS 볼륨 변경 (0) | 2023.03.31 |
[ EKS ] aws-efs-csi-driver (0) | 2023.03.31 |
[ EKS ] metrics-server (0) | 2023.03.31 |
[ EKS ] External-DNS (0) | 2023.03.31 |