Post

쿠버네티스 세부구성 - Pod

Pod란?

컨테이너를 하나 이상 모아둔 것으로 쿠버네티스 애플리케이션의 최소 단위이다. 여러 개의 컨테이너로 구성된 포도도 있고, 단일 컨테이너로 이루어진 포드도 있다. kubernetes의 kube-apiserver나 core-dns등 master node에서 볼 수 있는 기능들도 다 각자의 POD에서 구성된다.

Pod의 특징

  1. 기본적으로 하나의 파드에는 하나 이상의 컨테이너가 포함되어야하며 다수의 컨테이너도 가능하다.
  2. POD 내의 컨테이너들은 네임스페이스를 공유한다. 네임스페이스를 공유한다는 것은 아래의 것들을 공유한다는 뜻이다.
    • mnt : 격리된 파일 시스템 트리를 만듬
    • pid : pid와 프로세스를 격리하여 namespace가 다른 프로세스끼리 서로 엑세스 불가
    • net : network 리소스의 관련된 정보를 분할 (network interface, iptables)
    • ipc : 프로세스간에 독립적인 통신통로 할당, ipc는 공유메모리, 세마포어 또는 메세지 큐를 말한다.
    • uts : 독립적인 hostname 할당
    • user : uid, gid 분할 격리
  3. 파드는 클러스터에서 배포의 최소 단위이다.

Pod로 그룹화하는 이유

  • Pod 내부 컨테이너간 통신 용이성
    Pod안에서는 네임스페이스를 공유하는데 IP와 PORT도 예외는 아니다. 별도의 POD로 컨테이너 A와 B를 제공한다고 하면 해당 컨테이너로 접속하기 위해 내부 IP나 내부 DNS를 통해서 통신을 해야할 것이다. 이럴 경우 괜히 쓸데없는 통신량만 느는 셈이라 리소스 낭비라고 볼 수 있는데 같은 POD 내에서 제공할 경우 루프백IP나 Localhost를 통한 통신이 가능하여 쓸데없는 트래픽을 줄 일수있다.

  • Pod 내부 컨테이너간의 디스크 볼륨 공유
    다른 컨테이너지만 동일한 볼륨을 공유하기 때문에 파일 공유도 쉬울 뿐더러 별도로 로깅을 위한 공간이 필요할 때 동일한 pod에 특정 위치에 log를 적재하게 하고 다른 컨테이너로 해당 위치에 log를 수집하게 운영하면 매우 편해진다.

  • 복제세트 구성의 용이성
    서비스 구성의 최소 단위를 POD로 꾸려놓고 해당 POD의 개수를 2개 이상으로 일정하게 유지하게 되면 한 개의 POD가 예기치못한 문제로 인해 꺼진다고 하더라도 다른 POD에서 서비스를 제공 할 수 있기 때문에 내장애성이 생긴다. 이렇게 POD를 서비스 세트의 기본 구성으로 해두면 복제세트로 만들기 편하다

Pod 안의 컨테이너 배치를 적절히 하면 위의 내용과 같이 효과적인 리소스를 사용할 수 있다.
이런 방법은 미리 사용해본 이들에 의해 몇가지 패턴화 되어있어서 해당 패턴을 사용하면 개발자가 원하는 형태로 구현하기 매우 쉽다. 이러한 패턴 역시 차후에 추가적으로 알아보겠다.

Pod를 만드는 법

kubectl을 통해서 직접 kube-apiserver로 요청을 보낼 수도 있겠지만 일반적으로 product 환경에선는 YAML 파일을 이용하여 만들게 된다. YAML 파일을 이용해서 만들게되면 한번에 여러개를 만들수도있고, 유지보수도 쉽다. 다음은 예시 중 한 개로 이미 받아둔 NGINX 최신 IMAGE를 container로 만들어 kubernetes에 pod로 만드는 YAML 파일이다. 80번 포트를

1
2
3
4
5
6
7
8
9
10
11
apiVersion: v1
kind: Pod
metadata:
  name: my-nginx-pod
spec:
  containers:
  - name: my-nginx-container
    image: nginx:latest
    ports:
    - containerPort: 80
      protocol: TCP

Pod의 생명주기

이러한 Pod도 생명주기를 가지는데 해당 주기는 아래와 같다.

  • Pending
    클러스터 내 파드가 생성되었지만 아직 내부의 컨테이너가 완전히 구동되기 전이며, 아직 노드에 배치되지 않은 상태다.

  • Running
    파드가 클러스터의 특정 노드에 배치되었으며 내부의 모든 컨테이너가 생성 완료된 상태다. 하나 이상의 컨테이너가 구동되기 시작했거나 시작되는 중이다.

  • Succeeded
    파드 안의 컨테이너가 유한한 수의 작업을 실행한 후 종료되도록 설계되었을 때에만 볼 수 있다. 이 경우는 파드에 있는 모든 컨테이너가 해당 작업을 정상적으로 마치고 종료된 것이다.

  • Failed
    역시 파드 안의 컨테이너가 유한한 수의 작업을 실행한 후 종료되도록 설계되었을 때에만 볼 수 있다. 이 경우는 파드에 있는 컨테이너 중 하나 이상이 비정상 종료되었을 때 발생한다.

참고 자료

This post is licensed under CC BY 4.0 by the author.