티스토리 뷰

반응형

helm chart 를 이용해서 구성하다보면, 환경설정을 파일로 따로 관리하고 이를 로딩하고 싶은 경우가 종종있다.

실제 등록될 kubernetes yaml 의 구성은 configMap 기반으로 하고, 환경설정값에 따라 다른 파일을 include 하고 싶은 경우...

 

파일을 include 하기

아래와 같이 파일을 분리하고, 이를 configMap 에서 로딩한다는 가정을 해보겠다.

공통된 설정값은 ConfigMap 에 정의하고, 환경별로 다른 설정만 따로 관리한다는 개념이다.

 

설정에 따라 다른 설정파일을 분리한 구조

 

apiVersion: v1
kind: ConfigMap
metadata:
  name: airflow-variable
  namespace: airflow-{{ .Values.profile }}
data:
  AIRFLOW__CORE__DEFAULT_TIMEZONE: "Asia/Seoul"
  AIRFLOW__WEBSERVER__DEFAULT_UI_TIMEZONE: "Asia/Seoul"
  AIRFLOW__WEBSERVER__INSTANCE_NAME: "Airflow [{{ .Values.profile }}]"  
{{ printf "configs/%s/config.yaml" .Values.profile | .Files.Get | indent 2 }}

이렇게 하면 values.yaml 의 profile 값에 따라 해당 폴더의 파일을 로딩하는것이 가능하다.

 

하지만, 이렇게 했을때 문제가 "configs/{{ .Values.profile }}/config.yaml" 안에서는 값을 바인딩 할수 없다는 문제가 있다.

쉽게 말해서 configs/dev/config.yaml 의 파일이 아래와 같이 구성되어있다면?

values.yaml 에 airflow.core.max_active_tasks 설정이 존재한다고 해도 값이 바인딩 안되는 문제가 존재한다.

 

- values.yaml

profile: dev
airflow:
  core:
    max_active_tasks: 4

 

- configs/dev/config.yaml

AIRFLOW__CORE__PARALLELISM: 32
AIRFLOW__CORE__MAX_ACTIVE_RUNS_PER_DAG: 6
AIRFLOW__CORE__MAX_ACTIVE_TASKS_PER_DAG: {{ .Values.airflow.core.max_active_tasks }}

 

- 결과물

include 된 파일의 결과는 values 값이 바인딩이 안된 문자열 그대로 출력되는 문제가 있다.

apiVersion: v1
kind: ConfigMap
metadata:
  name: airflow-variable
  namespace: airflow-dev
data:
  AIRFLOW__CORE__DEFAULT_TIMEZONE: "Asia/Seoul"
  AIRFLOW__WEBSERVER__DEFAULT_UI_TIMEZONE: "Asia/Seoul"
  AIRFLOW__WEBSERVER__INSTANCE_NAME: "Airflow [dev]"  
  AIRFLOW__CORE__PARALLELISM: 32
  AIRFLOW__CORE__MAX_ACTIVE_RUNS_PER_DAG: 6
  AIRFLOW__CORE__MAX_ACTIVE_TASKS_PER_DAG: {{ .Values.airflow.core.max_active_tasks }}

 

파일을 include 하고 바인딩까지 되려면?

사실 이 문제는 공식 문서에 잘 다루고 있었다.

https://helm.sh/docs/howto/charts_tips_and_tricks/#using-the-tpl-function

 

아래와 같인 표현한걸

{{ printf "configs/%s/config.yaml" .Values.profile | .Files.Get | indent 2 }}

아래와 같이 tpl 로 표현하면 바인딩처리된 결과를 확인할 수 있다.

{{ tpl (printf "configs/%s/config.yaml" .Values.profile | .Files.Get | indent 2) . }}

즉, 아래와 같이 values.yaml 의 값이 바인딩된 결과를 포함시킬 수 있게 된다.

apiVersion: v1
kind: ConfigMap
metadata:
  name: airflow-variable
  namespace: airflow-dev
data:
  AIRFLOW__CORE__DEFAULT_TIMEZONE: "Asia/Seoul"
  AIRFLOW__WEBSERVER__DEFAULT_UI_TIMEZONE: "Asia/Seoul"
  AIRFLOW__WEBSERVER__INSTANCE_NAME: "Airflow [dev]"  
  AIRFLOW__CORE__PARALLELISM: 32
  AIRFLOW__CORE__MAX_ACTIVE_RUNS_PER_DAG: 6
  AIRFLOW__CORE__MAX_ACTIVE_TASKS_PER_DAG: 4

삽질을 했는데 역시 답은 문서에 있는 경우가 많다.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함