Kubernetes Patterns - 설정 패턴

Ryu·2022년 5월 17일
0

kubernetes-patterns

목록 보기
2/3

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

설정 패턴

애플리케이션 설정을 위한 이미지 변경을 최소화 하고 싶다. 어떻게 할 수 있을까?

EnvVar 설정

애플리케이션의 설정을 위해서 하드 코딩하지 않고 환경 변수를 사용하는 것.

  • 12 Factor App
  • 간단 & 모든 운영체제에서 지원 & 모든 언어에서 지원

예제

apiVersion: v1
kind: Pod
metadata:
  name: random-generator
spec:
 containers:
 - image: k8spatterns/random-generator:1.0
   name: random-generator
   env:
   - name: LOG_FILE
     value: /tmp/random.log
   - name: PATTERN
     valueFrom:
       configMapKeyRef:
         name: random-generator-config
         key: pattern
   - name: SEED
     valueFrom:
       secretKeyRef:
         name: random-generator-secret
         key: seed

단점

  • 소규모 변수와 간단한 설정에만 적합
  • 다른 위치에서 재정의되지 않았는지 확신 X
  • 환경 변수가 많아지고 선언되는 곳이 단편화되면 디버깅 어려움
  • 애플리케이션 시작하기 전에만 변수 설정 가능 (Hot reload X)
    • 설정에 불변성(정의된 상태 유지. 새로운 애플리케이션은 새로운 설정으로)은 이점이기도 함.

설정 자원 (Configuration Resource)

Config Map

환경 변수로 사용되거나 볼륨의 형태로 마운트되어 사용될 수 있음

예제

apiVersion: v1
kind: ConfigMap
metadata:
  name: random-generator-config
data:
  PATTERN: Configuration Resource
  application.properties: |
    # Random Generator config
    log.file=/tmp/generator.log
    server.port=7070
  EXTRA_OPTIONS: "high-secure,native"
  SEED: "432576345
---
apiVersion: v1
kind: Pod
metadata:
  name: random-generator
spec:
  containers:
    envFrom: 
    - configMapRef:
      name: random-generator-config
      prefix: CONFIG_ 
---
apiVersion: v1
kind: Pod
metadata:
  name: random-generator
spec:
  containers:
  - image: k8spatterns/random-generator:1.0
    name: random-generator
  volumeMounts:
  - name: config-volume
    mountPath: /config
  volumes:
  - name: config-volume
    configMap:
    name: random-generator-config

Secret

  • 데이터가 Base64로 인코딩됨
  • 자신에게 접근하는 파드가 실행중인 노드에만 배포됨
  • tmpfs의 메모리에 저장되고 접근하는 파드들이 제거될 때 함께 사라짐
  • Etcd에 암호화된 형태로 저장됨

단점

  • 1MB의 크기제한
  • 네임스페이스당 사용할 수 있는 컨피그맵 수 (Quota) 설정 가능 → 무분별한 생성 지양

불변 설정 (Immutable Configuration)

컨피그를 이미지로 관리한다

  • 컨피그에 대한 버전관리 가능
  • 클러스터에 접근하지 않아도 설정 확인 가능
  • 컨테이너 이미지 안에 있는 설정을 직접 변경 불가능 → 항상 알려진 상태 유지
  • 환경 변수, 컨피그맵에 넣을 수 없는 대규모 설정
  • 데이터만 있는 이미지는 만들기가 쉽다

예제

FROM busybox
ADD dev.properties /config-src/demo.properties
ENTRYPOINT [ "sh", "-c", "cp /config-src/* $1", "--" ] 
initContainers:
- image: k8spatterns/config-dev:1
  name: init
  args:
  - "/config"
  volumeMounts:
  - mountPath: "/config"
    name: config-directory
containers:
- image: k8spatterns/demo:1
  name: demo
  ports:
  - containerPort: 8080
    name: http
    protocol: TCP
  volumeMounts:
  - mountPath: "/config"
    name: config-directory
volumes:
- name: config-directory
  emptyDir: {}

설정 템플릿 (Configuration Template)

대규모 설정파일이 있고 실행환경에 따라 큰 차이가 없을 때, 컨피그 맵을 사용할 경우 반복/중복 문제가 생기는 것을 피할 수 있음.

실행 흐름

  1. 초기화 컨테이너가 Template 프로세서를 실행
    1. Template 처리기는 이미지에서 template을 가져오고,
    2. 마운트된 ConfigMap 볼륨에서 template 파라미터를 가져와서 emptyDir에 결과 저장
  2. 애플리케이션 컨테이너가 설정을 읽음

0개의 댓글