본문 바로가기

devops/k8s

Go template을 이용한 helm value.yaml 값 매핑하는 방법

헬름을 이용해서 배포 환경을 문서화하는 작업을 할 때, 배포하는 서비스의 구성요소 설정을 어떻게 구성하는 것이 좋은지에 대한 고민이 많이 들었다. 처음에는 nginx의 헬름차트 구성이 어떻게 되어있는지를 살펴보고 단일 차트에 대한 설정에 대해서 감을 잡고 go template을 어떻게 사용하는지에 대한 예시를 보면서 학습을 하였다. go를 사용하지 않아서 처음 보는 템플릿 표현 방식에 대해서 정리를 해보았다.

Go template을 이용한 설정값 매핑하기

헬름의 차트의 값들은 value.yaml에 정의된다. 정의 값은 go template을 이용해서 templates 안에 존재하는 쿠버네티스 컴포넌트에 반영된다. 프로젝트를 진행하면서 알게된 helm에서 Go template 사용법을 몇가지 소개한다.

1:1 값 매핑하기

우선 value.yaml이 다음과 같이 설정되어 있다고 가정하자. 배포하는 서비스의 이름과 포트로 구성된 간단한 설정이다.

name의 값을 매핑하고 싶다면 {{ .Values.name }}이런 표현식을 사용하면 된다. Values는 values.yaml을 지징하는 변수이고 yaml에 지정한 값의 경로에 따라서 템플릿을 수정하면된다.

예시
  • value.yaml
name: hello world
port: 80
  • templates/xxx.yaml
spec:
  containers:
    - name: {{ .Values.name }}
    ...

if 조건에 따른 구성 설정하기

특정 조건에 부합하는 경우에만 랜더링하는 방식을 제공한다. 배포 환경에 따라서 kubernetes의 서비스의 타입을 다르게 설정하고 싶은 경우가 있어서 이 방식을 활용했다.

예시

다음은 local인 경우에는 nodeport 방식을 그렇지 않은 경우에는 clusterIp 방식을 사용하는 예제이다.

  • value.yaml
profile: local
  • templates/xxx.yaml
spec:
  {{- if eq .Values.profile "local" }}
  type: NodePort
  {{- else }}
  type: ClusterIP
  {{- end }}

예시에서 사용된 eq와 같은 비교 연산자는 eq, ne, lt, le, gt, ge를 제공한다.

반복적인 값 적용하기

range를 활용하면 반복적인 코드를 입력할 수 있다. go template에서는 range라는 키워드를 사용해서 이러한 기능을 제공한다.

예시
  • value.yaml
envs:
  - name: USERNAME
    value: root
  - name: PASSWORD
    value: 1234
  • templates/xxx.yaml
envs:
  {{- range .env }}
  {{ .name }}: {{ .value  }}
  {{- end }}
  • 랜더링 결과
envs:
  USERNAME: root
  PASSWORD: 1234

설정값을 그대로 이식하기

위의 예시는 values.yaml에 설정한 설정값을 그대로 이식을 해서 사용을 할 수 있는 케이스이다. go template에서는 이런 방식을 사용할 수 있는 템플릿 메서드 toYaml을 제공한다.

예시
envs:
  {{- toYaml .Values.env | nindent 2 }}

파이프(|)는 Go 템플릿에서 함수 체이닝을 위해 사용한다. 왼쪽의 값을 오른쪽 함수의 입력으로 전달한다.

nindent는 템플릿 함수로, 출력되는 텍스트에 줄바꿈 후 지정된 수의 공백을 추가한다. nindent는 일반적으로 줄바꿈을 포함한 텍스트를 들여쓰기할 때 유용하다.

with 키워드를 사용하면 반복되는 표현식을 특정 블럭 안에서 짧게 표현할 수 있다.

{{- with .Values.env  }}
envs:
  {{- toYaml . | nindent 2 }}
{{- end }}

참고

go template 공식 문서