파드(Pod)

쿠버네티스에서 컨테이너 애플리케이션의 기본 단위며, 1개 이상의 컨테이너로 구성된 컨테이너의 집합이다.

도커 컨테이너와 가장 큰 차이점은 여러 리눅스 네임스페이스(namespace)를 공유하는 여러 컨테이너를 추상화된 집합으로 사용한다는 점이다.

예를 들어서 nginx를 실행하는 컨테이너와 nginx 로그를 수집하는 사이드카 컨테이너를 묶어서 하나의 파드로 실행한 경우, 로그 수집 사이드카 컨테이너에 접속해서 curl localhost 명령을 실행해도 nginx에 대한 응답을 확인할 수 있다. 이는 nginx 실행 컨테이너와 사이드카 실행 컨테이너가 같은 네트워크 네임스페이스를 공유하고 있음을 의미한다.

관련 키워드 - init container, ephemeral container

레플리카셋(ReplicaSet)

서비스 환경에서 실제 사용자의 요청을 처리하는 역할을 하는 파드의 경우 성능과 가용성 측면에서 여러개가 필요하다. 단순히 아래 처럼 파드를 이름만 달리해서 아래와 같은 YAML로 생성할 수 있다.

apiVersion: v1
kind: Pod
metadata:
  name: my-nginx-pod-1
spec:
  containers:
  - name: my-nginx-container
    image: nginx:latest
    ports:
    - containerPort: 80
      protocol: TCP
---
apiVersion: v1
kind: Pod
metadata:
  name: my-nginx-pod-2
spec:
  containers:
  - name: my-nginx-container
    image: nginx:latest
    ports:
    - containerPort: 80
      protocol: TCP

이렇게 생성된 파드의 가장 큰 문제점은 해당 파드가 동작하고 있는 쿠버네티스 노드가 죽었을 경우, 파드가 다른 노드에 생성되지 않고 실행되고 있는 파드의 갯수가 1개로 줄어버린다.

레플리카셋은 클러스터내에 실행되어야하는 파드의 갯수를 지정하고, 지정한 갯수가 유지되도록 관리하는 역할을 한다. 레플리카셋은 아래와 같은 YAML로 생성할 수 있다.

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: replicaset-nginx
spec:
  replicas: 3                  # 개수 지정
  selector:
    matchLabels:               # 라벨 셀렉터 대상 라벨
      app: my-nginx 
  template:
    metadata:
      name: my-nginx-pod
      labels:                  # 생성할 파드에 추가할 라벨
        app: my-nginx 
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80

라벨 셀렉터(Label Selector)을 이용해서 클러스터내에 해당 라벨(app: my-nginx )을 가지고 있는 파드의 갯수를 계속 확인하는 매커니즘으로 파드의 갯수를 유지한다.

디플로이먼트(Deployment)

이름 그대로 애플리케이션의 배포, 관리에 대한 역할을 담당한다.