하위 태스크 1
emptyDir Pod 작성
임시 저장소를 사용하는 Pod YAML 작성
pod-emptydir.yaml:
apiVersion: v1
kind: Pod
metadata:
name: pod-emptydir
labels:
app: nginx
spec:
containers:
- name: web-page
image: nginx
volumeMounts:
- mountPath: /usr/share/nginx/html
name: empty-directory
- name: html-builder
image: alpine
volumeMounts:
- mountPath: /html-dir
name: empty-directory
command: ["/bin/sh", "-c"]
args:
- echo "This page created on $(date +%Y-%m-%d)" > /html-dir/index.html;
sleep infinity;
volumes:
- name: empty-directory
emptyDir: {}하위 태스크 2
컨테이너 간 데이터 공유
emptyDir을 통한 컨테이너 간 파일 공유 테스트
pod-emptydir.yaml을 클러스터에 적용한다.
kubectl apply -f pod-emptydir.yaml결과:
pod/pod-emptydir created
html-builder가 만든 파일이 web-page 컨테이너에서 똑같이 보이는지 확인한다.
html-builder 컨테이너에서,
kubectl exec pod-emptydir -c html-builder -- cat /html-dir/index.html결과:
This page created on 2026-04-02
web-page 컨테이너에서,
kubectl exec pod-emptydir -c web-page -- cat /usr/share/nginx/html/index.html결과:
This page created on 2026-04-02
하위 태스크 3
PV 생성
PersistentVolume 리소스 생성
persistentvolume-nfs.yaml:
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-nfs
spec:
capacity:
storage: 100Mi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
nfs:
server: 192.168.1.10
path: /nfs_shared/pvc-vol100 Mi 용량의 NFS 스토리지를 자원으로 등록한다.
kubectl apply -f persistentvolume-nfs.yaml결과:
persistentvolume/pv-nfs created
하위 태스크 4
PVC 생성
PersistentVolumeClaim 리소스 생성
persistentvolumeclaim-nfs.yaml:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-nfs
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Mi생성된 PV 자원의 사용을 요청하는 PVC를 생성한다.
kubectl apply -f persistentvolumeclaim-nfs.yaml결과:
persistentvolumeclaim/pvc-nfs created
하위 태스크 5
PV/PVC 바인딩 확인
kubectl get pv,pvc로 바인딩 상태 확인
kubectl get pv,pvc결과:
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE
persistentvolume/pv-nfs 100Mi RWX Retain Bound default/pvc-nfs <unset> 6m36s
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE
persistentvolumeclaim/pvc-nfs Bound pv-nfs 100Mi RWX <unset> 68s
두 리소스가 모두 Bound 상태에 있다.
하위 태스크 6
Pod에서 PVC 사용
Pod에서 PVC를 마운트하여 데이터 저장
deploy-pvc.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-pvc
labels:
app: deploy-pvc
spec:
replicas: 3
selector:
matchLabels:
app: deploy-pvc
template:
metadata:
labels:
app: deploy-pvc
spec:
containers:
- name: chk-log
image: sysnet4admin/chk-log
volumeMounts:
- name: pvc-vol
mountPath: /audit
volumes:
- name: pvc-vol
persistentVolumeClaim:
claimName: pvc-nfsDeployment를 생성한다.
kubectl apply -f deploy-pvc.yaml결과:
deployment.apps/deploy-pvc created
하위 태스크 7
데이터 영속성 확인
Pod 삭제 후 재생성하여 데이터 유지 확인
데이터를 저장한다.
kubectl exec -it deploy-pvc-75867cc547-kxnjt -c chk-log -- sh -c "echo 'pvc-persistence-test' > /audit/test.txt"Pod를 삭제한다.
kubectl delete pod deploy-pvc-75867cc547-kxnjt새 Pod가 생성되면 데이터를 확인한다.
kubectl exec -it deploy-pvc-75867cc547-2kxwf -c chk-log -- cat /audit/test.txt결과:
pvc-persistence-test
하위 태스크 8
StorageClass 생성
동적 프로비저닝을 위한 StorageClass 생성
storageclass.yaml:
# Origin Source
# https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: managed-nfs-storage
# or choose another name, must match deployment's env PROVISIONER_NAME'
provisioner: k8s-sigs.io/nfs-subdir-external-provisioner
parameters:
# waits for nfs.io/storage-path annotation, if not specified will accept as empty string.
pathPattern: "${.PVC.namespace}/${.PVC.annotations.nfs.io/storage-path}"
onDelete: deleteStorageClass를 적용한다.
kubectl apply -f storageclass.yaml결과:
storageclass.storage.k8s.io/managed-nfs-storage created
하위 태스크 9
StorageClass를 사용한 PVC 생성
storageClassName을 지정한 PVC 생성
persistentvolumeclaim-dynamic.yaml:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-dynamic
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
storageClassName: managed-nfs-storagePVC를 적용한다.
kubectl apply -f persistentvolumeclaim-dynamic.yaml결과:
persistentvolumeclaim/pvc-dynamic created
하위 태스크 10
자동 PV 생성 확인
PVC 생성 시 자동으로 PV가 생성되는지 확인
kubectl get pvc pvc-dynamic결과:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE
pvc-dynamic Bound pvc-5668a8d6-d9b4-4e05-a070-677a52f97111 10Gi RWX managed-nfs-storage <unset> 12m
하위 태스크 11
StatefulSet에 volumeClaimTemplates 추가
StatefulSet YAML에 volumeClaimTemplates 작성
volumeclaimtemplates.yaml:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: sts
spec:
replicas: 3
serviceName: sts-svc-domain #statefulset need it
selector:
matchLabels:
app: sts
template:
metadata:
labels:
app: sts
spec:
containers:
- name: chk-hn
image: sysnet4admin/chk-hn
volumeMounts:
- name: each-sts-backup
mountPath: /backup_data
volumeClaimTemplates:
- metadata:
name: each-sts-backup
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "managed-nfs-storage"
resources:
requests:
storage: 20Gi각 Pod마다 전용 볼륨을 할당한다.
kubectl apply -f volumeclaimtemplates.yaml결과:
statefulset.apps/sts created
하위 태스크 12
Pod별 독립 PVC 확인
각 Pod마다 독립적인 PVC가 생성되는지 확인
독립적인 PVC가 생서왼 것을 확인한다.
kubectl get pvc결과:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE
each-sts-backup-sts-0 Bound pvc-48badf73-d2db-4124-a0f9-b925faafc96e 20Gi RWO managed-nfs-storage <unset> 27s
each-sts-backup-sts-1 Bound pvc-40f7c725-b745-4cf8-a35e-ae1faabbb273 20Gi RWO managed-nfs-storage <unset> 19s
each-sts-backup-sts-2 Bound pvc-c4406c16-1e97-483b-bf8d-3ca3ff294db3 20Gi RWO managed-nfs-storage <unset> 12s
pvc-dynamic Bound pvc-5668a8d6-d9b4-4e05-a070-677a52f97111 10Gi RWX managed-nfs-storage <unset> 16m
pvc-nfs Bound pv-nfs 100Mi RWX <unset> 35m