서브차트와 전역 값
서브차트와 전역 값 (Subcharts and Global Values)
이 문서는 차트의 의존성인 서브차트와 전역 값(global values)을 다뤄요. 서브차트 만들기, 부모 차트의 값 오버라이드, 전역 값 사용, 서브차트와 템플릿 공유를 설명해요.
출처: 문서
본문
지금까지는 하나의 차트로만 작업했어요. 하지만 차트는 서브차트라고 불리는 의존성을 가질 수 있으며, 서브차트도 자신의 값과 템플릿을 가져요. 이 섹션에서는 서브차트를 만들고 템플릿 안에서 값에 접근하는 다양한 방법을 볼 거예요.
코드로 들어가기 전에 애플리케이션 서브차트에 대해 배워야 할 몇 가지 중요한 세부 사항이 있어요.
-
서브차트는 "독립적(stand-alone)"으로 간주돼요. 즉, 서브차트는 부모 차트에 명시적으로 의존할 수 없어요.
-
그 때문에 서브차트는 부모의 값에 접근할 수 없어요.
-
부모 차트는 서브차트의 값을 오버라이드할 수 있어요.
-
Helm에는 모든 차트가 접근할 수 있는 전역 값의 개념이 있어요.
이러한 제한은 표준화된 헬퍼 기능을 제공하도록 설계된 라이브러리 차트에는 모두 반드시 적용되지는 않아요.
이 섹션의 예시를 진행하면서 이러한 개념의 많은 부분이 더 명확해질 거예요.
서브차트 만들기 (Creating a Subchart)
이 연습들을 위해 이 가이드의 시작에서 만든 mychart/ 차트로 시작해 그 안에 새 차트를 추가할 거예요.
$ cd mychart/charts
$ helm create mysubchart
Creating mysubchart
$ rm -rf mysubchart/templates/*
이전과 마찬가지로 처음부터 시작하기 위해 모든 기본 템플릿을 삭제했다는 것에 주목하세요. 이 가이드에서는 템플릿이 어떻게 작동하는지에 초점을 맞추고, 의존성 관리는 다루지 않아요. 하지만 차트 가이드에는 서브차트가 어떻게 작동하는지에 대한 더 많은 정보가 있어요.
서브차트에 값과 템플릿 추가하기 (Adding Values and a Template to the Subchart)
다음으로 mysubchart 차트를 위한 간단한 템플릿과 values 파일을 만들어 봐요. mychart/charts/mysubchart에는 이미 values.yaml이 있어야 해요. 이렇게 설정할게요:
dessert: cake
다음으로 mychart/charts/mysubchart/templates/configmap.yaml에 새 ConfigMap 템플릿을 만들 거예요:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-cfgmap2
data:
dessert: {{ .Values.dessert }}
모든 서브차트는 독립적인 차트이므로 mysubchart를 단독으로 테스트할 수 있어요:
$ helm install --generate-name --dry-run --debug mychart/charts/mysubchart
SERVER: "localhost:44134"
CHART PATH: /Users/mattbutcher/Code/Go/src/helm.sh/helm/_scratch/mychart/charts/mysubchart
NAME: newbie-elk
TARGET NAMESPACE: default
CHART: mysubchart 0.1.0
MANIFEST:
---
# Source: mysubchart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: newbie-elk-cfgmap2
data:
dessert: cake
부모 차트에서 값 오버라이드하기 (Overriding Values from a Parent Chart)
원래 차트인 mychart는 이제 mysubchart의 부모 차트예요. 이 관계는 전적으로 mysubchart가 mychart/charts 안에 있다는 사실에 기반해요.
mychart가 부모이므로 mychart에서 구성을 지정하고 그 구성을 mysubchart로 밀어 넣을 수 있어요. 예를 들어 mychart/values.yaml을 이렇게 수정할 수 있어요:
favorite:
drink: coffee
food: pizza
pizzaToppings:
- mushrooms
- cheese
- peppers
- onions
mysubchart:
dessert: ice cream
마지막 두 줄에 주목하세요. mysubchart 섹션 안의 모든 지시문은 mysubchart 차트로 보내져요. 그래서 helm install --generate-name --dry-run --debug mychart을 실행하면 보게 될 것 중 하나가 mysubchart ConfigMap이에요:
# Source: mychart/charts/mysubchart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: unhinged-bee-cfgmap2
data:
dessert: ice cream
최상위 수준의 값이 이제 서브차트의 값을 오버라이드했어요.
여기서 주목할 중요한 세부 사항이 있어요. 우리는 mychart/charts/mysubchart/templates/configmap.yaml의 템플릿을 .Values.mysubchart.dessert를 가리키도록 바꾸지 않았어요. 그 템플릿의 관점에서 값은 여전히 .Values.dessert에 있어요. 템플릿 엔진이 값을 전달하면서 범위를 설정해요. 그래서 mysubchart 템플릿의 경우 .Values에는 mysubchart에 특정한 값만 사용 가능해요.
하지만 때로는 특정 값들이 모든 템플릿에 사용 가능하길 원할 수 있어요. 이것은 전역 차트 값으로 수행돼요.
전역 차트 값 (Global Chart Values)
전역 값은 정확히 같은 이름으로 어떤 차트나 서브차트에서도 접근할 수 있는 값이에요. 전역은 명시적 선언이 필요해요. 기존 비전역 값을 전역인 것처럼 사용할 수 없어요.
Values 데이터 타입에는 전역 값이 설정될 수 있는 Values.global이라는 예약 섹션이 있어요. mychart/values.yaml 파일에 하나를 설정해 봐요.
favorite:
drink: coffee
food: pizza
pizzaToppings:
- mushrooms
- cheese
- peppers
- onions
mysubchart:
dessert: ice cream
global:
salad: caesar
전역이 작동하는 방식 때문에 mychart/templates/configmap.yaml과 mysubchart/templates/configmap.yaml 둘 다 {{ .Values.global.salad }}로 그 값에 접근할 수 있어야 해요.
mychart/templates/configmap.yaml:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
salad: {{ .Values.global.salad }}
mysubchart/templates/configmap.yaml:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-cfgmap2
data:
dessert: {{ .Values.dessert }}
salad: {{ .Values.global.salad }}
이제 dry run 설치를 실행하면 두 출력에서 같은 값을 볼 수 있어요:
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: silly-snake-configmap
data:
salad: caesar
---
# Source: mychart/charts/mysubchart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: silly-snake-cfgmap2
data:
dessert: ice cream
salad: caesar
전역은 이런 정보를 전달하는 데 유용해요. 다만 올바른 템플릿이 전역을 사용하도록 구성되었는지 확인하려면 약간의 계획이 필요해요.
서브차트와 템플릿 공유 (Sharing Templates with Subcharts)
부모 차트와 서브차트는 템플릿을 공유할 수 있어요. 어떤 차트의 정의된 블록도 다른 차트에서 사용할 수 있어요.
예를 들어 다음과 같이 간단한 템플릿을 정의할 수 있어요:
{{- define "labels" }}from: mychart{{ end }}
템플릿의 라벨이 전역적으로 공유된다는 것을 기억하세요. 따라서 labels 차트는 다른 어떤 차트에서도 포함될 수 있어요.
차트 개발자는 include와 template 사이에서 선택할 수 있지만, include를 사용하는 한 가지 장점은 include가 템플릿을 동적으로 참조할 수 있다는 것이에요:
{{ include $mytemplate }}
위 코드는 $mytemplate을 역참조해요. 반면 template 함수는 문자열 리터럴만 받아들여요.
블록 사용 피하기 (Avoid Using Blocks)
Go 템플릿 언어는 개발자가 나중에 오버라이드되는 기본 구현을 제공할 수 있게 하는 block 키워드를 제공해요. Helm 차트에서 블록은 오버라이드를 위한 최고의 도구가 아니에요. 같은 블록의 여러 구현이 제공되면 선택되는 것이 예측 불가능하기 때문이에요.
대신 include를 사용할 것을 권장해요.