티스토리 뷰

반응형

helm chart 2.x 에서 작업을 했는데, 외부파일에 있는 값을 로딩해서 dict 로 만들고 싶었다.

사실 바인딩될 값은 values.yaml 에 정의해서 쓰는게 자연스러운데, 왜 이런 방법이 필요했냐하면

 

airflow 의 수많은 설정값을 values.yaml 에 선언하게 하는건 너무 장황했다. (너무 많기도 하고)

하지만, executor 타입이나 kerberos 인증 여부에 따라 선언되어야할 pod 구성이 다르기 때문에 조건분기를 해야했고 이를 위해서는 dict 로 로딩해서 사용해야 하는 방법이 필요했다.

 

1. File 을 읽어서 dict 로 만들기

우선 로딩할 파일은 configs/{.Values.profile}/airflow-config.yaml  에 존재한다고 가정했다.

여기서 가장 핵습은 key value 로 파싱한후, 해당 값을 toJson 으로 변환한 결과로 출력하게 구성하고, 실제 호출하는곳에서는 fromJson 을 써서 사용하면 된다. 

 

 

예를 들면, 아래와 같이 사용가능하다.

1.1 chart/templates/_helpers.tpl

{{/*
   chart/{profile}/airflow-config.yaml 설정을 로딩함
   사용할 땐 아래와 같이 사용할 수 있음
   {{ $airflow_config := include "airflow_config" . | fromJson }}
*/}}
{{- define "airflow_config" -}}
{{- $airflow_config := dict -}}
{{- $template := tpl (printf "configs/%s/airflow-config.yaml" .Values.profile | .Files.Get) . -}}
{{- range ( split "\n" $template ) -}}
  {{- if not (. | trim | empty) -}}
    {{- $kv := . | splitn ":" 2 -}}
    {{- $_ := set $airflow_config $kv._0 ($kv._1 | trim | trimAll "\"") -}}
  {{- end -}}
{{- end -}}
{{- toJson $airflow_config -}}
{{- end -}}

 

1.2 chart/configs/dev/airflow-config.yaml (로딩할 파일)

AIRFLOW__CORE__EXECUTOR: "LocalKubernetesExecutor"
AIRFLOW__CORE__SECURITY: "kerberos"
...

1.3 chart/templates/deployment.yaml (사용할 곳)

{{- $airflow_config := include "airflow_config" . | fromJson -}}
{{- $security := default "none" (pluck "AIRFLOW__CORE__SECURITY" $airflow_config | first) -}}
{{- if and (eq "kerberos" $security) -}}
    kerbeors 인증 세팅일때 구성할 값들
{{- end -}}

 

마치며

helm chart 의 go template 에서 return 값을 어떻게 만들어야 하는가? 이 방법을 찾기위해 삽질을 하다가 정리한 코드이다.

default 값을 미지정하면 타입이 안맞다며 오류가 나기도 해서 삽질했는데 예시를 보면 "none" 을 대체값으로 써서 해결했다.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
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
글 보관함