22. Configuration Template

sangyeob·2025년 12월 27일

4부 Configuration Patterns 중 하나로, 이 카테고리의 패턴들은 다양한 환경에서 external configuration을 통해 애플리케이션을 커스터마이징하고 조정하는 것에 대해 다룬다.

22장 Configuration Template은, 여러 환경에서 configuration 파일들이 관리되어야할 때 유용하다.

Intro

Configuration Template 패턴은 애플리케이션 시작 시 크고 복잡한 구성을 생성하고 처리할 수 있게 해준다. 생성된 구성은 템플릿 처리에 사용된 파라미터에 반영된 대로 목표 런타임 환경에 특화된다.

Problem

대형 Configuration 파일은 일반적으로 서로 다른 실행 환경에서 약간만 다른 경우가 많다. 이러한 유사성은 ConfigMap에 많은 중복과 불필요한 반복을 초래하는데, 각 환경이 대부분 동일한 데이터를 가지기 때문이다. 이 장에서 살펴볼 구성 템플릿 패턴은 이러한 특정 유스케이스의 문제들을 해결한다.

Solution

중복을 줄이기 위해서는 데이터베이스 연결 파라미터 같은 차이가 있는 Configuration 값만 ConfigMap에 저장하거나 심지어 환경 변수에 직접 저장하는 것이 합리적이다. 컨테이너 시작 시, 이러한 값들은 Configuration Template과 함께 처리되어 전체 구성 파일을 생성한다.

애플리케이션 초기화 중 템플릿을 처리하는 도구로는 Tiller(Ruby)나 Gomplate(Go) 같은 것들이 있으며, 애플리케이션이 시작되기 전에 완전히 처리된 구성 파일은 다른 구성 파일처럼 직접 사용할 수 있는 위치에 배치된다.

런타임 중에 이러한 실시간 처리가 일어날 수 있는 두 가지 기법이 있다:

  • 템플릿 프로세서를 Dockerfile의 ENTRYPOINT에 추가해서 템플릿 처리가 컨테이너 이미지의 직접적인 부분이 되도록 할 수 있다. 여기서 entrypoint는 일반적으로 먼저 템플릿 처리를 수행한 다음 애플리케이션을 시작하는 스크립트이며, 템플릿 파라미터는 환경 변수에서 가져온다.
  • Kubernetes에서는 초기화를 수행하는 더 나은 방법이 있는데, Pod의 init 컨테이너를 사용하는 것이다. 여기서 템플릿 프로세서가 실행되고 Pod 내 애플리케이션 컨테이너를 위한 Configuration을 생성한다.

애플리케이션의 Pod 정의는 최소 두 개의 컨테이너로 구성된다
1. 템플릿 처리를 위한 init 컨테이너: template processor + Configuration template 포함
2. 애플리케이션 컨테이너

컨테이너 외에도, 두 개의 볼륨을 정의한다.
1. 템플릿 파라미터용 볼륨 (config-map volume)
2. init 컨테이너와 애플리케이션 컨테이너 간에 처리된 Configuration 파일을 공유하기 위한 볼륨 (emptyDir volume)

이러한 상태에서, pod 시작 시 다음과 같이 실행된다
1. init 컨테이너가 시작되고 템플릿 프로세서를 실행한다. 프로세서는 이미지에서 템플릿을 가져오고, 마운트된 ConfigMap 볼륨에서 템플릿 파라미터를 가져와서, 결과를 emptyDir 볼륨에 저장한다.
2. init 컨테이너가 완료된 후, 애플리케이션 컨테이너가 시작되고 emptyDir 볼륨에서 구성 파일을 로드한다.

Discussion

Configuration Template 패턴은 Configuration Resource 패턴 위에 구축되며, 유사한 복잡한 구성으로 다양한 환경에서 애플리케이션을 운영해야 할 때 특히 적합하다.

하지만 Configuration Template을 사용한 설정은 더 복잡하고 잘못될 수 있는 부분이 더 많다. 애플리케이션이 방대한 Configuration data를 필요로 할 때만 사용하는 것이 좋다. (보통 이러한 데이터는 환경에 따라 달라지는 부분은 극히 일부분이다.)

Red Hat OpenShift라는 엔터프라이즈 Kubernetes 배포판 위에서 실행 중이라면, 리소스 디스크립터를 파라미터화하기 위해 OpenShift 템플릿을 사용하는 대안이 있다. 이 접근법은 대형 Configuration set 문제는 해결하지 못하지만, 약간씩 다른 환경에 동일한 배포 리소스를 적용하는 데는 여전히 매우 유용하다.

0개의 댓글