인프라/시스템 구축

[ EKS ] EFS - (PV,PVC,POD) 설치

김붕어87 2023. 3. 31. 17:12
반응형
개요
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에서만 가능하다.

 

 

 


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