개요
쿠버네티스는 포드라는 단위로 컨테이너를 묶어서 관리합니다. 일반적으로 포드는 하나가 아닌 여러 개의 컨테이너로 구성됩니다. 포드 내 구성된 컨테이너는 모두 하나의 노드 안에서 실행됩니다.
아래 이미지와 같이 하나의 포드가 있을 때, 포드 내 컨테이너는 웹 서버, 로그 수집기, 볼륨 컨테이너라는 각각의 역할을 가질 수 있습니다. 포드 내 컨테이너는 포드 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를 확인합니다.
포드 구성 패턴
포드 내 다수의 컨테이너를 구성하여 실행할 때 몇 가지 패턴을 적용해 볼 수 있습니다.
구글에서는 수년간 컨테이너를 운영해 온 경험을 정리한 '컨테이너 기반 분산 시스템 디자인 패턴'을 공개했습니다.
- 사이드카 패턴: 기본 컨테이너의 기능 확장을 위해 컨테이너를 추가하는 패턴. 기본 컨테이너는 원래 기능에 충실하고, 추가 컨테이너는 부가 기능을 제공하여 컨테이너의 재사용성을 높일 수 있음
- 앰배서더 패턴: 포드 내 프록시 역할을 하는 컨테이너를 추가하는 패턴. 포드는 프록시 컨테이너를 통해 외부와 통신하기 때문에 더 세밀하게 트래픽을 제어할 수 있음
- 어댑터 패턴: 포드 외부로 노출되는 정보를 표준화하는 어댑터 컨테이너를 사용하는 패턴
참고문헌
- Design patterns for container-based distributed systems
- https://kubernetes.io/
'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 |