Kubernetes

영구 볼륨 클레임

jih0ssang 2024. 2. 20. 22:27

컨피그 & 스토리지 API 카테고리

설정/기밀 정보/영구 볼륨 등에 관련된 리소스

- 시크릿

- 컨피그맵

- 영구 볼륨 클레임

 

볼륨, 영구 볼륨, 영구 볼륨 클레임의 차이

볼륨

  • 사용 가능한 볼륨을 매니페스트에 직접 지정하여 사용할 수 있게 하는 것
  • 사용자가 설정된 볼륨을 사용할 수 있지만, 쿠버네티스에서 신규 볼륨을 생성하거나 기존 볼륨을 삭제하는 작업은 할 수 없다.
  • 매니페스트에서 볼륨 리소스 생성 불가능

영구 볼륨

  • 외부 영구 볼륨을 제공하는 시스템과 연계하여 신규 볼륨을 생성하거나 기존 볼륨을 삭제하는 등의 작업이 가능하다.
  • 구체적으로 매니페스트에서 영구 볼륨 리소스를 별도로 생성하는 형태다.
  • 볼륨과 같은 플러그인 제공
    • 예를 들어 GCP, AWS 볼륨 서비스에서는 영구 볼륨 플러그인과 볼륨 플러그인 둘다 제공됨
      • 영구 볼륨 플러그인에서는 볼륨 생성 및 삭제 같은 라이프사이클을 처리할 수 있지만
      • 볼륨 플러그인은 기존에 있는 볼륨만 사용 가능

 

영구 볼륨 클레임

  • 영구 볼륨 리소스를 할당하는 리소스

영구 볼륨은 클러스터에 볼륨을 등록만 하기 때문에 실제 파드에서 사용하려면 영구 볼륨 클레임을 정의하고 사용해야 한다.

 

 

볼륨(Volume)

다음과 같이 볼륨 플러그인이 있다.

  • emptyDir
  • hostPath
  • downwardAPI
  • projected
  • nfs
  • iscsi
  • cephfs

영구 볼륨과 다르게 파드에 정적으로 볼륨을 지정하는 형태

플러그인에 따라서 충돌이 있을 수 있다.

 

 

emptyDir

파드용 임시 디스크 영역으로 사용할 수 있다.

파드가 종료되면 삭제 된다.

호스트의 임의 영역을 마운트할 수 없으며 호스트에 있는 파일을 참조할 수도 없다.

apiVersion: v1
kind: Pod
metadata:
  name: sample-emptydir
spec:
  containers:
  - name: nginx-container
    image: nginx:1.16
    volumeMounts:
    - name: cache-volume
      mountPath: /cache
  volumes:
  - name: cache-volume
    emptyDir: 
      sizeLimit: 128Mi

/cache 영역에 150 MB 용량의 파일을 작성하면 용량 초과로 Evict(축출)된다.

 

 

hostPath

쿠버네티스 노드 상의 영역을 컨테이너에 매핑하는 플러그인이다.

emptyDir와 다르게 특정 영역에 마운트할 수 있으므로, 호스트의 어떤 영역을 사용할지 지정해야 한다.

type은 Directory/DirectoryOrCreate/File/Socket/BlockDevice 등을 선택할 수 있다.

DirectoryOrCreate와 Directory의 차이는 디렉터리가 존재하지 않을 경우 생성하고 기동하는지에 대한 여부에 있다.

보안상 hostPath를 사용할 수 없는 쿠버네티스 환경도 있다.

 

apiVersion: v1
kind: Pod
metadata:
  name: sample-hostpath
spec:
  containers:
  - name: nginx-container
    image: nginx:1.16
    volumeMounts:
    - name: hostpath-sample
      mountPath: /srv
  volumes:
  - name: hostpath-sample
    hostPath:
      path: /etc
      type: DirectoryOrCreate

파드의 /srv와 호스트의 /etc를 마운트하는 것을 의미한다.

그래서 실제로 기동된 파드에서는 쿠버네티스 OS 정보와 컨테이너 OS 정보를 모두 확인할 수 있다.

 

# 호스트 OS 이미지 확인
$ kubectl exec -it sample-hostpath -- cat /src/os-release | grep PRETTY_TIME
PRETTY_NAME="Container-Optimized OS from Google"

# 컨테이너 OS 이미지 확인
PRETTY_NAME="Debian GNU/Linux 10 (buster)"

 

downwardAPI

downwardAPI는 파드 정보 등을 파일로 배치하기 위한 플러그인이다.

apiVersion: v1
kind: Pod
metadata:
  name: downward-api-volume
spec:
  containers:
  - name: nginx-container
    image: nginx:1.16
    volumeMounts:
    - name: downward-api-volume
      mountPath: /srv
  volumes:
  - name: downward-api-volume
    downwardAPI:
      items:
      - path: "podname"
        fieldRef:
          fieldRef:
       - path: "cpu-request"
         resourceFieldRef:
           containerName: nginx-container
           resource: requests.cpu

 

 

projected

시크릿/컨피그맵/downwardAPI/serviceAccountToken의 볼륨 마운트를 하나의 디렉터리에 통합하는 플러그인이다.

시크릿 인증 정보와 컨피그맵 설정 파일을 하나의 디렉터리에 배치하고 싶을 경우 사용할 수 있다.

apiVersion: v1
kind: Pod
metadata:
  name: projected-volume
spec:
  containers:
  - name: nginx-container
    image: nginx:1.16
    volumeMounts:
    - name: projected-volume
      mountPath: /srv
  volumes:
  - name: projected-volume
    projected:
      sources:
      - secret:
          name: sample-db-auth
          items:
          - key: username
            path: secret/username.txt
      - configMap:
          name: sample-configmap
          items:
          - key: nginx.conf
            path: configmap/nginx.conf
      - downwardAPI:
          items:
          - path: "podname"
            fieldRef:
              fieldPath: metadata.name

 

생성 후 파드에는 /src/ 아래 세 가지 종류의 파일이 저장된다.

 

영구 볼륨(PV)

영속성 영역으로 확보된 볼륨이다.

위에 설명한 볼륨은 파드 정의 안에 직접 지정하는 형태로 연결하지만,

영구 볼륨은 개별 리소스로 생성한 수 사용한다.

 

영구 볼륨 종류

네트워크를 통해 디스크를 attach하는 디스크 타입이다.

단일 노드 시 테스트용으로 hostPath가 제공되지만, 영구 볼륨으로는 실용적이지 않다.

다음에도 여러 플러그인이 있다.

  • GCE Persistent Disk
  • AWS Elastic Block Store
  • AZure File
  • nfs
  • iSCSI

Container Storage Interface(CSI)

위의 플러그인 중 특수한 플러그인이며,

컨테이너 오케스트레이션 엔진과 스토리지 시스템을 연결하는 인터페이스다.

 

 

영구 볼륨 생성

영구 볼륨을 생성할 때 다음과 같은 항목을 설정할 수 있다.

  • 레이블
  • 용량
  • 접근모드
  • Reclaim Policy
  • 마운트 옵션
  • 스토리지 클래스
# GCE 영구 디스크용 플러그인
apiVersion: v1
kind: PersistentVolume
metadata:
  name: sample-pv
  labels: 
    type: gce-pv
    envirtonment: stg
spec:
  capacity: # 용량
    storage: 10Gi 
  accessModes: # 접근 모드
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain # Recliam Policy
  storageClassName: manual # StorageClass
  # PersistentVolume 플러그인별 설정
  gcePersistentDisk:
    pdName: sample-gce-pv
    fsType: ext4

위 매니페스트는 미리 GCE에 영구 디스크를 생성한 후에 적용해야 한다.만약 spec.gcePersistentDisk.pdName에 존재하지 않는 영구 디스크를 선택한 경우에는 다음과 같은 에러가 발생하고 영구 볼륨 리소스 생성이 불가능하다.

 

accessModes

  • ReadWriteOnce : 노드 하나에만 볼륨을 읽기/쓰기 하도록 마운트 할 수 있음
  • ReadOnlyMany : 여러 개 노드에서 읽기 전용으로 마운트할 수 있음
  • ReadWriteMany : 여러 개 노드에서 읽기/쓰기 가능하도록 마운트할 수 있음

 

persistentVolumeReclaimPolicy

  • 사용이 끝난 PVC는 삭제되고 PVC를 사용하던 PV를 Reclaim(반환, 초기화)하는 과정을 거친다.
  • 초기화 정책에는 Retain, Delete Recycle이 있다.
    • Retain: PVC 삭제 되어도 내용 보존됨. PV 삭제되더라도 그대로 남아있음
    • Delete: PVC 삭제되면 동시 삭제
    • Recycle: PV의 데이터를 삭제하고 새 PVC에서 PV를 쓸 수 있도록 함. 

 

storageClassName

  • 스토리지 클래스 설정하는 필드
  • 특정 스토리지 클래스가 있는 PV는 해당 스토리지 클래스에 맞는 PVC와 연결하면 됨
  • PV에  .spec.storageClassName 필드 설정이 없으면  .spec.storageClassName 필드 설정이 없는 PVC와만 연결됨

 

영구 볼륨 클레임 생성

영구 볼륨 클레임 생성하면

 

 

'Kubernetes' 카테고리의 다른 글

ConfigMap(컨피그맵)  (0) 2024.02.20
Secret(시크릿)  (1) 2024.02.19
컨피그 & 스토리지 API 카테고리  (0) 2024.02.18
서비스 API 카테고리 정리  (0) 2024.02.18
Ingress(인그레스)  (0) 2024.02.17