본문 바로가기

Cloud/k8s

[k8s] Pod 생성 및 볼륨 설정

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를 생성해보겠습니다.

pod 생성

생성 후 각 컨테이너의 터미널에 접속할 수 있습니다.

busybox 터미널에 접속해 앞서 생성한 디렉토리에 파일을 생성하고, 다시 nginx로 들어가 공유 디렉토리로 들어가면 busybox에서 생성한 파일을 확인할 수 있어요!

이렇게 디렉토리 이름은 다르지만, 결국 같은 공유 디렉토리를 가리키고 있습니다.

생성된 파드의 busybox 컨테이너 화면
생성된 파드의 nginx 컨테이너 화면

 

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

 

파드 생성 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

생성한 pod에 접속

 

💡호스트 디렉토리 위치는 아래 명령어로 확인할 수 있습니다!

$ kubectl get pod -o wide

 

저는 k8s-node1으로 접속해서 확인했습니다.

호스트 디렉토리 확인

 

'Cloud > k8s' 카테고리의 다른 글

[k8s] ConfigMap, Secret으로 DB 서버 접속  (0) 2025.03.19