
안녕하세요. 이번 시간에는 쿠버네티스의 가장 기본적인 리소스인 파드(Pod)에 대해 다뤄보겠습니다. 파드는 쿠버네티스에서 컨테이너를 실행하고 관리하는 최소 단위로, 여러 개의 컨테이너를 묶어서 하나의 논리적인 작업 단위로 사용할 수 있게 해줍니다. 이번 강의를 통해 파드의 개념부터 실습을 통해 직접 생성하고 관리하는 방법까지 알아보겠습니다.
쿠버네티스에서 파드(Pod)는 컨테이너를 실행하는 최소 단위입니다. 파드는 하나 이상의 컨테이너를 묶어 동일한 네트워크 네임스페이스와 스토리지를 공유하며 실행되도록 합니다. 이 말은, 파드 안에 있는 모든 컨테이너가 동일한 IP 주소와 포트를 공유한다는 뜻입니다.
파드는 일반적으로 컨테이너 한 개만 담고 있지만, 컨테이너 여러 개를 한 파드에 담아 협력 작업을 수행하게 할 수도 있습니다. 예를 들어, 하나의 컨테이너가 웹 서버 역할을 하고, 다른 컨테이너가 로그를 수집하는 작업을 하도록 구성할 수 있습니다.

많은 분들이 처음에 컨테이너와 파드의 차이를 헷갈릴 수 있습니다. 간단히 정리하자면:
파드는 쿠버네티스 클러스터에서 여러 노드에 분산되어 실행되며, 하나의 파드가 여러 컨테이너를 담고 있을 경우, 이 컨테이너들은 함께 실행되고 서로 자원을 공유합니다.
이제 실제로 파드를 생성해보겠습니다. 파드는 CLI를 사용하거나 YAML 파일을 통해 정의할 수 있습니다. 여기서는 두 가지 방법을 모두 실습해보겠습니다.
먼저, CLI를 사용하여 파드를 생성하는 방법을 살펴보겠습니다. 가장 기본적인 예로, nginx 웹 서버를 실행하는 파드를 생성해보겠습니다.
kubectl run nginx-pod --image=nginx --port=80
이 명령어는 nginx 이미지를 사용하여 nginx-pod라는 이름의 파드를 생성합니다. 파드가 성공적으로 생성되었는지 확인해보겠습니다.
kubectl get pods
이 명령어로 현재 클러스터에서 실행 중인 파드 목록을 확인할 수 있습니다.
이번에는 YAML 파일을 사용하여 파드를 생성해보겠습니다. 다음은 nginx 파드를 정의한 YAML 파일의 예시입니다.
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx-container
image: nginx
ports:
- containerPort: 80

위와 같은 내용을 nginx-pod.yaml 파일로 저장한 후, 다음 명령어를 실행합니다.
kubectl apply -f nginx-pod.yaml
혹은
kubectl create -f nginx-pod.yaml

파드가 성공적으로 생성되었는지 확인하려면 다음 명령어를 사용합니다.
kubectl get pods
kubectl get pods -o wide
kubectl get pods -o yaml
kubectl get pods -o json
kubectl get pods [파드이름] -o json | grep -i podip

파드가 정상적으로 실행 중인지 확인하기 위해 파드의 상태를 확인할 수 있습니다.
kubectl describe pod nginx-pod
또한, 파드에서 실행 중인 컨테이너의 로그를 확인할 수 있습니다.
kubectl logs nginx-pod
파드는 다양한 기능을 제공하며, 여러 애플리케이션을 안정적으로 실행할 수 있도록 도와줍니다. 여기서는 파드의 몇 가지 주요 기능을 알아보겠습니다.
쿠버네티스는 파드의 상태를 주기적으로 확인하기 위해 Liveness Probe와 Readiness Probe를 지원합니다. 이를 통해 파드가 정상적으로 동작하는지 모니터링하고, 필요할 경우 재시작하거나 서비스에서 제외할 수 있습니다.
Liveness Probe는 파드가 정상적으로 동작하지 않을 때 자동으로 재시작하는 기능을 제공합니다. 반면, Readiness Probe는 파드가 요청을 처리할 준비가 되었는지 확인하여 준비가 된 파드만 서비스 요청을 받을 수 있도록 합니다.
예시로, 다음은 nginx 파드에 Liveness Probe와 Readiness Probe를 설정하는 방법입니다.
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx-container
image: nginx
ports:
- containerPort: 80
livenessProbe:
httpGet:
path: /healthz
port: 80
initialDelaySeconds: 3
periodSeconds: 3
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 3
periodSeconds: 3
이 설정은 nginx 서버가 3초 후에 /healthz 경로를 통해 헬스 체크를 하도록 합니다.
파드 안에 여러 개의 컨테이너를 넣을 수도 있습니다. 이는 서로 연관된 컨테이너들이 하나의 파드 내에서 자원을 공유하며 동작하도록 할 수 있습니다. 예를 들어, 웹 서버 컨테이너와 로그 수집기 컨테이너를 하나의 파드에 넣어 함께 운영할 수 있습니다.
apiVersion: v1
kind: Pod
metadata:
name: multi-container-pod
spec:
containers:
- name: web-server
image: nginx
- name: log-collector
image: busybox
command: ['sh', '-c', 'while true; do echo "Logging..."; sleep 10; done']
위 YAML 파일은 nginx 웹 서버와 로그 수집기 컨테이너를 함께 실행하는 파드를 정의한 것입니다.
멀티 컨테이너 파드에서 특정 컨테이너로 들어가서 bash 또는 다른 쉘을 사용하는 방법이 있습니다. 이를 위해 kubectl exec 명령어를 사용합니다. 파드 안에 여러 컨테이너가 있을 때, 특정 컨테이너에 접속하기 위해서는 컨테이너 이름을 지정해주어야 합니다.
먼저, 파드가 실행 중인지 확인합니다.
kubectl get pods
여기서 파드 이름을 확인합니다. 예를 들어, multi-container-pod라는 파드가 있다고 가정하겠습니다.
파드 내에 어떤 컨테이너들이 있는지 확인합니다.
kubectl describe pod multi-container-pod
이 명령어를 통해 파드에 속한 컨테이너들의 이름을 확인할 수 있습니다. 예를 들어, nginx-container와 log-collector라는 두 개의 컨테이너가 있다고 가정하겠습니다.
특정 컨테이너로 bash 세션을 시작합니다.
kubectl exec -it multi-container-pod -c nginx-container -- /bin/bash
위 명령어에서:
-it: 인터랙티브 모드로 터미널을 연결합니다.multi-container-pod: 접속하려는 파드 이름입니다.-c nginx-container: 접속하려는 컨테이너 이름입니다. 파드 내에 여러 컨테이너가 있을 때 특정 컨테이너로 들어가기 위해 사용합니다.-- /bin/bash: 해당 컨테이너 안에서 bash 쉘을 실행하라는 의미입니다.만약 bash가 설치되어 있지 않은 경우에는 sh로 접속할 수 있습니다.
kubectl exec -it multi-container-pod -c nginx-container -- /bin/sh
예를 들어, 다음과 같은 멀티 컨테이너 파드가 있다고 가정해 보겠습니다.
apiVersion: v1
kind: Pod
metadata:
name: multi-container-pod
spec:
containers:
- name: nginx-container
image: nginx
- name: log-collector
image: busybox
command: ["sh", "-c", "while true; do echo 'Logging...'; sleep 10; done"]
이 파드에서 nginx-container에 접속하려면 다음과 같이 명령어를 실행합니다.
kubectl exec -it multi-container-pod -c nginx-container -- /bin/bash
log-collector 컨테이너에 접속하려면:
kubectl exec -it multi-container-pod -c log-collector -- /bin/sh
이렇게 하면 해당 컨테이너에 접속하여 쉘을 통해 작업할 수 있습니다.
파드는 컨테이너의 CPU, 메모리 등의 리소스를 제한하거나 요청할 수 있습니다. 리소스 제한을 설정하면 컨테이너가 과도한 자원을 사용하지 않도록 제어할 수 있습니다.
다음은 리소스 제한을 설정한 파드의 YAML 파일 예시입니다.
apiVersion: v1
kind: Pod
metadata:
name: resource-pod
spec:
containers:
- name: nginx
image: nginx
resources:
limits:
memory: "512Mi"
cpu: "500m"
requests:
memory: "256Mi"
cpu: "250m"
또한, 파드 내에서 컨테이너의 환경 변수를 설정하여 애플리케이션에 전달할 수 있습니다.
apiVersion: v1
kind: Pod
metadata:
name: env-pod
spec:
containers:
- name: nginx
image: nginx
env:
- name: ENV_VAR
value: "Hello Kubernetes!"
파드는 배포 후 언제든지 삭제할 수 있습니다. 파드를 삭제하는 방법은 다음과 같습니다.
kubectl delete pod nginx-pod
파드를 삭제하면, 해당 파드에 포함된 모든 컨테이너도 함께 삭제됩니다. 이를 통해 쿠버네티스는 유연하게 리소스를 관리할 수 있습니다.
오늘은 쿠버네티스 파드의 기본 개념과 실습을 통해 파드를 생성하고 관리하는 방법을 배웠습니다. 파드는 쿠버네티스에서 가장 기본적인 리소스이면서도 중요한 역할을 합니다. 파드의 기능을 이해하고 활용하면 쿠버네티스에서 애플리케이션을 보다 효율적으로 운영할 수 있습니다.
이번 강의를 통해 파드의 기초적인 개념부터 실습까지 배운 내용을 실제 환경에서 적용해보시길 바랍니다.