변수
변수 (Variables)
이 문서는 Helm 템플릿에서 변수를 사용하는 방법을 다뤄요. $name 형식의 변수와 := 연산자, with와 range에서의 활용, 그리고 루트 컨텍스트를 가리키는 $ 변수를 설명해요.
출처: 문서
본문
함수, 파이프라인, 객체, 제어 구조를 익혔으니 이제 많은 프로그래밍 언어에서 더 기본적인 개념 중 하나인 변수로 넘어갈 수 있어요. 템플릿에서는 변수가 덜 자주 사용돼요. 하지만 코드를 단순화하고 with와 range를 더 잘 활용하는 방법을 배워볼 거예요.
앞선 예에서 이 코드가 실패한다는 것을 봤어요:
{{- with .Values.favorite }}
drink: {{ .drink | default "tea" | quote }}
food: {{ .food | upper | quote }}
release: {{ .Release.Name }}
{{- end }}
Release.Name은 with 블록에서 제한된 범위 안에 있지 않아요. 범위 지정(스코핑) 문제를 해결하는 한 가지 방법은 현재 범위와 관계없이 접근할 수 있는 변수에 객체를 할당하는 거예요.
Helm 템플릿에서 변수는 다른 객체에 대한 이름 있는 참조예요. $name 형식을 따르며 특별한 할당 연산자인 :=로 할당돼요. 위 코드를 Release.Name에 변수를 사용하도록 다시 쓸 수 있어요.
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
{{- $relname := .Release.Name -}}
{{- with .Values.favorite }}
drink: {{ .drink | default "tea" | quote }}
food: {{ .food | upper | quote }}
release: {{ $relname }}
{{- end }}
with 블록을 시작하기 전에 $relname := .Release.Name을 할당하는 것을 주목하세요. 이제 with 블록 안에서도 $relname 변수는 여전히 릴리스 이름을 가리켜요.
그것을 실행하면 다음이 생성돼요:
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: viable-badger-configmap
data:
myvalue: "Hello World"
drink: "coffee"
food: "PIZZA"
release: viable-badger
변수는 range 루프에서 특히 유용해요. 리스트형 객체에서 인덱스와 값을 모두 캡처하는 데 사용할 수 있어요:
toppings: |-
{{- range $index, $topping := .Values.pizzaToppings }}
{{ $index }}: {{ $topping }}
{{- end }}
range가 먼저 오고, 그다음 변수, 그다음 할당 연산자, 그다음 리스트가 온다는 점에 주의하세요. 이것은 정수 인덱스(0부터 시작)를 $index에, 값을 $topping에 할당해요. 실행하면 다음이 생성돼요:
toppings: |-
0: mushrooms
1: cheese
2: peppers
3: onions
키와 값을 모두 가진 데이터 구조의 경우 range를 사용해 둘 다 얻을 수 있어요. 예를 들어 .Values.favorite를 이렇게 반복할 수 있어요:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
{{- range $key, $val := .Values.favorite }}
{{ $key }}: {{ $val | quote }}
{{- end }}
이제 첫 번째 반복에서 $key는 drink, $val은 coffee가 되고, 두 번째에서는 $key는 food, $val은 pizza가 돼요. 위 코드를 실행하면 다음이 생성돼요:
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: eager-rabbit-configmap
data:
myvalue: "Hello World"
drink: "coffee"
food: "pizza"
변수는 보통 "전역"이 아니에요. 선언된 블록의 범위로 제한돼요. 앞서 템플릿의 최상위 수준에서 $relname을 할당했어요. 그 변수는 전체 템플릿에서 범위 안에 있어요. 하지만 마지막 예에서 $key와 $val은 {{ range... }}{{ end }} 블록 안에서만 범위 안에 있을 거예요.
하지만 항상 루트 컨텍스트를 가리키는 변수가 하나 있어요: $예요. 이것은 range에서 반복하면서 차트의 릴리스 이름을 알아야 할 때 매우 유용해요.
이를 보여주는 예시:
{{- range .Values.tlsSecrets }}
---
apiVersion: v1
kind: Secret
metadata:
name: {{ .name }}
labels:
# 많은 헬름 템플릿이 아래에 `.`을 사용하겠지만, 그것은 작동하지 않아요.
# 하지만 `$`는 여기서 작동해요.
app.kubernetes.io/name: {{ template "fullname" $ }}
# .Chart.Name은 참조할 수 없지만 $.Chart.Name은 할 수 있어요
helm.sh/chart: "{{ $.Chart.Name }}-{{ $.Chart.Version }}"
app.kubernetes.io/instance: "{{ $.Release.Name }}"
# Chart.yaml의 appVersion 값
app.kubernetes.io/version: "{{ $.Chart.AppVersion }}"
app.kubernetes.io/managed-by: "{{ $.Release.Service }}"
type: kubernetes.io/tls
data:
tls.crt: {{ .certificate }}
tls.key: {{ .key }}
{{- end }}
지금까지 한 파일에 선언된 하나의 템플릿만 살펴봤어요. 하지만 Helm 템플릿 언어의 강력한 기능 중 하나는 여러 템플릿을 선언하고 함께 사용하는 능력이에요. 다음 섹션에서 다룰 거예요.