K8s Volume, PV, PVC

vernolog·2024년 7월 7일

K8s

목록 보기
2/2

Volum

K8s는 다양한 유형의 볼륨을 지원하며, 볼륨 유형과 상관없이 파드내의 컨테이너가 재시작되어도 데이터는 보존된다.
임시(ephemeral) 볼륨 유형은 파드가 삭제되면 함께 삭제되지만, 퍼시스턴스(persistent) 볼륨은 삭제되지 않는다.

사용방법

  1. K8s Volume으로 사용할 스토리지 정의 → volumes 정의

    	volumes:
    	- name: test-volume
    		hostPath:
    			path: /data
  2. 컨테이너 별로 해당 volume 마운트 → volumeMounts 정의

    	 volumeMounts:
    	 - mountPath: /test-pd
    	    name: test-volume
  • 전체코드
    apiVersion: v1
    kind: Pod
    metadata:
      name: test-pd
    spec:
      containers:
      - image: registry.k8s.io/test-webserver
        name: test-container
        volumeMounts:
        - mountPath: /test-pd
          name: test-volume
      volumes:
      - name: test-volume
        hostPath:
          # 호스트의 디렉터리 위치
          path: /data
          # 이 필드는 선택 사항이다
          type: Directory

종류

hostPath

  • 호스트 노드의 파일시스템에 있는 파일이나 디렉터리를 파드에 마운트
  • hostPath를 사용하는 것은 권장되지 않으며, 만약 사용된다면 필요한 파일 또는 디렉터리로만 범위를 지정하고 ReadOnly로 마운트 하길 권장함
  • 아래는 권장하지 않는 이유에 대한 설명
    • 권한을 가진 시스템 자격 증명 (예: kubelet 용) 또는 권한있는 API(예: 컨테이너 런타임 소켓)을 노출할 수 있으며, 이는 컨테이너 이스케이프 또는 클러스터의 다른 부분을 공격하는데 사용될 수 있음
    • 노드에 있는 파일이 서로 다르기에, 파드가 재시작하여 다른 노드에 할당되는 경우 다르게 동작될 수 있음
    • 기본 호스트에 생성된 파일 또는 디렉터리는 root만 쓸 수 있으므로, 프로세스를 privileged container에서 루트로 실행하거나 hostPath 볼륨을 쓸 수 있도록 호스트의 파일 권한을 수정해야함.
  • path : 볼륨 디렉터리 또는 파일 위치
  • type : volume 타입을 정확히 명시
    행동
    빈 문자열 (기본값)은 이전 버전과의 호환성을 위한 것으로, hostPath 볼륨은 마운트 하기 전에 아무런 검사도 수행되지 않는다.
    DirectoryOrCreate만약 주어진 경로에 아무것도 없다면, 필요에 따라 Kubelet이 가지고 있는 동일한 그룹과 소유권, 권한을 0755로 설정한 빈 디렉터리를 생성한다.
    Directory주어진 경로에 디렉터리가 있어야 함
    FileOrCreate만약 주어진 경로에 아무것도 없다면, 필요에 따라 Kubelet이 가지고 있는 동일한 그룹과 소유권, 권한을 0644로 설정한 빈 파일을 생성한다.
    File주어진 경로에 파일이 있어야 함
    Socket주어진 경로에 UNIX 소캣이 있어야 함
    CharDevice주어진 경로에 문자 디바이스가 있어야 함
    BlockDevice주어진 경로에 블록 디바이스가 있어야 함

local

  • 디스크, 파티션 또는 디렉터리 같은 마운트된 로컬 스토리지 장치를 나타냄
  • hostPath와 유사하나, 특정 노드에 할당될 수 있도록 nodeAffinity 를 사용하는 것이 다른 특징
  • 또한 hostPath와 달리 동적 프로비저닝이 지원되지 않는다. 즉, 정적 프로비저닝만 가능
  • hostPath와 마찬가지로 해당 노드가 비정상이 되면, 백업이 되지 않는 이상 이전 데이터를 복구할 수가 없음. 즉 nfs 등의 볼륨에 비해 노드에 대한 의존성이 크다.
  • PV로 local 볼륨을 사용할때 StorageClass를 만들어서 volumeBindingModeWaitForFirstConsumer 으로 설정하여 사용하는 것을 권장한다. WaitForFirstConsumer 으로 설정하면 볼륨바인딩이 해당 volume을 사용한 파드가 생성된 후 실행되도록 연기되는데, 이를 통해 파드에 대한 constraints (such as node resource requirements, node selectors, Pod affinity, and Pod anti-affinity… )가 고려된 후 PVC 바인딩이 실행된다.

hostPath vs local

  • hostPath : 호스트 노드의 파일 시스템이 있는 파일이나 디렉토리를 pod에 마운트. 따라서 멀티 노드 클러스터에서 파드가 재시작하여 다른 노드에 할당되면, 새로 할당된 노드에는 이전데이터가 없게됨. 이러한 이유로 hostPath 볼륨은 단일 노드 클러스터에서만 잘 작동됨. 단일 노드 클러스터에서 사용하는 용도.
  • local : 위 hostPath의 문제점을 해결하여, 멀티 노드 환경에서 위 문제가 일어나지 않게 작동 가능. volume이 만들어질 노드를 정의하여, 재시작되는 pod가 재부팅 전 상태 그래도 데이터를 찾울 수 있도록 함. 다중 노드 클러스터에서 사용하는 용도
  • 두 방식 모두 노드 스토리지가 완전히 손상되어 복구할 수 없는 경우, 이전 상태의 데이터를 찾을 수 없음.

emptyDir

  • 비어있는 볼륨을 의미하며, 임시 저장소로 사용된다.
  • 파드가 노드에 할당될 때 생성되며, 해당 노드에서 파드가 실행되는 동안에만 존재. 어떤 이유로든 노드에서 파드가 제거되면  emptyDir 의 데이터가 영구적으로 삭제되는 반면, 컨테이너가 크래시되는 경우는 노드에서 파드를 제거하지 않는 이상 제거되지 않는다.
  • 파드 내 컨테이너들은 해당 볼륨을 공유할 수 있음

nfs

  • 기존 NFS(Network File System) 볼륨을 파드에 마운트 할 수 있음
  • 파드를 제거할때 지워지는 emptyDir 와는 다르게, nfs 볼륨의 내용은 유지되고 볼륨은 그저 마운트 해제만 됨.
  • 또한 NFS 볼륨에 데이터를 미리 채울 수 있고, 파드간에 데이터를 공유할 수도 있다.

PV

  • K8s 클러스터의 스토리지
  • 한 노드가 클러스터의 리소스인 것처럼 PV 또한 클러스터의 리소스
  • Volume와 같은 볼륨 플러그인이지만, PV를 사용하는 각 pod에 독립적인 lifecycle을 가진다. 따라서 해당 pod가 제거되더라도, pv는 제거되지 않을 수 있다.

PVC

  • 사용자의 스토리지 요구사항
  • pod는 node 리소스를 이용하고 pvc는 pv 리소스를 사용한다는 관점에서, pvc는 pod와 비슷하고 pv는 node와 비슷하다고 할 수 있겠다.

스토리지 클래스

  • 동적 프로비저닝을 위해 사용할 스토리지를 정의하고 이를 사용하기 위함
  • 설정
    • volumeBindingMode : 볼륨이 언제 바운딩 될지 시기를 설정하는 옵션.
      • Immediate : 디폴트 값으로, PVC가 생성되는 즉시 바인딩. PV가 바인딩 된 후 해당 노드에서 pod를 스케줄링 할 수 없다면, pod가 스케줄링되지 못함. 즉 unschedulable Pod를 만든다. 예를 들어 node A의 local 디스크를 사용하는 volume이 미리 바인딩되어있는데, 알고보니 해당 pod는 node B에 무조건 할당되어야하는 파드여서 파드가 생성되지 못하는 상황이 발생
      • WaitForFirstConsumer : PVC를 사용할 파드가 생성될때까지 바인딩을 지연. 이를 통해 unschedulable Pod만들어지는 것을 막을 수 있으며, WaitForFirstConsumer를 사용하는 것이 권장됨
    • provisioner : PV(볼륨)를 생성할 스토리지 종류. AWSElasticBlockStore, AzureFile 등 다양한 프로비저너가 존재
    • parameters : provisioner가 동적으로 볼륨을 생성할 때 필요한 옵션

프로비저닝

정적 프로비저닝

  • K8s 클러스터 관리자 및 스토리지 공급자가 새 스토리지 볼륨을 생성한 다음, K8s에 이를 표시하기 위해  PersistentVolume 오브젝트를 생성하는 것. → 즉 관리자가 직접 프로비저닝.

동적 프로비저닝

  • K8s 클러스터 관리자가 PV를 미리 만들어 둘 필요없이, 사용자가 스토리지를 요청하면 자동으로 프로비저닝하는 것을 의미한다. 이때 storageClass에 정의된 설정에 따라 자동으로 PV를 생성. → 즉 스토리지 클래스를 사용하여 동적으로 프로비저닝

참고자료

0개의 댓글