ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Kubernetes Ephemeral Volume
    Kubernetes 2023. 8. 9. 07:04
    728x90
    반응형

    소개

    어플리케이션이 다루는 데이터나 파일의 성격에 따라서 저장소의 종류가 두가지로 나뉩니다.

    영구적이어야하는가? 일회성이어도되는가?

    영구적인 저장소를 필요로하는 어플리케이션의 종류는 데이터베이스, 웹 컨텐츠 서버 등이 존재하며,

    그 외의 캐시 서버라든지, 일회성의 Job 이라든지 등의 어플리케이션들은 영구적인 저장소를 필요로하지 않습니다.

     

    Kubernetes 의 Ephemeral Volume 은 일회성의 저장소를 뜻합니다.

    Ephemeral Volume 은 컨테이너와 라이프사이클을 함께하며 컨테이너의 임시적인 데이터의 저장을 돕습니다.

     

    종류

    emptyDir

    Pod 가 특정 Node 에 스케줄링될 때, emptyDir 이 생성되어 컨테이너에 마운트됩니다.

    Pod 내부의 모든 컨테이너들이 해당 Volume 에 접근할 수 있고,

    Pod 가 Node 에서 제거되는 경우에는 emptyDir Volume 은 제거됩니다.

    컨테이너가 종료되어도 Pod 가 해당 Node 존재한다면 emptyDir Volume 은 안전합니다.

     

    CoW(Copy on Write) 방식에 입각하여 컨테이너가 재시작될 때, Writable Layer 에 쓰여진 정보들은 휘발되지만,

    emptyDir 의 데이터들은 Pod 의 Life-Cycle 끝까지 보관됩니다.

     

     


    파드가 가지는 일정부분의 볼륨을 컨테이너들이 공유합니다.
    파드에 마운트되는 볼륨이기 때문에 파드 내의 컨테이너들이 공유하는 자원입니다.
    파드가 종료될 때, emptyDir 로 생성된 볼륨은 지워집니다.
    컨테이너가 비정상 종료되어 파일이 망가지더라도 안전하게 관리됩니다.

     

    볼륨은 파드의 리소스로써 동작합니다.

    파드의 일부분이기 때문에 파드와 동일한 라이프사이클을 가지며,

    파드가 종료될 때, 볼륨 또한 반환됩니다.

     

    볼륨은 파드의 구성요소이기 때문에 파드의 스펙에서 정의됩니다.

    그리고 쿠버네티스의 리소스가 아니기 때문에 별도로 생성, 삭제하는 대상이 아닙니다.

     

     

    2개의 컨테이너를 가지는 Pod 를 생성합니다.

    서로 하나의 Volume 을 공유합니다.

    apiVersion: v1
    kind: Pod
    metadata:
      name: test-pd
    spec:
      containers:
        - image: nginx
          name: test-container
          volumeMounts:
            - name: cache-volume
              mountPath: /usr/share/nginx/html
    
        - image: mysql
          name: test-container-2
          env:
            - name: MYSQL_ROOT_PASSWORD
              value: root
          volumeMounts:
            - name: cache-volume
              mountPath: /tmp
      volumes:
        - name: cache-volume
          emptyDir:
            sizeLimit: 500Mi

     

    container 1 의 volume mount 된 위치에 파일을 생성합니다.

    kubectl exec -it test-pd -c test-container -- /bin/sh -c "touch /usr/share/nginx/html/testfile.txt"

     

    container 2 의 volume mount 된 위치에 해당 파일이 생성되었습니다.

    kubectl exec -it test-pd -c test-container-2 -- /bin/sh -c "ls /tmp"
    
     -> testfile.txt

     

     

    container 1 을 kill 합니다.

    container 1 이 죽어도 volume 에 저장된 파일은 계속 존재합니다.

    kubectl exec -it test-pd -c test-container -- /bin/sh -c "kill 1"
    
    kubectl exec -it test-pd -c test-container-2 -- /bin/sh -c "ls /tmp"
    
     -> testfile.txt

     

     

    hostPath

    hostPath 는 Node 의 특정 Directory 를 컨테이너와 공유합니다.

    emptyDir 이 Pod 의 수명과 함께하기 때문에 Pod 가 제거됨에 따라 emptyDir Volume 또한 제거됩니다.

    하지만 hostPath 는 Pod 가 종료되어도 Node 의 특정 Directory 형태로 남아있게 됩니다.

     

    먼저 kind-worker4 Node 에 /test directory 를 생성합니다.

    그리고 아래 Pod 를 생성합니다.

     

    apiVersion: v1
    kind: Pod
    metadata:
      name: host-path-test
    spec:
      nodeName: kind-worker4
      containers:
        - image: nginx
          name: test-container-1
          volumeMounts:
            - name: cache-volume
              mountPath: /usr/share/nginx/html
    
        - image: ubuntu
          name: test-container-2
          volumeMounts:
            - name: cache-volume
              mountPath: /tmp
          command: [ "/bin/sh" ]
          args: [ "-c", "for run in $(seq 1 100000000000000000000); do echo \"$run\"; done" ]
      volumes:
        - name: cache-volume
          hostPath:
            type: Directory
            path: /test

     

    해당 Pod 는 2개의 컨테이너로 구성되며, 컨테이너와 Node 의 Volume 공유를 확인합니다.

     

    kubectl exec -it host-path-test -c test-container-1 -- /bin/sh -c "touch /usr/share/nginx/html/testfile.txt"
    kubectl exec -it host-path-test -c test-container-2 -- /bin/sh -c "ls /tmp"
    
    -- > testfile.txt

    test-container-1 의 volume mount 된 /usr/share/nginx/html 에 testfile.txt 를 생성합니다.

    그럼 test-container-2 의 volume mount 된 /tmp 디렉토리에서 해당 파일을 확인할 수 있습니다.

     

    그리고 Node 의 Directory 에서도 testfile.txt 파일이 존재합니다.

     

    그리고 해당 Pod 를 종료하더라도 Node 의 mount path 에 해당 디렉토리와 파일은 여전히 존재하게 됩니다.

    반응형

    'Kubernetes' 카테고리의 다른 글

    Kubernetes ReplicaSet 알아보기  (2) 2023.11.28
    KinD 알아보기.  (0) 2023.11.27
    [Kubernetes] Service 이해하기  (0) 2023.08.01
    Kubernetes Pod 이해하기  (0) 2023.07.26
    [Kubernetes] ReadinessProbe 알아보기  (0) 2023.06.16
Designed by Tistory.