kubernetes

Multi Container Pod

쿠버네티스에서 배포가능한 가장 작은 단위가 POD입니다. 하나의 POD에 여러개의 Container를 띄우는 것을 Multi Container Pod라고 합니다. 같은 POD에서 사용되는 Container들은 논리적/물리적으로 같은 환경이라고 할 수 있습니다.(같은 노트북으로 여러개의 도커를 띄우는 것과 같습니다.)

하나의 container는 하나의 프로세스를 다뤄야 합니다. 물론 하나의 container에서 여러개의 프로세스를 실항하는 것이 가능은 합니다. 하지만 여러개의 프로세스들의 상태를 확정하기가 어려워집니다.(2개의 프로세스 중 하나가 죽으면 정상일 수도 있고 비정상 일 수도 있습니다.) 이러한 이유로 container에서 여러개의 프로세스를 실행하는 것을 지양하고, 하나의 Pod에서 여러개의 container을 사용(Multi Container Pod)하는 것을 지향합니다.

실습

단순하게 yaml파일에서 containers 내부에서 2개의 image를 적어주면 하나의 pod에서 2개의 컨테이너를 실행할 수 있습니다. 아래는 하나의 Pod에서 nginx와 server 컨테이너를 띄우는 예시입니다.

yaml
apiVersion: v1
kind: Pod
metadata:
  name: double-application
spec:
  containers:
    - name: nginx-container
      image: nginx
    - name: backend-container
      image: backend:v0.1

위와 같이 리스트 목록으로 컨테이너를 추가해주면 동시에 실행이 됩니다. 아래와 같이 nginx 설정은 같은 머신에 있다고 고려하고 작성해 주면됩니다.

nginx
server {
  listen 80;
  location/ {
    proxy_pass http://127.0.0.1:8000;
    proxy_set_header Host $host;
    proxy_set_header X-Remote $remote_addr;
  }
}

nginx에서 server를 호출하고록 설정하였고, 같은 저장소를 바라볼 수 있도록 설정해 주었습니다.

Pod Phase with Multi Container

하나의 pod에 여러 개 container가 포함되는 경우에 대한 Phase는 Running/Succeeded/Failed로 총 세가지로 나누어 집니다. 각각에 대한 설명은 아래와 같습니다.

Running

  • 하나 이상 컨테이너가 실행중이면 Running 상태입니다.
  • 예를 들어서 3개의 컨테이너 노드에 실행중이라고 가정해 봅시다. 이 경우에 3개 중 하나만 정상이라도 Running 상태입니다.

Succeeded

  • 모든 컨테이너가 다 성공 종료 시 Succeeded 상태입니다.

Failed

  • 모든 컨테이너가 종료되었고 단 하나라도 비정상 종료가 있는 경우 Failed 상태입니다.

Restart Policy (재시작 정책)

Multi Container의 경우에 재시작 정책(Always/OnFailure/Never)에 대해 알아봅시다. 기본적으로 다른 설정이 없으면 Always 상태입니다. 파드 내부에 2개 이상의 컨테이너가 실행되는 경우입니다.

Always

  • 모든 컨테이너가 실행되어야 하는 경우로 Error가 하나라도 발생하면 안되는 경우입니다. 따라서 컨테이너가 종료된다면 바로 재시작을 합니다.

OnFailure

  • 특정 컨테이너에서 작업 종료가 필요한 경우에 사용합니다. 보통은 배치 작업 후에 종료 필요 시에 사용하게 됩니다. 실패한 컨테이너는 재시작을 하지만, 정상 종료 된다면 재시작을 하지 않습니다.

Never

  • 컨테이너를 재시작 하지 않는 정책입니다. 종료 된 상태를 확인하고, 그에 따른 별로 처리가 필요한 경우에 사용합니다. 보통은 잘 사용되지 않습니다.