일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- AI
- CKA
- Pinpoint
- minikube
- CKA 기출문제
- kotlin spring
- Spring
- 티스토리챌린지
- Java
- AWS EKS
- Linux
- APM
- 코틀린 코루틴의 정석
- Elasticsearch
- 정보처리기사 실기 기출문제
- IntelliJ
- 오블완
- CloudWatch
- aws
- 정보처리기사실기 기출문제
- Kubernetes
- 기록으로 실력을 쌓자
- MySQL
- 공부
- kotlin coroutine
- PETERICA
- 정보처리기사 실기
- kotlin querydsl
- kotlin
- mysql 튜닝
- Today
- Total
피터의 개발이야기
[Kubernetes] 쿠버네티스 볼륨 개념 1편 (emptryDir, hostPath) 본문
ㅁ 쿠버네티스 볼륨
쿠버네티스 환경에서 노드에 장애가 발생하면 컨테이너를 새로 실행하기 마련이다. 그렇기 때문에 쿠버네티스는 기본적으로 컨테이너는 stateless를 추구하고 있다. 이를 통해 서비스를 자동으로 쉽게 운영할 수 있는 장점을 가지게 되지만, 데이터를 꼭 보존해야할 경우 단점이 될 수 있다. 앱의 특성에 따라 컨테이너에 문제가 발생해도 데이터를 보존하기 위해 볼륨을 사용한다. 볼륨을 사용하면 컨테이너가 재시작하여도 데이터를 유지할 수 있다. 더욱이 퍼시스턴트 볼륨을 사용하여 노드에 종속하지 않고 다른 노드에서 컨테이너가 재시작하더라도 볼륨의 데이터를 그대로 사용할 수 있다. 볼륨이나 퍼시스턴트 볼륨을 사용하면 서버 하나에 종속되지 않고 데이터를 접근하여 안정적으로 서비스를 운영할 수 있다.
컨테이너 내의 디스크에 있는 파일은 임시적이며, 컨테이너에서 실행될 때 애플리케이션에 적지 않은 몇 가지 문제가 발생한다. 한 가지 문제는 컨테이너가 크래시될 때 파일이 손실된다는 것이다. kubelet은 컨테이너를 다시 시작하지만 초기화된 상태이다. 두 번째 문제는 Pod에서 같이 실행되는 컨테이너간에 파일을 공유할 때 발생한다. 쿠버네티스 볼륨 추상화는 이러한 문제를 모두 해결한다. (쿠버네티스 개념문서 > 스토리지 > 볼륨 글)
ㅁ 스토리지의 종류와 클러스터 구성
본격적으로 볼륨의 종류를 이해 하기에 앞서, 데이터를 저장할 목적과 그에 맞는 볼륨의 형태를 고르는 것도 중요한다.
크게 볼륨 중에서 내부 호스트의 디스크를 사용하는 emptyDir과 hostPath와 외부 스토리지 시스템을 연동하여 사용하는 퍼시스턴트, EFS 형태로 나누어 볼 수 있다. 내부 호스트의 경우 볼륨이 종속되어 있는 Pod나 Node의 생명주기에 따라 삭제가 된다. 한편 외부 스토리지는 영구볼륨으로 Node나 Pod가 삭제가 되더라도 데이터는 영구 보존할 수 있다. 그렇기 때문에 외부 스토리지 시스템을 연동하면 데이터를 보다 안정적으로 보존할 수 있다.
먼저 내부적으로 사용할 수 있는 볼륨의 종류와 그 특징을 살표보도록 하자.
ㅁ emptyDir
emptyDir은 노드의 디스크를 파드가 일시적으로 사용하는 방법이다. 그래서 emptyDir은 Pod가 삭제되면 볼륨도 같이 삭제되는 임시적 성격을 가진다. 그래서 임시 데이터를 보관할 때에 유리하다. Pod가 Scale in out 되면 임시 데이터는 자동으로 정리가 되기 때문이다. emptyDir 볼륨은 파드가 노드에 할당될 때 처음 생성되며, 해당 노드에서 파드가 실행되는 동안에만 존재한다. 파드 내 모든 컨테이너는 emptyDir 볼륨에서 동일한 파일을 읽고 쓸 수 있지만, 해당 볼륨은 각각의 컨테이너에서 동일하거나 다른 경로에 마운트될 수 있다.
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: k8s.gcr.io/test-webserver
name: test-container
volumeMounts:
# 마운트할 볼륨의 이름. 실행될 컨테이너 안에 마운트할 경로. 없으면 자동 생성됨
- mountPath: /cache
name: cache-volume
volumes:
# 위에 선언한 cache-volume을 사용지정함
- name: cache-volume
emptyDir: {}
ㅁ hostPath
hostPath는 호스트 노드의 파일이나 디렉토리를 파드에 마운트 해서 볼륨으로 사용하여 노드 상의 다른 파드와 볼륨을 공유할 수 있다. 주의할 점은 호스트의 파일이나 디렉토리를 무분별하게 공유할 경우 보안상에 문제가 발생할 수 있다. HostPath 볼륨을 사용해야 하는 경우, 필요한 파일 또는 디렉터리로만 범위를 지정하고 ReadOnly로 마운트해야 한다. hostPath는 minikube처럼 외부 스토리지를 사용할 수 없는 곳에서 간단하게 사용하는 용도가 적당할 것 같다.
apiVersion: v1
kind: Pod
metadata:
name: test-webserver
spec:
containers:
- name: test-webserver
image: k8s.gcr.io/test-webserver:latest
volumeMounts:
- mountPath: /var/local/aaa
name: mydir
- mountPath: /var/local/aaa/1.txt
name: myfile
volumes:
- name: mydir
hostPath:
# 호스트의 디렉토리 위치, 파일 디렉터리가 생성되었는지 확인 필요.
path: /var/local/aaa
type: DirectoryOrCreate
- name: myfile
hostPath:
path: /var/local/aaa/1.txt
type: FileOrCreate
지금까지 내부 스토리지를 이용한 볼륨에 대해서 알아보았다. 내부 스토리지의 경우 Pod와 Node 다운되면 데이터 분실이 발생할 수 있기 때문에 데이터의 영속성을 보장할 수 었다. 이를 해결하기 위한 외부 스토리지 시스템을 연동한 퍼시스턴트 볼륨에 대해서 알아보고 더 나아가 볼륨을 공유할 수 있는 EFS에 대해서도 알아 보도록 하겠다.
[Kubernetes] 쿠버네티스 볼륨 개념 2편
ㅁ 함께 보면 좋은 사이트
ㅇ 쿠버네트스 개념 문서 > 스토리지 > 볼륨
'Kubernetes > 기초공부' 카테고리의 다른 글
[kubernetes] taint drain cordon 차이점 (0) | 2023.05.31 |
---|---|
[Kubernetes] 네트워크 이해 (0) | 2023.05.04 |
[Kubernetes] 쿠버네티스 볼륨 개념 2편 (pv, pvc, AWS EBS, AWS EFS ) (2) | 2022.10.11 |
[kubernetes] Pod 재기동 방법, pod restart (0) | 2022.09.27 |
[kubernetes] Ingress 와 egress 차이 (0) | 2022.08.13 |