변수

변수 (Variables)

이 문서는 Helm 템플릿에서 변수를 사용하는 방법을 다뤄요. $name 형식의 변수와 := 연산자, withrange에서의 활용, 그리고 루트 컨텍스트를 가리키는 $ 변수를 설명해요.

출처: 문서

본문

함수, 파이프라인, 객체, 제어 구조를 익혔으니 이제 많은 프로그래밍 언어에서 더 기본적인 개념 중 하나인 변수로 넘어갈 수 있어요. 템플릿에서는 변수가 덜 자주 사용돼요. 하지만 코드를 단순화하고 withrange를 더 잘 활용하는 방법을 배워볼 거예요.

앞선 예에서 이 코드가 실패한다는 것을 봤어요:

  {{- with .Values.favorite }}
  drink: {{ .drink | default "tea" | quote }}
  food: {{ .food | upper | quote }}
  release: {{ .Release.Name }}
  {{- end }}

Release.Namewith 블록에서 제한된 범위 안에 있지 않아요. 범위 지정(스코핑) 문제를 해결하는 한 가지 방법은 현재 범위와 관계없이 접근할 수 있는 변수에 객체를 할당하는 거예요.

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 }}

이제 첫 번째 반복에서 $keydrink, $valcoffee가 되고, 두 번째에서는 $keyfood, $valpizza가 돼요. 위 코드를 실행하면 다음이 생성돼요:

# 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 템플릿 언어의 강력한 기능 중 하나는 여러 템플릿을 선언하고 함께 사용하는 능력이에요. 다음 섹션에서 다룰 거예요.

더 알아보기 (Learn more)