Principles of Container-based Application Design

LEE EUI JOO·2023년 2월 17일
0

K8S

목록 보기
1/16


  1. Single concern principle (SCP)
    : container 1개에는 1개의 process 만

  2. High observability principle (HOP)
    : app readiness / health check API 제공, log를 stdout, stderr 로 뿌리기

  3. Life-cycle conformance principle (LCP)
    : SIGTERM 처리 필요, PreStop, PostStart 활용.

  4. Image immutability principle (IIP)
    : dev/test/prod 에 모두 같은 이미지 사용하지만, conf 만 다르게 해야한다.

  5. Process disposability principle (PDP)
    : 상태를 외부화하거나 분산시켜야하며 응용 프로그램을 시작하고 종료하는 것이 빨라야한다.

  6. Self-containment principle (S-CP)
    : 모든 디펜던시는 빌드타임에 이미지에 담고, 환경에 따라 다른 정보는 런타임시에 configMap, Storage에 담을 것

  7. Runtime confinement principle (RCP)
    : 컨테이너 app이 필요한 CPU / MEM / Disk 에 대해 고려되어야 함.


1. Log 는 stdout / stderr 로 뿌리자

  • Docker 에 log를 관리해주는 기능이 있다.

    • file 로 쌓아줌
    • Rotate
    • json 파싱
    • docker CLI 로 log 확인도 가능
  • k8s / Mesos 도 이 기능을 활용한 기능들을 제공

    • container 안에서 file로 로그를 쌓게되면 컨테이너 종료 혹은 삭제시 로그가 유실됨

    • log 사이즈가 커지면 DiskFull 이 발생해 해당 호스트 서버가 죽는 일이 일어날 수 가 있음

      • 같은 호스트에 수월하게 돌고 있는 다른 컨테이너들도 죽을 수 있음
    • 반드시 파일로 쌓아야 할 경우에는 volume attach 해서 쌓을 것


2. 컨테이너 헬스체크와 트래픽을 보내도 되는지 확인 할 수 있는 API를 제공해야 한다

liveness

  • fail 하면 컨테이너가 비정상으로 인지하고 죽이는데, 없으면 auto fail over를 하지 못한다

readness

  • ok를 체크하면 컨테이너 서비스가 준비가 된 것으로 인지하고 트래픽을 흘려보내기 시작한다(k8s)

3. 컨테이너에는 플랫폼에서 오는 이벤트에 반응하여 준수하는 방법이 있어야 한다

  • app 이 SIGTERM 을 받았을 때 처리하던 task 를 마무리하고 종료하도록 처리해준다.

  • 무중단 배포를 위한 필수 사항 중 하나이다.

  • docker 가 컨테이너를 죽일 때 SIGTERM 을 먼저 주고 SIGKILL 을 통해 죽인다.

  • 이때, sigterm SIGTERM 에 대한 처리가 없으면 앱은 처리하던 task를 내팽개치고 죽어버린다.


4. 컨테이너 1개에는 가급적 단일 목적 1개 프로세스만 띄운다

  • init 프로세스가 종료되면 나머지도 다 죽는다

  • 프로세스 별 health check 도 어렵다

  • 프로세스 별 / 목적별 배포가 분리 될 수 있다.

  • SINGLE CONCERN PRINCIPAL 대로 설계하면 컨테이너 이미지 재사용이 높아진다.

  • 운영이 편리하고 성능 병목이나 이슈 파악이 용이하다.


5. 모든 배포 환경에 사용되는 이미지는 동일해야한다.

  • Build Time 에선 이미지에 담고 run time 에 필요한건 configMap, Storage, Secret 에 담을 것

  • prod 환경과의 유사성을 최대한 보장한다.

  • 동적인 설정이나 정보는 configMap, Storage, Secret 으로 전달

멀티 스테이지 빌드 - 이미지를 가볍게 이용 가능


6. 적절한 Resource Request / Limit 설정을 반드시 확인할 것

  • 설정하지 않으면 최소값으로 설정되어 가장 후순위 프로세스가 된다.

  • 호스트 서버에 남는 자원을 사용해서 동작하기 때문에 실서비스 전에는 문제가 없어보이지만, 서버에 부하를 받기 시작하면 다른 프로세스에 밀려 느려지거나 OOM 으로 가장 먼저 정리된다.


7. 컨테이너화된 애플리케이션은 가능한 한 임시적이어야 하며 언제든지 다른 컨테이너 인스턴스로 대체될 준비가 되어있어야 한다

  • 개별 컨테이너는 세션 정보 등 상태(state)를 가지면 안된다(외부화 / 분산)

  • 컨테이너 애플리케이션은 언제든 종료되고 다시 시작 될 수 있다는 가정하에 개발해야한다.

  • 애플리케이션의 시작 과 종료는 빨라야 한다.

profile
무럭무럭 자라볼까

0개의 댓글