반응형
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 볼륨은 삭제되지 않아도 데이터 복구 가능
- Dynamic에서 PVC를 삭제하면 PVC가 생성한 PV와 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 볼륨 생성
- https://ap-southeast-1.console.aws.amazon.com/ec2/ 접속
- “Elastic Block Store” → “볼륨 생성”
- 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이 자동 생성되어서 연결됨.
- 이름은 난수로 알아서 생성됨.
- 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 |