본문 바로가기
BackEnd

도커와 쿠버네티스 -K8S(스토리지 볼륨)

by mizuiro 2024. 11. 20.

1. 스토리지 볼륨

K8S에서 컨테이너 파일을 보존하기 위해 사용되는 객체

  • 노드 내부의 일부 디스크 공간을 pod와 공유하는 방식으로 제공
  • 노드 외부의 스토리지 시스템과 연결하는 방식

1-1. K8S 스토리지 볼륨 종류

  • emptyDir :

    pod 내부에서 임시적으로 사용하는 볼륨(저장소)

  • hostPath:

    노드 내에 데이터를 저장할 수 있는 볼륨(저장소)

  • PersistentVolume:

    외부 서버(노드 외부)에 데이터를 저장하는 볼륨(저장소)

1-2. emptyDir

pod 내부에서 임시적으로 사용하는 볼륨(저장소)

  • pod가 노드에 할당될 때 처음 생성
  • pod가 노드에서 실행하는 동안만 존재(pod가 삭제되면 볼륨도 삭제됨)
apiVersion: v1
kind: Pod
metadata:
  name: my-ev-pod
spec:
  volumes:
    - name: upload-volume
      emptyDir: {}
  containers:
    - name: nginx
      image: nginx
      volumeMounts: 
        - name: upload-volume
          mountPath: /tmp/uploads
  • spec.volumes : pod 내부에 생성할 볼륨

    • emptyDir{} : emptyDir 은 볼륨타입 설정, {} 는 추가 옵션을 사용하지 않는다는 의미
  • spec.containers.volumeMount.name : 컨테이너가 사용하게 될 볼륨명

    • 단, volumes와 name은 동일해야 한다
  • spec.contaienrs.volumeMount.mountPath : 볼륨이 마운트할 경로

  • 실행

kubectl apply -f .\ex9_my_ev_prod.yaml  
kubectl get pod
kubectl describe pod my-ev-pod 

⇒ 컨테이너 설정에서 Mounts가 된 것을 찾을 수 있다

  • 사용
# volume에 데이터 저장
kubectl exec my-ev-pod -- bash -c "echo hello>/tmp/uploads/hello.txt"
# volume에 저장한 데이터 조회(hello 출력)
kubectl exec my-ev-pod -- cat /tmp/uploads/hello.txt
  • 임시 저장소 확인
kubectl delete pod my-ev-pod.yaml
kubectl apply -f .\ex9_my_ev_prod.yaml
kubectl exec my-ev-pod -- ls /tmp/uploads

⇒ 생성한 저장소를 삭제 후 다시 재 생성을 하면 이전에 생성한 데이터가 존재하는지 확인하는 작업

⇒ pod 삭제 후 재 생성 하고 저장소를 확인하니 아무런 데이터가 존재하지 않았다

⇒ 즉, 임시 저장소라는 것을 확실히 확인 할 수 있다

1-3. PersistentVolume

종류

PV(Persistence Volume) : 저장소 생성

PVC( PersistenceVolume Claim) :

저장된 저장소 사용을 요청

스토리지를 동적으로 바인딩하기 위한 요청 객체

⇒ K8S 클러스터 관리자가 PV 를 생성 및 관리하고, 사용자(개발자) PVC를 통해서 PV 를 요청

PV

apiVersion: v1
kind: PersistentVolume
metadata:
    name: my-pv-100
spec:
    storageClassName: host-pv
    persistentVolumeReclaimPolicy: Delete
    capacity:
        storage: 100Mi
    accessModes:
        - ReadWriteMany
    hostPath:
        path: "/my-pv/data/v1"
  • spec.storageClassName : pvc에서 스토리지 사용 요청 시 사용하는 정보

  • spec.persistentVolumeReclaimPolicy : PVC 삭제 -> PV 데이터도 삭제

  • spec.accessModes : multi PV가 접속해서 사용

  • 실행

kubectl get pv

⇒ 생성된 것을 확인할 수 있다

⇒ 용량을 150으로 설정한 pv를 하나 더 생성한다

PVC

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
    name: my-pvc
spec:
    accessModes:
        - ReadWriteMany
    storageClassName: host-pv
    resources:
        requests:
            storage: 10Mi
  • 실행
kubectl apply -f .\ex11_my_pvc.yaml 
kubectl get pvc

⇒ pvc가 pv2개중 하나를 bound한 것을 알 수 있다

⇒ pv를 확인해 보면 status가 변한 것을 확인 할 수 있다

PVC pod

PVC는 PV 사용을 정의해 놓은 명세서 같은 것이므로 이 PVC를 사용해서 pv를 사용할 수 있도록 해야 한다

→ 앞에서 생성한 pvc를 사용하여 데이터를 저장하고, pvc 삭제 시 저장한 데이터가 남아 있는지 확인해 본다

apiVersion: v1
kind: Pod
metadata:
  name: my-pv-pod
spec:
  volumes:
    - name: my-pvc
    persistentVolumeClaim:
      claimName: my-pvc
  containers:
    - name: nginx
      image: nginx
      volumeMounts:
        - name: my-pvc
          mountPath: "/data/pv"
  • spec.volumes.name : pvc를 volume 으로 사용하겠다는 의미

  • spec.vloumes.claimName: bounding 상태인 pvc를 지정 (ex11 에 지정한 pvc 사용)

  • spec.containers: my-pvc 이름의 vloume 을 사용할 container 정의

    • volumeMounts: container 에서 mount 해서 사용할 volume 지정
    • mountPath: container에서 사용할 working directory 경로 지정
  • 실행

  1. 쿠버네티스에 pvc 컨테이너와 마운트 후 데이터 저장
kubectl apply -f ex12_my_pv_pod.yaml
kubectl exec my-pv-pod -- bash -c "echo hello! > /data/pv/hello.txt"
kubectl exec my-pv-pod --cat /data/pv/hello.txt
  • 파드 생성
  • nginx container를 통해 working directory 에서 linux shell로 파일 생성
  • pv에 생성된 파일 확인

⇒ my-pv-pod 가 생성

⇒ my-pv-pod 안에 파일 생성

kubectl delete pod my-pv-pod
kubectl exec my-pv-pod -- cat /data/pv/hello.txt
  • pvc에서 사용하던 파드를 삭제
  • pod가 삭제 된 후 생성했던 파일을 확인 ⇒ pod가 삭제 되어 확인 불가
kubectl apply -f ex12_my_pv_pod.yaml  
kubectl exec my-pv-pod -- cat /data/pv/hello.txt
  • 삭제한 pvc pod 재 생성
  • 생성한 파드에 데이터가 존재하는지 확인

⇒ 파드 생성

⇒ 파일 재조회 시 계속 존재하고 있음

2. Chapter1 정리

  1. yaml에 정의된 pod spec으로 k8s 적용 (선언형, apply)
  2. pod에 restartpolicy 정의
    1. 재시작에 대한 정상, 비정상 테스트
    2. pod의 상태 확인
    3. container의 상태 확인
  3. 하나의 pod 에 multi container spec 을 정의
  4. ReplicaSet spec 정의
    1. 지정된 pod 수를 계속 유지
    2. 각 pod의 container의 이미지 버전 업데이트
    3. 업데이트 전략 : Recreate, RollingUpdate
  5. container 환경 변수
    1. 컨테이너 내부에 직접 설정 (configMap, secret (명령형, 선언형))
  6. 스토리지 볼륨
    1. emptyDir
    2. hostPath(권장 하지 않음)
    3. PersistentVolume
  7. PersistentVolume
    1. PV(Persistent Volume) : 저장소 생성
    2. PVC(Persistent Volume Claim) : 생성된 저장소 사용을 요청, 스토리지 동적 바인딩 객체