하위 태스크 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-vol

100 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-nfs

Deployment를 생성한다.

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: delete

StorageClass를 적용한다.

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-storage

PVC를 적용한다.

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