Notice
Recent Posts
Recent Comments
Link
관리 메뉴

look-forest

파드(Pod)를 활용해 서버 띄워보기 본문

Infra/Kubernetes

파드(Pod)를 활용해 서버 띄워보기

studyHub 2026. 1. 26. 22:05

파드(Pod)란?

도커에서는 하나의 프로그램을 실행시키는 단위를 컨테이너라고 한다.

쿠버네티스에서는 하나의 프로그램을 실행시키는 단위파드(Pod)라고 한다.

일반적으로 하나의 파드가 하나의 (도커)컨테이너를 가진다.(여러 컨테이너 가질 수도 있긴하다)

2개의 결제 서버가 띄워져있다 = 2개의 결제 서버 파드(Pod)가 띄워져있다. 서버가 죽었다 = 파드가 죽다.

 

쿠버네티스도 도커처럼 이미지를 기반으로 파드를 띄워 실행시킨다.

서버를 파드로 띄워보기

파드를 생성할 때, CLI를 활용하는 방법이 있고, yaml 파일을 활용하는 방법이 있다.

보통 현업에서는 일일이 CLI를 치지않고 yaml 파일을 활용하는 경우가 많다.

이러한 yaml 파일을 보고 매니페스트 파일(Manifest File)이라고 부른다.

매니페스트 파일이란, 쿠버네티스에서 다양한 리소스(파드, 서비스, 볼륨 등)를 생성하고 관리하기 위해 사용하는 파일이다.
(Docker로 치면 Dockerfile과 같은 역할)

 

1. yaml 파일 생성하기

apiVersion: v1 # Pod를 생성할 때는 v1이라고 기재한다. (공식 문서)
kind: Pod # Pod를 생성한다고 명시
metadata:
  name: nginx-pod # Pod에 이름 붙이는 기능
spec:
  containers:
    - name: nginx-container # 생성할 컨테이너의 이름
      image: nginx # 컨테이너를 생성할 때 사용할 Docker 이미지
      ports:
        - containerPort: 80 # 해당 컨테이너가 어떤 포트를 사용하는 지 명시적으로 표현
      imagePullPolicy: IfNotPresent
  • 주의) YAML 문법상 들여쓰기를 할 때 Tab을 사용하면 안 되고 반드시 띄어쓰기를 활용해야 한다. 
  • 이미지는 Dockerfile을 바탕으로 빌드하거나, 레지스트리(Dockerhub, ECR과 같은 원격 이미지 저장소)에서 가져온다.
  • Image Pull Policy 설정을 안하면, 이미지의 태그가 lastest인 경우 Always, 아닌 경우 IfNotPresent로 설정된다. 
    • Always: 레지스트리에서 가져온다.
    • IfNotPresent: 로컬에 없는 경우에만 레지스트리에서 가져온다.
    • Never: 로컬에서만 이미지를 가져온다.

2. 매니페스트 파일을 기반으로 파드 띄우기(생성&실행)하기

$ kubectl apply -f nginx-pod.yaml # yaml 파일(f)에 적혀져있는 리소스(파드)를 생성

 

3. 파드가 잘 생성되었는지 확인

$ kubectl get pods # 파드(Pod) 조회

 

4. 포트포워딩으로 서버가 실행됐는 지 확인

방법1) 파드 내부로 들어가서 요청보내기

$ kubectl exec -it spring-pod -- bash 
$ curl localhost:8080

방법2) 포트 포워딩 활용하기

 - 기본적으로 파드 내부와 외부의 네트워크는 분리되어 있다.

$ kubectl port-forward pod/spring-pod 12345:8080

터미널에서 Ctrl+C를 누르면 포트포워딩 종료

 

5. 파드 삭제하기

$ kubectl delete pod spring-pod

 


[예제] 백엔드(Spring Boot) 서버 3개 띄워보기

실제 서비스를 운영하다보면 트래픽이 증가해서 서버를 수평 확장(서버 개수를 늘리는 방식)을 한다.

이러한 상황을 가정해 springboot 서버를 3대로 늘려보자.

 

기존에 도커파일을 바탕으로 이미지를 빌드한 후 매니페스트 파일에 작성해두었을 것이다.

그 메니페스트 파일에 파드를 3개로 설정하면 된다. 복붙해서 이름만 다르게하면 된다.

apiVersion: v1
kind: Pod

metadata:
  name: spring-pod-1

spec:
  containers:
    - name: spring-container
      image: spring-server
      ports:
        - containerPort: 8080
      imagePullPolicy: IfNotPresent

---
apiVersion: v1
kind: Pod

metadata:
  name: spring-pod-2

spec:
  containers:
    - name: spring-container
      image: spring-server
      ports:
        - containerPort: 8080
      imagePullPolicy: IfNotPresent

---
apiVersion: v1
kind: Pod

metadata:
  name: spring-pod-3

spec:
  containers:
    - name: spring-container
      image: spring-server
      ports:
        - containerPort: 8080
      imagePullPolicy: IfNotPresent

 

그리고 그 매니페스트 파일을 바탕으로 파드를 띄우면, 아래와 같이 3개의 파드가 생성된 것을 볼 수 있다.

하나의 파드는 하나의 프로그램을 실행시키는 단위라고 했으니, 3개의 프로그램이 실행되고 있는 것이다.

 

그런데 이러한 방식으로는, 3개가 아니라 100대면 너무 불편할 것이다.

그리고 서비스를 운영하다보면트래픽은 시시각각 변하는데, 그럴 때마다 트래픽에 맞게 서버 대수를 조정하기가 불편할 것이다.

 

이러한 불편함을 해결해주는 기능이 디플로이먼트(Deployment)이다. 다음 편에 알아보자.


파드(Pod) 디버깅 하는 방법

1. 파드(Pod)가 정상적으로 실행되지 않았을 때 에러 메시지 확인

# kubectl describe pods [파드명]
$ kubectl describe pods nginx-pod # nginx-pod 파드의 세부 정보 조회

 

2. 파드(Pod)의 로그 확인
 파드 내 컨테이너의 표준 출력 로그를 확인하여 애플리케이션 실행 중 문제를 볼 때 사용

# kubectl logs [파드명]
$ kubectl logs nginx-pod # 파드 로그 확인하기

nginx가 실행되면서 생긴 로그를 볼 수 있다.

3. 파드에 접속해서 확인

컨테이너 종류에 따라 bash가 아닌 sh이 설치되어 있을 수 있다.

# kubectl exec -it [파드명] -- bash
$ kubectl exec -it nginx-pod -- bash
$ kubectl exec -it nginx-pod -- sh

참고 자료 & 이미지 출처
비전공자도 이해할 수 있는 쿠버네티스 입문/실전