K8s

포드 (Pod)

Tech Crunchy 2025. 3. 31. 00:28
728x90

개요

쿠버네티스는 포드라는 단위로 컨테이너를 묶어서 관리합니다. 일반적으로 포드는 하나가 아닌 여러 개의 컨테이너로 구성됩니다. 포드 내 구성된 컨테이너는 모두 하나의 노드 안에서 실행됩니다.

 

아래 이미지와 같이 하나의 포드가 있을 때, 포드 내 컨테이너는 웹 서버, 로그 수집기, 볼륨 컨테이너라는 각각의 역할을 가질 수 있습니다. 포드 내 컨테이너는 포드 IP(192.168.10.10)를 공유합니다. 외부에서 포드에 접근할 때는 포드 IP(192.168.10.10)로 접근합니다. 컨테이너에 접근할 때는 컨테이너마다 설정된 포트로 접근합니다.

 

생성

아래 pod.yaml은 기본적 포드를 생성하기 위한 템플릿입니다.

apiVersion: v1
kind: Pod
metadata:
  name: {포드 이름}
  labels:
    app: {식별용 레이블}
spec:
  containers:
  - name: {컨테이너 이름}
    image: {이미지 경로}
    ports: 
    - containerPort: {포트}

 

아래 명령으로 포드를 생성할 수 있습니다.

kubectl apply -f pod.yaml

 

생명 주기

생성부터 삭제까지의 포드 생명 주기가 있습니다.

  • Pending: 쿠버네티스 시스템에서 포드를 생성 중인 상태
  • Running: 포드 내 모든 컨테이너가 실행 중인 상태 (1개 이상의 컨테이너가 재시작 중일 수 있음)
  • Succeeded: 포드 내 모든 컨테이너가 정상 실행 또는 종료된 상태
  • Failed: 포드 내 컨테이너가 정상 실행 또는 종료되지 않은 상태
  • Unknown: 포드 내 상태를 확인할 수 없는 상태

 

포드 인프라 컨테이너

쿠버네티스 포드에는 항상 실행되는 pause라는 컨테이너가 존재합니다. pause는 포드 내 기본 네트워크로 실행되며, 프로세스 식별자가 1(PID 1)로 설정됩니다. 포드 안에서 다른 컨테이너의 부모 컨테이너 역할을 하며, 컨테이너는 pause 컨테이너가 제공하는 네트워크를 공유하여 사용합니다.

 

스태틱 포드 (Static Pod)

kube-apiserver를 통하지 않고 kubelet이 직접 실행하는 포드를 스태틱 포드라 합니다. kubelet이 직접 관리하는 포드로 kubelet이 실행 중인 노드에서만 실행되고 다른 노드에서는 실행되지 않습니다. kube-apiserver로는 스태틱 포드를 조회할 수 있지만 스태틱 포드에 어떠한 명령을 실행할 수는 없습니다.

 

CPU, Memory 제한

.requests와 .limits필드를 통해 포드 내 컨테이너가 CPU와 Memory를 얼마나 사용할 수 있을지 설정할 수 있습니다.

.requests는 최소 자원 요구량을 의미합니다. 포드가 실행될 때 요구되는 최소 자원을 나타내며, 만약 클러스터 내 여유 자원이 없다면 자원이 생길 때까지 Pending 상태로 대기합니다.

.limits는 최대로 자원을 얼마까지 사용할 수 있는지를 제한하는 설정입니다. 제한이 없다면 포드 내 컨테이너는 상황에 따라 노드의 모든 자원을 사용할 수 있습니다.

  • .spec.containers.resources.requests.cpu
  • .spec.containers.resources.requests.memory
  • .spec.containers.resources.limits.cpu
  • .spec.containers.resources.limits.memory
apiVersion: v1
kind: Pod
metadata:
  name: {포드 이름}
  labels:
    app: {식별용 레이블}
spec:
  containers:
  - name: {컨테이너 이름}
    image: {이미지 경로}
    ports: 
    - containerPort: {포트}
    resources:
      requests:
        cpu: {최소 요구 cpu}
        memory: {최소 요구 memory}
      limits:
        cpu: {최대 사용 가능 cpu}
        memory: {최대 사용 가능 memory}

 

쿠버네티스는 포드를 스케줄링할 때 현재의 실제 자원사용량이 아닌 .requests와 .limits를 확인합니다. 

 

포드 구성 패턴

포드 내 다수의 컨테이너를 구성하여 실행할 때 몇 가지 패턴을 적용해 볼 수 있습니다.

구글에서는 수년간 컨테이너를 운영해 온 경험을 정리한 '컨테이너 기반 분산 시스템 디자인 패턴'을 공개했습니다.

  • 사이드카 패턴: 기본 컨테이너의 기능 확장을 위해 컨테이너를 추가하는 패턴. 기본 컨테이너는 원래 기능에 충실하고, 추가 컨테이너는 부가 기능을 제공하여 컨테이너의 재사용성을 높일 수 있음
  • 앰배서더 패턴: 포드 내 프록시 역할을 하는 컨테이너를 추가하는 패턴. 포드는 프록시 컨테이너를 통해 외부와 통신하기 때문에 더 세밀하게 트래픽을 제어할 수 있음
  • 어댑터 패턴: 포드 외부로 노출되는 정보를 표준화하는 어댑터 컨테이너를 사용하는 패턴

 

참고문헌

728x90

'K8s' 카테고리의 다른 글

kube-proxy  (0) 2025.04.20
서비스 (Service)  (0) 2025.04.20
컨트롤러 (Controller)  (0) 2025.03.31
K8s Cluster 구조  (0) 2025.03.29
kubectl  (0) 2025.03.29