본문 바로가기
AI Journey/클라우드

[Kubernetese] Nginx 파드(Pod) 생성하고 포트 포워딩(port forwarding)하기

by 보눔비스타 2025. 12. 31.

쿠버네티스에서 가장 기본이 되는 배포 단위인 파드(Pod)를 직접 생성하고, 내부 접속 및 외부 노출을 테스트하는 과정을 실습해본다.

대표적 웹 서버인 Nginx 컨테이너를 띄우고, 로컬 환경에서 접속이 가능한지 확인해보는 과정이다.

1. 선언적 정의: YAML 파일 작성

쿠버네티스는 선언적(Declarative) 시스템이다.

즉, 내가 "무엇을 하고 싶다"라고 명령어로 하나하나 지시하기보다는, "어떤 상태가 되기를 원한다"라고 명세서(Manifest)를 작성해서 제출하는 방식이 권장된다.

먼저 인텔리제이(IntelliJ)를 이용해 다음과 같이 nginx-pod.yaml 파일을 작성했다.

 

  • apiVersion: 오브젝트를 생성하기 위한 API 버전 (Pod는 v1).
  • kind: 생성할 리소스의 종류 (여기서는 Pod).
  • metadata: 리소스의 이름이나 라벨 등 식별 정보를 정의.
  • spec: 파드가 가져야 할 구체적인 상태(컨테이너 이미지, 포트 등)를 정의.

2. 파드 생성 (Creation)

작성한 yaml 파일을 바탕으로 클러스터에 파드를 생성했다.

kubectl apply -f nginx-pod.yaml
# 출력: pod/nginx-pod created

 

 

  • 위와 같이 kubectl apply 명령어를 실행하면, 로컬의 yaml 파일 내용이 쿠버네티스 API 서버로 전송된다.
  • API 서버는 이 정보를 etcd(저장소)에 저장하고, 스케줄러는 이 파드를 어떤 노드에 배치할지 결정하여 컨테이너를 실행시킨다.

3. 상태 확인 (Inspection)

파드가 정상적으로 생성되어 실행 중인지 확인한다.

kubectl get pods
# 출력: 
# NAME        READY   STATUS    RESTARTS   AGE
# nginx-pod   1/1     Running   0          38s

 

  • STATUS: Running: 이미지를 성공적으로 pull 받았고, 컨테이너가 정상적으로 시작되었음을 의미한다.
  • READY: 1/1: 파드 내에 정의된 컨테이너 1개 중 1개가 준비 완료 상태라는 뜻이다.

4. 파드 내부 접속 확인 (Exec)

파드가 실행 중이라도 실제 웹 서버가 응답하는지 확인해야 한다.

exec 명령어를 통해 파드 내부의 쉘로 진입하여 직접 호출을 시도한다.

kubectl exec -it nginx-pod -- bash

 

 

파드 내부 쉘(root@nginx-pod)로 진입한 뒤, 자기 자신(localhost)에게 요청을 보낸다.

명령어: curl localhost:80

root@nginx-pod:/# curl localhost:80
# 출력: 
# <!DOCTYPE html>
# <html>
# ...
# <h1>Welcome to nginx!</h1>
# ...
# </html>
  • 파드는 고유한 네트워크 네임스페이스(IP 주소 등)를 가진다. 파드 내부에서는 localhost를 통해 컨테이너 서비스에 접근할 수 있다. Nginx 기본 페이지 HTML이 응답된 것으로 보아 웹 서버가 정상 작동 중임을 알 수 있다.

5. 로컬 포트 포워딩 (Port Forwarding)

파드는 클러스터 내부 네트워크(VPC 등)에 격리되어 있어, 기본적으로 내 로컬 컴퓨터(Host)에서 직접 접근할 수 없다.

개발 및 디버깅 목적으로 내 컴퓨터의 포트와 파드의 포트를 연결하는 포트 포워딩(Port Forwarding) 기능을 사용할 수 있다.

sudo kubectl port-forward pod/nginx-pod 80:80
# 출력:
# Forwarding from 127.0.0.1:80 -> 80
# Forwarding from [::1]:80 -> 80
  • 80:80[로컬 포트]:[파드 포트]를 의미한다. 로컬의 80번 포트는 특권 포트(Privileged Port, 1024번 이하)이므로 sudo 권한이 필요하다.
  • 이제 브라우저나 터미널에서 localhost:80으로 접속하면, 그 트래픽이 쿠버네티스 파드로 터널링 되어 전달된다.
  • 터미널 출력에 Handling connection for 80이 찍히는 것을 통해 트래픽이 정상적으로 오고 가는 것을 확인할 수 있다.

6. 리소스 정리 (Deletion)

실습이 끝난 후, 사용하지 않는 리소스는 삭제하여 클러스터를 정리한다.

kubectl delete pod nginx-pod
# 출력: pod "nginx-pod" deleted from default namespace

kubectl get pods
# 출력: No resources found in default namespace.

 

실습 내용은 인프런 강의 <비전공자도 이해할 수 있는 쿠버네티스 입문/실전>을 참고했다.