인프라/시스템 구축

[ EBS ] PV, PVC, POD 배포

김붕어87 2023. 6. 29. 16:53
반응형
keycloak, dafaflow, airflow, cypress 등 pod의 데이터를 PV(EBS) 볼륨에 저장합니다.
cypress pod가 죽었다가 다시 올라오면 기존 PV(EBS)에 연결되어서 기존 데이터를 유지할 수 있습니다.
PV가 삭제되면 PV와 연결된 EBS도 같이 삭제되면서 데이터 유실이 발생합니다.
PV가 삭제되어도 EBS가 삭제되지 않고, PV를 재배포 해도 기존 EBS에 연결되어서 데이터 연속성 방법 기능 테스트하려고합니다.

 

 

EBS Provisioning 방법

3가지 방식이 있습니다.

 

  • Static Provisioning
    • 사용자가 AWS EBS 볼륨, PV, PVC 3개 모두 수동으로 생성해서 관리하는 방식이다.
    • 작동 방법
      • EBS 볼륨을 생성해서 PV(PersistentVolume)과 연결한다.
      • PVC(PersistentVolumeClaim)를 생성한다.
      • POD에서 사용할 PVC를 지정하면, PVC가 POD와 PV를 연결해준다.
  • Dynamic Provisioning
    • 사용자가 PVC만 생성하고 PVC가 EBS볼륨과 PV를 자동으로 생성해서 POD에 연결해준다.
    • 작동 방법
      • PVC(PersistentVolumeClaim)를 생성한다.
      • POD에서 사용할 PVC를 지정한다.
      • PVC는 EBS 볼륨과 PV를 자동 생성해서 POD에 연결해준다.
  • Static, Dynamic 차이점
    • Dynamic에서 PVC를 삭제하면 PVC가 생성한 PV와 EBS도 자동으로 삭제된다.
      • PVC가 삭제되면 데이터 복구 불가능.
    • Static에서는 PV,PVC가 삭제되어도 EBS볼륨은 수동으로 삭제해줘야한다.
      • PV,PVC 삭제되어도 EBS 볼륨은 삭제되지 않아도 데이터 복구 가능
  • volumeclaimtemplates 방식
    • Statefulset에서 “volumeClaimTemplates” 옵션을 사용해서 PVC, PV, EBS볼륨을 자동으로 생성해서 POD에 연결해준다.
    • 작동 방법
      • POD에서 “volumeClaimTemplates” 옵션으로 PVC 이름 설정
      • POD가 배포되면서 PVC 자동 생성한다.
      • PVC은 PV와 EBS 볼륨을 자동 생성한다.
      • POD은 PVC가 생성한 PV 볼륨을 연결한다.
    • 특이사항
      • Dynamic Provisioning과 동일하게 PVC가 삭제되면 데이터 복구 불가능하다.
      • 단, Statefulset이 삭제되어도 PVC은 자동으로 삭제되지 않는다.
      • PVC을 수동으로 삭제해야한다.
volumeClaimTemplates으로 생성한 PVC 이름 규칙
- “volumeClaimTemplates-name”-”statefulset-name”-”replica-index”

ex) PVC : data-pvc-app-temp-0
       - volumeClaimTemplates-name : data-pvc
       - statefulset-name : app-temp

특이사항 : volumeClaimTemplates은 StatefulSet에서만 가능하다

 


[ Static Provisioning ]

 

1. EBS 볼륨 생성

  • AWS Console에서 EBS 볼륨 생성
  • AWS CLI 명령어로 EBS 볼륨 생성
    • ap-southeast-1a 가용 영역에 EBS볼륨 생성
    • ap-southeast-1a 가용 영역의 WorkerNode에만 EBS 볼륨을 연결 할 수 있음
aws ec2 create-volume --region ap-southeast-1 --availability-zone ap-southeast-1a --size 1 --volume-type gp2

 

2. PV(PersistentVolume) 생성

  • PV.yaml 생성
# volumeID:는 방금 생성한 EBS ID 입력

vi pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
 name: nginx-pv
spec:
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: 1Gi
  persistentVolumeReclaimPolicy: Retain
  volumeMode: Filesystem
  storageClassName: ebs-sc
  awsElasticBlockStore:
    fsType: ext4
    volumeID: vol-07xxxxxxxxx

 

 

  • PV 배포
    • PVC가 배포되고 연결되면 CLAIM 상태에 PVC 정보가 나타난다.
kubectl apply -f pv.yaml

kubectl get pv nginx-pv
NAME       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
nginx-pv   1Gi        RWO            Retain           Available           ebs-sc                  2s

 

3. PVC(PersistentVolumeClaim) 생성

  • PVC.yaml 생성
vi pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nginx-pvc
  namespace: dw              # namespace 지정
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
     storage: 1Gi
  storageClassName: ebs-sc
  volumeMode: Filesystem
  volumeName: nginx-pv      # PV volumeName 지정, PV를 지정하지 않으면 Dynamic provisioning으로 된다.

 

  • PVC 배포
    • PVC의 VOLUME 정보에는 연결된 PV 이름이 나타난다.
    • PV의 CLAIM 정보에는 연결된 PVC 이름이 나타난다.
kubectl apply -f pvc.yaml -n dw

kubectl get pvc -n dw
NAME        STATUS   VOLUME     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
nginx-pvc   Bound    nginx-pv   1Gi        RWO            ebs-sc         22s


kubectl get pv nginx-pv
NAME       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM          STORAGECLASS   REASON   AGE
nginx-pv   1Gi        RWO            Retain           Bound    dw/nginx-pvc   ebs-sc                  4m10s

 

 

 

4. PVC 연결할 POD배포

  • POD 배포
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-test
  namespace: dw
spec:
  selector:
    matchLabels:
      app: nginx-test
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx-test
    spec:
      containers:
      - name: nginx-test
        image: nginx
        ports:
        - containerPort: 80
        volumeMounts:
        - name: ebs-volume
          mountPath: /data
      volumes:
      - name: ebs-volume
        persistentVolumeClaim:
          claimName: nginx-pvc

 

 

 

 

 


[ Dynamic Provisioning ]

  • PVC만 배포하면 PVC가 PV와 EBS볼륨을 자동으로 생성한다.

 

1. PVC(PersistentVolumeClaim) 생성

  • PVC.yaml 생성
vi pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nginx-pvc
  namespace: dw              # namespace 지정
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
     storage: 1Gi
  storageClassName: ebs-sc
  volumeMode: Filesystem
  #volumeName:  # PV를 지정하지 않는다.

 

 

  • PVC 배포
    • PVC의 VOLUME 정보에는 연결된 PV가 없다.
kubectl apply -f pvc.yaml -n dw

kubectl get pvc -n dw
NAME        STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
nginx-pvc   Pending                                      ebs-sc         5s

 

 

 

2. PVC 연결할 POD배포

  • POD yaml 생성 및 배포
    • nginx.yaml 생성
vi nginx.yaml 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-test
  namespace: dw
spec:
  selector:
    matchLabels:
      app: nginx-test
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx-test
    spec:
      containers:
      - name: nginx-test
        image: nginx
        ports:
        - containerPort: 80
        volumeMounts:
        - name: ebs-volume
          mountPath: /data
      volumes:
      - name: ebs-volume
        persistentVolumeClaim:
          claimName: nginx-pvc

 

 

 

  • POD 배포
kubectl apply -f nginx.yaml -n dw

 

 

 

  • PVC, PV 상태 확인
    • PV VOLUME이 자동 생성되어서 연결됨.
      • 이름은 난수로 알아서 생성됨.
kubectl get pvc -n dw
NAME        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
nginx-pvc   Bound    pvc-32e00c34-e866-4401-b059-cb12905436d6   1Gi        RWO            ebs-sc         18m

kubectl get pv pvc-32e00c34-e866-4401-b059-cb12905436d6
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM          STORAGECLASS   REASON   AGE
pvc-32e00c34-e866-4401-b059-cb12905436d6   1Gi        RWO            Delete           Bound    dw/nginx-pvc   ebs-sc                  16m

 

 

 


[ volumeclaimtemplates Provisioning ]

  • POD만 배포하면 PVC, PV, EBS 볼륨을 자동으로 생성해서 POD에 연결해준다.

1. POD 생성

  • POD.yaml 생성
    • volumeclaimtemplates 옵션은 StatefulSet에서만 가능하다.
vi pod.yaml

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              # volumeClaimTemplates 이름 지정
          mountPath: /data
  volumeClaimTemplates:
    - metadata:
        name: data-pvc                # 생성할 PVC 이름 지정
      spec:
        accessModes:
          - "ReadWriteOnce"
        resources:
          requests:
            storage: "1Gi"
        storageClassName: ebs-sc       # EBS storageClassName 이름 지정

 

 

  • POD 배포
    • POD를 배포하면 PVC, PV, EBS가 자동 생성된다.
kubectl apply -f pod.yaml -n dw 

kubectl get pvc -n dw
NAME                  STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
data-pvc-app-temp-0   Bound    pvc-34cb2ce5-179b-4c73-879e-b395752ee3d9   1Gi        RWO            ebs-sc         26s

kubectl get pv pvc-34cb2ce5-179b-4c73-879e-b395752ee3d9

 

 

 

  • POD 삭제
    • POD를 삭제해도 PVC은 자동 삭제가 되지 않는다. (수동 삭제 필요)
    • 수동으로 PVC가 삭제되면 Dynamic Provisioning가 동일하게 EBS 볼륨 삭제되어서 데이터 복구 불가
kubectl delete statefulset.apps/app-temp -n dw

kubectl get all -n dw 
"" 아무것도 없음.

kubectl get pvc -n dw
NAME                  STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
data-pvc-app-temp-0   Bound    pvc-34cb2ce5-179b-4c73-879e-b395752ee3d9   1Gi        RWO            ebs-sc         4m24s

kubectl get pv pvc-34cb2ce5-179b-4c73-879e-b395752ee3d9
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                    STORAGECLASS   REASON   AGE
pvc-34cb2ce5-179b-4c73-879e-b395752ee3d9   1Gi        RWO            Delete           Bound    dw/data-pvc-app-temp-0   ebs-sc                  4m58s
반응형

'인프라 > 시스템 구축' 카테고리의 다른 글

[ time ] UTC, KST 변경  (0) 2025.04.30
[ service ] Type ExternalName  (0) 2023.06.29
[ istio ] ALB 설정 (Internal,Internet-facing)  (0) 2023.06.29
[ istio ] Domain Redirect 설정  (0) 2023.06.29
[ EKS ] Configmap - 2  (0) 2023.04.19