Kubernetes에서 Pod를 생성하는 방법은 크게 두 가지가 있다. 명령줄 인터페이스(CLI)를 이용하는 방식과 YAML 스크립트를 이용하는 방식이다
명령줄 인터페이스(CLI)를 이용한 Pod 생성
kubectl run 명령어를 사용하여 Pod를 즉시 생성할 수 있다
Pod 생성 명령어
- my-nginx: 생성될 Pod의 이름이다
- –image=nginx: Pod에서 실행될 컨테이너의 이미지(여기서는 Nginx)를 지정한다
- –port=80: 컨테이너 내부에서 Nginx가 사용하는 포트를 지정한다. 이는 컨테이너 내부 포트이며, 외부에서 직접 접근 가능한 포트가 아니다.
kubectl run my-nginx --image=nginx --port=80 # 또는 특정 네임스페이스 지정 시 kubectl run my-nginx --namespace=my-namespace --image=nginx --port=80

Pod 확인
Pod가 생성되었는지 확인한다. 기본적으로 default 네임스페이스에 생성된다
kubectl get pod # 또는 특정 네임스페이스 지정 시 kubectl get pod -n <네임스페이스_이름>

상세 정보 확인
Pod의 IP 주소, 실행 중인 노드 등 더 자세한 정보를 확인한다
kubectl get pods -o wide

Pod 삭제
생성된 Pod를 삭제한다
kubectl delete pod my-nginx

YAML 스크립트를 이용한 Pod 생성 및 관리
실무에서는 대부분 YAML (또는 YML) 스크립트를 통해 Pod를 비롯한 Kubernetes 자원들을 정의하고 관리한다. 스크립트 방식은 재사용성, 버전 관리, 협업에 유리하다
apiVersion: v1 # 쿠버네티스 API 버전
kind: Pod # 생성할 자원의 종류 (Pod)
metadata:
name: my-nginx # Pod의 이름 (클러스터 내에서 유일해야 함)
namespace: hyeok # Pod가 생성될 네임스페이스, 해당 네임스페이스가 존재하지 않으면 Pod 생성 실패
labels: # Pod에 할당될 레이블 (Service에서 Pod를 선택할 때 사용)
app: my-nginx
spec:
containers: # Pod 내에 실행될 컨테이너 목록
- name: my-nginx # 컨테이너의 이름
image: nginx # 컨테이너 이미지
ports:
- containerPort: 80 # 컨테이너 내부에서 Nginx가 사용하는 포트
주요 개념
- apiVersion: Kubernetes API 버전을 명시한다
- kind: 생성하려는 Kubernetes 자원의 종류를 명시한다(예: Pod, Service, Deployment)
- metadata.name: 자원의 이름을 지정한다. Pod의 경우 클러스터 내에서 고유해야 한다
- metadata.namespace: 자원이 속할 네임스페이스를 지정한다
- metadata.labels: 자원에 메타데이터 태그를 부여한다. 이 레이블은 Service가 어떤 Pod들을 그룹화하여 트래픽을 전달할지 결정하는 데 사용된다. 동일한 레이블을 가진 Pod는 여러 개 있을 수 있다
- spec.containers: Pod 내에서 실행될 컨테이너 목록을 정의한다. Pod 하나에는 여러 컨테이너가 포함될 수 있다
- name: 컨테이너의 이름을 지정한다
- image: 컨테이너가 사용할 Docker 이미지를 지정한다
- ports.containerPort: 컨테이너가 내부에서 애플리케이션이 리스닝하는 포트를 지정한다
Pod 생성 (스크립트 전용)
YAML 파일에 있는 디렉터리에서 아래 명령어를 실행하여 Pod를 생성한다. 명령어를 입력하는 위치는 YAML 파일이 있는 위치여야 한다
kubectl apply -f nginx_pod.yml
Pod 확인
metadata.namespace에 지정된 네임스페이스에서 Pod를 확인한다
kubectl get pod -n hyeok

Pod 내부 프로그램 접근 및 테스트
Pod는 기본적으로 외부와 고립되어 있다. 사용자가 직접 Pod 내부의 Nginx에 접근하는 것은 불가능하며, Service 자원을 통해 접근해야 한다. 하지만 디버깅이나 테스트 목적으로 Pod 내 컨테이너에 접속할 수 있다
컨테이너 내부 접속
kubectl exec 명령어를 사용하여 Pod 내의 특정 컨테이너에 접속할 수 있다
kubectl exec -it my-nginx -n hyeok -- /bin/sh
- -it: 대화형 터미널을 할당한다
- my-nginx: 접속할 Pod의 이름이다
- -n hyeok: Pod가 위치한 네임스페이스이다
- — /bin/sh: 컨테이너 내부에서 실행할 셸 명령이다
컨테이너 내부에서 Nginx 테스트 (curl 사용)
컨테이너에 접속한 후, curl 명령어를 사용하여 Nginx 서버에 요청을 보낼 수 있다. Nginx 이미지는 데비안(Debian) 계열의 리눅스를 기반으로 하는 경우가 많으므로 apt 명령어로 curl을 설치할 수 있다. Alpine 기반은 apk로 사용하고 레드햇 기반은 yum을 사용한다
# curl 설치 (컨테이너 내부에서 실행) apt update && apt install -y curl # Nginx 홈 페이지 요청 curl http://localhost:80 # 또는 curl http://localhost

결과: Nginx의 기본 HTML 응답이 터미널에 출력된다. 이는 Nginx 서버가 컨테이너 내부에서 정상적으로 작동하고 있음을 의미한다
컨테이너 접속 종료
exit
Pod 삭제 (스크립트 이용)
YAML 스크립트로 생성한 Pod는 아래 명령어로 삭제할 수 있다
kubectl delete -f nginx_pod.yml

참고: 하나의 YAML 파일에 여러 Kubernetes 자원(예: Pod, Service, Deployment)을 — 구분자를 사용하여 정의할 수 있으며, kubectl apply -f 명령 한 번으로 이 모든 자원을 생성하거나 업데이트할 수 있다. 마찬가지로 kubectl delete -f 명령으로 한 번에 삭제할 수 있다
다중 컨테이너 Pod (Sidecar 패턴)
하나의 Pod 안에 여러 개의 컨테이너를 함께 실행하는 것도 가능하다. 이는 주로 Sidecar 패턴과 같은 용도로 사용된다. 예를 들어, 메인 애플리케이션 컨테이너 옆에 로깅, 모니터링, 프록시 등의 보조 기능을 수행하는 컨테이너를 배치할 수 있다
다중 컨테이너 Pod YAML 파일 (예: nginx_pod_busybox.yml)
apiVersion: v1
kind: Pod
metadata:
name: my-nginx2
namespace: hyeok
labels:
app: my-nginx2
spec:
containers:
- name: nginx # 메인 Nginx 컨테이너
image: nginx
ports:
- containerPort: 80
- name: http-pinger # Sidecar 컨테이너 (Nginx 상태 모니터링 예시)
image: busybox
command: ['sh', '-c', 'while true; do wget -qO- http://localhost:80; sleep 5; done']
- http-pinger 컨테이너는 busybox 이미지를 사용하여 셸 스크립트를 실행한다
- command 필드에 정의된 스크립트는 5초마다 localhost:80 (동일 Pod 내 Nginx 컨테이너)으로 HTTP GET 요청을 보낸다. 이는 Nginx 컨테이너가 잘 작동하는지 주기적으로 확인하는 용도로 사용될 수 있다. 동일 Pod 내의 컨테이너들은 localhost를 통해 서로 통신할 수 있다
- command의 wget은 이미지 버전에 따라 없을 수도 있다
Pod 생성
kubectl apply -f nginx_pod_busybox.yml
Pod 상태 확인
READY 상태가 2/2로 표시되어 두 컨테이너가 모두 준비되었음을 나타낸다
kubectl get pod -n hyeok
Pod 로그 확인
kubectl logs 명령어로 Pod의 로그를 확인할 수 있다. -f 옵션은 실시간으로 로그를 스트리밍 한다. 다중 컨테이너 Pod의 경우, -c 옵션으로 특정 컨테이너의 로그를 지정할 수 있다
# Pod 전체의 로그 (기본은 첫 번째 컨테이너 로그만 출력해준다) kubectl logs -f my-nginx2 -n hyeok # 특정 컨테이너(예: nginx)의 로그 확인 kubectl logs -f my-nginx2 -n hyeok -c nginx kubectl logs -f my-nginx2 -n hyeok -c http-pinger # 모든 컨테이너 로그를 동시에 보려면 (Kubernetes 1.14+) kubectl logs -f my-nginx2 -n hyeok --all-containers=true
로그를 통해 nginx 컨테이너의 시작 메시지와 http-pinger 컨테이너가 주기적으로 보낸 요청(Nginx Access Log에 기록)을 확인할 수 있다
