Pod를 생성해보겠습니다.
제가 생성하려는 pod는 두 개의 컨테이너를 담고있으며, volume을 서로 공유하는데요. 여기서 1) emptyDir 방식으로 공유하는 버전과 2) hostPath를 공유하는 버전 이렇게 두 가지로 생성해보겠습니다.
각 컨테이너의 이미지로 nginx와 busybox를 사용했습니다.
버전 1은 대시보드로, 버전 2는 cli로 해볼게요!
1️⃣ emptyDir로 파일을 공유하는 Pod 생성
Pod 내부에 생성되고, 최초 생성 시 항상 볼륨이 비어있기 때문에 emptyDir이라고 불립니다. Pod가 재생성되면 데이터가 전부 사라져요.
동일한 디렉토리에 대해 컨테이너별로 서로 다른 이름으로 마운트할 수 있습니다.
하지만 결국 동일한 디렉토리를 가리키고 있습니다.
<Pod 생성 yaml/>
apiVersion: v1
kind: Pod
metadata:
name: pod-emptydir
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- mountPath: /shared-data-nginx
name: shared-volume
- name: busybox
image: busybox
command: ["/bin/sh", "-c", "sleep 3600"]
volumeMounts:
- mountPath: /shared-data-busybox
name: shared-volume
volumes:
- name: shared-volume
emptyDir: {}
pod 생성 yaml 내용을 풀어서 설명하면, 다음과 같습니다.
1. 최상위 요소
apiVersion: v1
kind: Pod
- apiVersion: v1
- Kubernetes 리소스를 정의할 때 사용할 API 버전
- (Pod는 기본적으로 v1 API 그룹을 사용)
- kind: Pod
- 이 YAML이 정의하는 리소스 유형이 Pod임을 의미
2. metadata
metadata:
name: pod-emptydir
- name: pod-emptydir
- Pod의 이름을 pod-emptydir로 지정
- 클러스터 내에서 Pod을 식별하는 데 사용됨
3. spec
: Pod 내부의 컨테이너와 볼륨을 정의
3-(1) 첫 번째 컨테이너 : nginx
containers:
- name: nginx
image: nginx
volumeMounts:
- mountPath: /shared-data-nginx
name: shared-volume
- name: nginx
- 첫 번째 컨테이너 이름
- 같은 Pod 내에서 컨테이너를 식별할 때 사용됨
- image: nginx
- nginx 이미지를 기반으로 실행
- (기본적으로 nginx:latest 버전 로드)
- volumeMounts:
- 컨테이너 내부에서 특정 볼륨을 어디에 마운트할지 정의
- mountPath: /shared-data-nginx
- emptyDir 볼륨을 컨테이너 내부의 /shared-data-nginx 디렉터리에 마운트
- name: shared-volume
- 아래에서 정의된 shared-volume 볼륨을 마운트하도록 지정
3-(2) 두 번째 컨테이너: busybox
containers:
- name: nginx
image: nginx
volumeMounts:
- mountPath: /shared-data-nginx
name: shared-volume
- name: busybox
- 두 번째 컨테이너 이름
- image: busybox
- busybox 이미지를 기반으로 실행
- command: ["/bin/sh", "-c", "sleep 3600"]
- 이 컨테이너는 기본적으로 실행 후 종료되지만, sleep 3600을 사용하여 1시간(3600초) 동안 실행 상태를 유지하도록 함
- 따라서 Pod이 바로 종료되지 않고 유지됨
- volumeMounts:
- emptyDir 볼륨을 컨테이너 내부의 /shared-data-busybox 디렉터리에 마운트
- name: shared-volume
- 같은 shared-volume을 마운트하지만, nginx 컨테이너와 다른 이름의 경로(/shared-data-busybox)에 연결
4. volumes - Pod에서 사용할 볼륨 정의
volumes:
- name: shared-volume
emptyDir: {}
- volumes:
- Pod 내의 컨테이너들이 공유할 수 있는 볼륨을 정의
- - name: shared-volume
- 이 볼륨의 이름을 shared-volume으로 지정
- 컨테이너들은 volumeMounts에서 이 이름으로 참조해야 함
- emptyDir: {}
- 임시 스토리지 볼륨을 생성
- Pod이 실행되는 동안만 유지되며, Pod이 삭제되면 데이터도 사라짐
위와 같은 내용의 yaml파일을 사용해 pod를 생성해보겠습니다.
생성 후 각 컨테이너의 터미널에 접속할 수 있습니다.
busybox 터미널에 접속해 앞서 생성한 디렉토리에 파일을 생성하고, 다시 nginx로 들어가 공유 디렉토리로 들어가면 busybox에서 생성한 파일을 확인할 수 있어요!
이렇게 디렉토리 이름은 다르지만, 결국 같은 공유 디렉토리를 가리키고 있습니다.
2️⃣ hostPath로 파일을 공유하는 Pod 생성
이번에는 hostPath로 마운트해보겠습니다.
hostPath는 host, 즉 pod들이 올라가있는 노드의 path를 volume으로 사용하는 것입니다.
hostPath의 경우에는 emptyDir과 달리 path를 각 pod가 마운트해서 공유해 사용하므로, pod가 죽어도 노드의 volume 내 데이터는 사라지지 않습니다.
hostPath는 pod의 데이터를 저장하기 위한 용도가 아니라, 노드의 데이터를 pod로 로드하기 위한 용도로 사용합니다.
<파드 생성 yaml/> : pod-hostpath.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-hostpath
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- mountPath: /shared-data-nginx
name: shared-volume
- name: busybox
image: busybox
command: ["/bin/sh", "-c", "sleep 3600"]
volumeMounts:
- mountPath: /shared-data-busybox
name: shared-volume
volumes:
- name: shared-volume
hostPath:
path: /tmp/k8s-shared
type: DirectoryOrCreate
위의 emptyDir로 생성한 yaml 내용과 겹치지 않는 부분만 설명하겠습니다.
1. volumes
- Pod에서 사용할 볼륨을 정의
- shared-volume이라는 이름으로 볼륨을 선언
- 이 볼륨은 Pod 내부에서 두 개의 컨테이너(nginx, busybox)가 공유하도록 설정됨
2. name: shared-volume
- 볼륨의 이름을 shared-volume으로 지정
- 각 컨테이너의 volumeMounts에서 이 볼륨을 참조하여 특정 디렉터리에 마운트
3. hostPath
- Kubernetes 노드의 특정 디렉터리를 Pod의 볼륨으로 마운트하는 방식. 위 yaml에서는 Pod가 실행된 노드의 /tmp/k8s-shared 경로를 컨테이너 내부로 마운트함
- Pod가 실행된 노드에서만 볼 수 있음
4. path: /tmp/k8s-shared
- 호스트(=Pod이 실행된 노드)의 /tmp/k8s-shared 디렉터리를 Pod 내 볼륨으로 사용
- Pod 내부의 mountPath(/shared-data-nginx, /shared-data-busybox)와 연결됨
5. type: DirectoryOrCreate
- 디렉터리가 없으면 자동으로 생성
- 즉, /tmp/k8s-shared가 원래 없더라도 Kubernetes가 자동으로 디렉터리를 생성해줌
- 디렉터리가 없어서 오류가 발생하는 것을 방지
마스터 노드에서 pod 생성 yaml을 작성하고 적용합니다.
$ vi pod-hostpath.yaml
$ kubectl apply -f pod-hostpath.yaml
$ kubectl exec -it pod-hostpath -c busybox -- sh
/ # echo "Hello from busybox with hostPath" > shared-data-busybox/hello_from_busybox.txt
/ # exit
$ kubectl exec -it pod-hostpath -c nginx -- sh
# cat /shared-data-nginx/hello_from_busybox.txt
💡호스트 디렉토리 위치는 아래 명령어로 확인할 수 있습니다!
$ kubectl get pod -o wide
저는 k8s-node1으로 접속해서 확인했습니다.
'Cloud > k8s' 카테고리의 다른 글
[k8s] ConfigMap, Secret으로 DB 서버 접속 (0) | 2025.03.19 |
---|