Kubernetes Patterns - 구조패턴

Ryu·2022년 5월 17일
0

kubernetes-patterns

목록 보기
1/3

쿠버네티스 패턴 중 3부(구조패턴), 4부(설정패턴), 5부(고급패턴)을 다룬다.

구조패턴

쿠버네티스의 기본 단위인 Pod를 구조적으로 어떻게 구성할 수 있을까?

초기화 컨테이너 (Init Container)

Pod의 컨테이너를 시작하기 전에 필요한 조건들을 갖추기 위해 Init container를 사용하는 패턴.

  • DB 스키마 설정
  • 애플리케이션 이미지에 포함될 수 없는 도구 및 라이브러리
  • 애플리케이션에서 초기화 작업에 대한 권한이 없을 때, 등

컨테이너 실행 흐름

  • 모든 Init container는 순차적으로 실행되며, 전부 성공적으로 종료되어야 함.
  • 애플리케이션 컨테이너는 병렬로 실행되며 시작 순서는 보장되지 않음.

유의점

  • 작아야 하며, 빠르게 실행되고 성공적으로 완료되어야 함.
  • Pod의 스케쥴링에 영향을 미침.
    • Max ( 초기화 컨테이너 중 resource 요청/제한 제일 큰 것, 모든 애플리케이션 컨테이너의 resources 요청/제한의 합)
    • 자원 요구량이 많은 초기화 컨테이너 + 자원 요구량이 낮은 애플리케이션 컨테이너의 경우라면?

예제

apiVersion: v1
kind: Pod
metadata:
 name: www
 labels:
   app: www
spec:
 initContainers:
 - name: download
   image: axeclbr/git
   command:
   - git
   - clone
   - https://github.com/mdn/beginner-html-site-scripted
   - /var/lib/data
 volumeMounts:
 - mountPath: /var/lib/data
   name: source
 containers:
 - name: run
   image: docker.io/centos/httpd
   ports:
   - containerPort: 80
   volumeMounts:
   - mountPath: /var/www/html
     name: source
 volumes:
 - emptyDir: {}
   name: source

사이드카 (Sidecar)


단일 목적을 갖는 여러 개의 컨테이너들이 서로 협력하도록 구성한다.

  • 한 서비스를 위해서 다른 개발자/언어/환경으로 무언가를 구성해야 할 때
  • 기본 컨테이너의 수정 없이 Pod에 직교성(orthogonal capabilities) 도입

장점

컨테이너들이 언어가 다르거나, 릴리즈 주기가 다른 팀들이 각자 개발할 수 있음
기본 컨테이너를 변경하지 않고 목적에 따라 사이드카 컨테이너를 교체할 수 있음.

예제

  • HTTP 서버 컨테이너는 HTTP를 통해서 파일을 제공하는 것에만 초점을 둔다. 파일이 어디서 어떻게 오는지는 관심 X
  • Git 컨테이너의 목표는 Git서버로부터 로컬 FS로 데이터를 동기화 시키는 것. 동기화된 파일이 이후 어떻게 되는지 관심 X

어댑터 (Adapter)

분산 시스템에서 다른 기술로 만들어진 여러 종류의 컴포넌트(컨테이너)들이 다른 시스템에 이해 통일된 방식으로 처리되어야 할 때.

  • 예를 들어, 여러 서비스를 모니터링 하고 싶은데 어떤 서비스는 프로메테우스가 이해할 수 있는 형식을 노출하지 못함.

예제

apiVersion: apps/v1
kind: Deployment
metadata:
  name: random-generator
spec:
  replicas: 1
  selector:
   matchLabels:
     app: random-generator
   template:
     metadata:
     labels:
       app: random-generator
     spec:
       containers:
       - image: k8spatterns/random-generator:1.0
         name: random-generator
         env:
         - name: LOG_FILE
           value: /logs/random.log
         ports:
         - containerPort: 8080
           protocol: TCP
         volumeMounts:
         - mountPath: /logs
           name: log-volume
      # ---------------------------------------
       - image: k8spatterns/random-generator-exporter
         name: prometheus-adapter
         env:
         - name: LOG_FILE
           value: /logs/random.log
         ports:
         - containerPort: 9889
           protocol: TCP
         volumeMounts:
         - mountPath: /logs
           name: log-volume
         volumes:
         - name: log-volume
           emptyDir: {}

앰배서더 (Ambassador)

애플리케이션 컨테이너들이 외부 의존성에 직접 접근하지 않고, 앰배서더를 통해 접근하는 것.

  • 프록시 패턴이라고도 부른다.

예제


장점

  • 애플리케이션 컨테이너는 비즈니스 로직에 중점을 두고 외부 서비스 이용에 대핸 세부사항을 다른 컨테이너에 위임
  • 앰배서더 컨테이너는 다른 컨테이너들과 결합 가능한, 특수하고 재사용 가능한 것

0개의 댓글