본문 바로가기
CICD

[Kubernetes] Volume(기본 오브젝트)

by 장중앙 2022. 1. 4.

Volume이란

독립적인 쿠버네티스 리소스가 아니므로 자체적으로 생성, 삭제될 수 없음. 볼륨은 파드의 모든 컨테이너에서 사용 가능하며 이 경우 접근하려는 각 컨테이너에서 마운트해야 함. 각 컨테이너 파일 시스템의 어느 경로에나 볼륨을 마운트 가능.

 

 

Volume의 종류

1. emptyDir

  • 최초 생성될 때 볼륨 내용이 비어있기 때문에 emptyDir로 명칭
  • 파드 단위로 마운트되는 볼륨
  • 같은 Pod내의 컨테이너들끼리 데이터를 공유가능
  • Pod내의 마운트된 볼륨을 통해 자신의 로컬처럼 데이터를 공유가능
  • 파드 생성시 만들어지고 삭제시 없어지므로 일시적인 데이터 보관

emptyDir yaml 작성 예시

 

2. hostPath

  • Pod가 올라가 있는 Node를 Path로 사용하기 때문에 명칭 - 노드 단위로 마운트되는 볼륨
    • Pod 생성전에 만들지 않으면 해당 볼륨과 연결하는 Pod 생성시 에러 발생
  • emptyDir과 다르게 Pod가 죽어도 볼륨의 데이터는 사라지지 않음
  • 노드 자신을 위해 사용하는 파일을 위해 사용(Pod의 데이터를 위해 존재 X)
  • 노드 단위 마운트의 문제점 
    • 파드가 재생성 될때 같은 노드에 생성된다는 보장이 없음 - 노드 추가시 운영자가 직접 마운트를 해줘야함(자동화 X)

hostPath yaml 작성 예시


 

3. PVC(PersistentVolumeClaim)/PV(PersistentVolume)

  • Pod 영속성이 있는 볼륨
  • PV는 로컬 및 외부 원격 볼륨 등 다양하게 존재 ex) NFS, AWS, git
  • Pod는 PV와 직접 연결 X -> PVC를 통해 PV를 연결
    • PV 생성 -> PVC 생성 -> 연결 -> Pod생성 및 마운팅 의 순으로 진행 
    • Kubernetes는 볼륨 사용에 있어 유저 영역과 관리자 영역을 나눔


PV yaml 작성 예시

PVC yaml 작성 예시

PVC연결 Pod yaml 작성 예시

 


 


Volume실습

emptyDir 볼륨

 

yaml 파일 작성 및 Volume, Pod 생성

apiVersion: v1
kind: Pod
metadata:
  name: pod-volume-1
spec:
  containers:
  - name: container1
    image: kubetm/init
    volumeMounts:
    - name: empty-dir
      mountPath: /mount1
  - name: container2
    image: kubetm/init
    volumeMounts:
    - name: empty-dir
      mountPath: /mount2
  volumes:
  - name : empty-dir
    emptyDir: {}

생성된 Pod 및 Container에 마운트된 볼륨 확인

 

 


hostPath 볼륨

yaml 파일 작성 및 Pod 생성

해당 Pod는 이름을 바꿔 node-v 볼륨을 공유하는 3개를 생성 -> pod-volume-1, pod-volume-2, pod-volume-3

apiVersion: v1
kind: Pod
metadata:
  name: pod-volume-1
spec:
  nodeSelector:
    kubernetes.io/hostname: k8s-node1
  containers:
  - name: container
    image: kubetm/init
    volumeMounts:
    - name: host-path
      mountPath: /mount1
  volumes:
  - name : host-path
    hostPath:
      path: /node-v
      type: DirectoryOrCreate

생성된 Pod 확인

 

hostPath 공유여부 확인

pod ~ 1에서 마운트 디렉토리에 파일 추가

pod ~ 2의 마운트 디렉토리에 동일한 파일이 존재

Pod가 생성된 node1서버에서 node-v 디렉토리 및 마운트 볼륨에 생성된 파일 확인

  -> Pod 재생성에도 데이터가 유지됨

 


PV/PVC 볼륨

 

yaml파일 작성, 3개의 PV 생성

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-01
spec:
  capacity:
    storage: 1G
  accessModes:
  - ReadWriteOnce
  local:
    path: /node-v
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - {key: kubernetes.io/hostname, operator: In, values: [k8s-node1]}
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-02
spec:
  capacity:
    storage: 1G
  accessModes:
  - ReadWriteMany
  local:
    path: /node-v
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - {key: kubernetes.io/hostname, operator: In, values: [k8s-node1]}
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-03
spec:
  capacity:
    storage: 2G
  accessModes:
  - ReadWriteOnce
  local:
    path: /node-v
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - {key: kubernetes.io/hostname, operator: In, values: [k8s-node1]}

생성 확인

 

3개의 PV와 연결될 3개의 PVC 생성, yaml 파일 작성

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-01
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1G
  storageClassName: ""
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-02
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 1G
  storageClassName: ""
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-03
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 2G
  storageClassName: ""

생성된 PVC확인 

PV와 연결 확인

 

PVC-3와 연결할 Pod 생성

apiVersion: v1
kind: Pod
metadata:
  name: pod-volume-3
spec:
  containers:
  - name: container
    image: kubetm/init
    volumeMounts:
    - name: pvc-pv
      mountPath: /mount3
  volumes:
  - name : pvc-pv
    persistentVolumeClaim:
      claimName: pvc-01

생성된 Pod 확인

생성된 Pod의 Container에 mount3으로 마운트 디렉토리를 확인

댓글