Docker 컨테이너를 실행할 때에도 컨테이너의 재시작과 상관없이 항상 보존되어야 하는 정보들은 Volume을 마운팅한다.
동일한 역할을 하는 Volume을 Pod에도 설정할 수 있는데, 한번 정리해보자.
emptyDir은 컨테이너 간에 볼륨을 공유하기 위해서 사용된다.
이름이 emptyDir인 이유는 보륨이 생성될 때, 해당 볼륨은 항상 비어 있기 때문이다.
emptyDir로 볼륨을 생성하면, 이 볼륨은 Pod에 생성되게 된다. 그래서 Pod가 재부팅되면, emptyDir에 저장되어 있던 파일들은 모두 삭제가 된다. 그래서 emptyDir에는 영구적일 필요가 없는 임시 데이터 또는 파일들을 저장하기 위해서 사용되어야한다.
apiVersion: v1
kind: Pod
metadata:
name: pod-vol-1
spec:
containers:
- name: container-vol-1
image: kai1114/hello
volumeMounts:
- name: empty-dir-1
mountPath: /mount-1
- name: container-vol-2
image: kai1114/hello
volumeMounts:
- name: empty-dir-1
mountPath: /mount-2
volumes:
- name: empty-dir-1
emptyDir: {}
emptyDir은 위와같이 사용할 수 있다.
hostPath는 말 그대로 host의 경로를 마운팅할 수 있는 방식인데, 여기서 host는 Pod입장에서 host에 해당하고, Node를 의미한다.
즉, Node의 특정 경로를 Pod에 마운팅할 수 있는 것이다. 이로 인해서 Pod가 재부팅되어도 데이터가 날아가지 않는다는 장점을 갖고 있다.
하지만, 당연하게도 이 볼륨은 Node에 종속되기 때문에 Pod가 재성성될 때, 생성되는 Node가 이전과 달라지거나, 장애로 인해서 현재의 노드말고 다른 노드로 위치가 옮겨질 수 있다는 단점이 존재한다.
hostPath는 언제 사용해야할까?hostPath는 Pod 또는 애플리케이션에서 만들어진 어떠한 정보를 저장하기 위해서 사용하는 것이 아니라, k8s의 Node에 존재하는 또는 Node가 갖고 있는 정보에 Pod가 접근해야하는 경우 사용한다.
apiVersion: v1
kind: Pod
metadata:
name: pod-vol-2
spec:
containers:
- name: container-vol-1
image: kai1114/hello
volumeMounts:
- name: host-path-1
mountPath: /mount-1
- name: container-vol-2
image: kai1114/hello
volumeMounts:
- name: host-path-1
mountPath: /mount-2
volumes:
- name: host-path-1
hostPath:
path: /node-path
type: Directory
hostPath를 사용하기 위해서는 위와 같은 형태로 yml을 작성하여 사용할 수 있다.

서버의 로컬 볼륨 또는 AWS, Git등등 다양한 저장 공간이 있을 수 있는데, 이러한 것들을 PV(Persistent Volume)로 정의한다.
Pod에서는 PVC(Persistent Volume Claim)를 정의하여, 미리 정의된 PV에 연결할 수 있다.
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-1
spec:
capacity:
storage: 1G
accessModes:
- ReadWriteOnce
local:
path: /node-v
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- { key: kubernates.io/hostmane, operator: In, values: [ minikube ] }
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pv-claim-1
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1G
storageClassName: ""
apiVersion: v1
kind: Pod
metadata:
name: pod-vol-3
spec:
containers:
- name: container
image: kai1114/hello
volumeMounts:
- name: pvc-pv
mountPath: /mount-2
volumes:
- name: pvc-pv
persistentVolumeClaim:
claimName: pv-claim-1