✔️ Volume이란 ?
쿠버네티스 Pod 내에서 돌아가는 컨테이너는 고유한 파일시스템을 갖는다. 파일시스템은 컨테이너 이미지에서 제공되기 때문이다. 따라서 컨테이너가 재시작하게되면 이전 컨테이너에서 쓰여진 파일시스템은 새롭게 재시작된 컨테이너가 볼 수 없다. 만약 컨테이너가 종료되더라도 파일시스템이 유지되도록 하고싶다면 어떻게 해야 할까 ?
이 때 사용하는 오브젝트가 Volume이다.
Volume은 파드의 일부분으로 정의되며 파드와 동일한 라이프사이클을 갖는 디스크 스토리지이다.
파드가 여러개의 컨테이너를 가지는 경우 모든 컨테이너가 볼륨을 공유할 수도 있다.
✔️ Volume의 종류
내부 | Network (외부) | |
Temp | Local | |
emptyDir | hostPath | GlusterFS gitRepo NFS iSCSI gcePersistentDisk AWS EBS azureDisk Fiber Channel Secret VshereVolume |
- emptyDir : 일시적인 데이터를 저장하는 데 사용되는 임시 볼륨
- hostPath : 워커노드의 파일시스템을 파드의 디렉토리로 마운트하는데 사용
- nfs : NFS 공유 파드에 마운트
- gcePersistentDisk(GCE Persistent Disk), awsElasticBlockStore(AWS EBS Volume), azureDist(MS Azure Disk Volume): 클라우드 제공자의 전용 스토리지를 마운트
- cinder, cephfs, iscsi, glusterfs, quobyte, rbd, flexVolume, vsphereVolume, photonPersistentDisk: 다른 유형의 네트워크 스토리지를 마운트
- configMap, secret, downwardAPI: 쿠버네티스 리소스나 클러스터 정보를 파드에 노출하는 데 사용되는 특별한 유형의 볼륨
- persistentVolumeClaim: 사전에 혹은 동적으로 프로비저닝된 퍼시스턴트 스토리지를 사용하는 방법
✔️ emptyDir
Pod가 생성, 삭제될 때 같이 생성, 삭제되는 임시 볼륨이다. (Pod가 실행되는 노드의 디스크 공간에 마운트된다.)
Pod에 영향을 받기 때문에 컨테이너에 문제가 생겨서 재시작이 일어나도 볼륨에는 영향을 주지 않는다.
emptyDir은 이름처럼 빈 디렉토리로 데이터를 임시로 디스크에 저장해야 할 때 사용된다. 사용 목적은 다음과 같다.
1) Pod의 Container 간에 동일한 파일을 Read/Write
2) 대규모의 데이터 임시 저장(데이터의 크기가 Memory의 크기를 넘어서는 경우)
3) Recovery (Container Crash 대비)
✔️ emptyDir 예시 코드
apiVersion: v1
kind: Pod
metadata:
name: emptydir-pod
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- mountPath: /emptyDir
name: test
volumes:
- name: test
emptyDir: {}
containers.volumeMounts.mountPath → 실행될 컨테이너 안에 마운트할 경로이다. 컨테이너 안에 해당 디렉토리가 없더라도 자동으로 생성해준다.
containers.volumeMounts.name → 마운트할 볼륨의 이름이다.
volumes.name → 위에서 작성한 test를 사용하도록 지정한다.
✔️ hostPath
hostPath 볼륨은 노드의 파일시스템의 특정 파일이나 디렉토리를 Pod에서 마운트해서 사용한다.
같은 hostPath에 있는 볼륨은 여러 Pod 사이에서 공유되어 사용되며 같은 파일시스템을 공유할 수 있다.
Pod가 삭제되더라도 hostPath에 있는 파일들은 삭제되지 않고 다른 Pod가 같은 hostPath를 마운트하게 되면 남아있는 파일을 엑세스 할 수 있다.
주의할 점 중 하나는 Pod가 재시작되어 다른 노드에서 가동될 경우, 그 노드의 hostPath를 사용하기 때문에, 이전에 다른 노드에서 사용한 hostPath의 파일 내용은 액세스 불가하다.
hostPath는 노드의 파일시스템을 접근하는데 유용한데, 예를 들어 노드의 로그 파일을 읽어서 수집하는 로그 에이전트를 Pod로 배포했을 경우, 이 Pod에서 노드의 파일시스템에 접근해야 한다. 이런 경우 유용하게 사용할 수 있다.
✔️ hostPath 예시 코드
apiVersion: v1
kind: Pod
metadata:
name: hostpath-pod
spec:
containers:
- name: hostpath-pod
image: nginx
volumeMounts:
- mountPath: /hostpath
name: hostpath-volume
volumes:
- name: hostpath-volume
hostPath:
path: /tmp/hostpath #해당 디렉토리가 존재해야 함
type: Directory
containers.volumeMounts.mountPath → 실행된 컨테이너 안에 마운트할 경로이다.
containers.volumeMounts.name → 마운트할 볼륨의 이름
volumes.name → 위에서 작성한 hostpath-volume을 사용하도록 지정
volumes.hostPath → 노드에 마운트할 경로를 정해주고 해당 경로는 Directory임을 명시한다. 해당 디렉토리는 노드에 생성되어 있어야 하며, DirectoryOrCreate를 사용할 경우 디렉토리가 존재하지 않으면 디렉토리를 생성해준다.
'DevOps > Kubernetes' 카테고리의 다른 글
[Kubernetes] Object - Volume이란 (3) (0) | 2022.03.28 |
---|---|
[Kubernetes] Object - Volume이란 (2) (0) | 2022.03.28 |
[Kubernetes] Object - Namespace란 ? (0) | 2022.03.28 |
[Kubernetes] Service Discovery (0) | 2022.03.17 |
[Kubernetes] Object - Service (0) | 2022.03.17 |
영차영차 성장 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!