시작하기
시작하기 (Getting Started)
이 문서는 Helm 차트 템플릿 가이드의 시작 부분이에요. 차트를 만들고 첫 템플릿을 추가하는 방법을 다뤄요. 이 가이드에서 만든 차트는 가이드 전체에서 계속 사용돼요.
출처: 문서
본문
이 가이드의 이 섹션에서는 차트를 만든 다음 첫 템플릿을 추가할 거예요. 여기서 만든 차트는 가이드의 나머지 부분 전체에서 사용할 거예요.
시작하려면 Helm 차트를 간단히 살펴볼게요.
차트 (Charts)
차트 가이드에 설명된 대로 Helm 차트는 다음과 같이 구조화돼요:
mychart/
Chart.yaml
values.yaml
charts/
templates/
...
templates/ 디렉터리는 템플릿 파일용이에요. Helm이 차트를 평가할 때 templates/ 디렉터리의 모든 파일을 템플릿 렌더링 엔진으로 보내요. 그런 다음 그 템플릿의 결과를 모아 Kubernetes로 보내요.
values.yaml 파일도 템플릿에 중요해요. 이 파일은 차트의 기본 값을 담고 있어요. 이러한 값은 helm install 또는 helm upgrade 중에 사용자가 오버라이드할 수 있어요.
Chart.yaml 파일은 차트에 대한 설명을 담고 있어요. 템플릿 안에서 접근할 수 있어요.
charts/ 디렉터리는 다른 차트(우리가 서브차트라고 부르는 것)를 포함할 수 있어요. 이 가이드의 뒷부분에서 템플릿 렌더링에 관해 그것들이 어떻게 작동하는지 볼 거예요.
시작 차트 (A Starter Chart)
이 가이드를 위해 mychart라는 간단한 차트를 만든 다음, 그 차트 안에 몇 가지 템플릿을 만들 거예요.
$ helm create mychart
Creating mychart
mychart/templates/ 살짝 보기 (A Quick Glimpse of mychart/templates/)
mychart/templates/ 디렉터리를 보면 몇 가지 파일이 이미 있다는 것을 알 수 있어요.
-
NOTES.txt: 차트의 "도움말 텍스트"예요. 사용자가helm install을 실행할 때 표시돼요. -
deployment.yaml: Kubernetes deployment를 만드는 기본 매니페스트예요. -
service.yaml: deployment를 위한 서비스 엔드포인트를 만드는 기본 매니페스트예요. -
_helpers.tpl: 차트 전역에서 재사용할 수 있는 템플릿 헬퍼를 두는 곳이에요.
그리고 우리가 하려는 것은... 그것들을 모두 제거하는 것! 그래야 튜토리얼을 처음부터 진행할 수 있어요. 진행하면서 우리만의 NOTES.txt와 _helpers.tpl을 실제로 만들 거예요.
$ rm -rf mychart/templates/*
프로덕션급 차트를 작성할 때는 이런 기본 버전이 정말 유용할 수 있어요. 그래서 일상적인 차트 작성에서는 그것들을 제거하고 싶지 않을 거예요.
첫 번째 템플릿 (A First Template)
우리가 만들 첫 번째 템플릿은 ConfigMap이에요. Kubernetes에서 ConfigMap은 구성 데이터를 저장하는 객체일 뿐이에요. pod 같은 다른 것들이 ConfigMap의 데이터에 접근할 수 있어요.
ConfigMap은 기본 리소스이므로 시작 지점으로 아주 좋아요.
mychart/templates/configmap.yaml이라는 파일을 만드는 것부터 시작해 봐요:
apiVersion: v1
kind: ConfigMap
metadata:
name: mychart-configmap
data:
myvalue: "Hello World"
TIP: 템플릿 이름은 엄격한 명명 패턴을 따르지 않아요. 하지만 YAML 파일에는 .yaml 확장자를, 헬퍼에는 .tpl 확장자를 사용할 것을 권장해요.
위 YAML 파일은 필요한 최소 필드를 가진 맨 뼈대 ConfigMap이에요. 이 파일이 mychart/templates/ 디렉터리에 있다는 사실 덕분에 템플릿 엔진을 통과할 거예요.
이런 평범한 YAML 파일을 mychart/templates/ 디렉터리에 두는 것은 아주 괜찮아요. Helm이 이 템플릿을 읽으면 그대로 Kubernetes로 보내요.
이 간단한 템플릿으로 이제 설치 가능한 차트가 생겼어요. 그리고 이렇게 설치할 수 있어요:
$ helm install full-coral ./mychart
NAME: full-coral
LAST DEPLOYED: Tue Nov 1 17:36:01 2016
NAMESPACE: default
STATUS: DEPLOYED
REVISION: 1
TEST SUITE: None
Helm을 사용해 릴리스를 검색하고 실제로 로드된 템플릿을 볼 수 있어요.
$ helm get manifest full-coral
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mychart-configmap
data:
myvalue: "Hello World"
helm get manifest 명령은 릴리스 이름(full-coral)을 받아 서버에 업로드된 모든 Kubernetes 리소스를 출력해요. 각 파일은 YAML 문서의 시작을 나타내는 ---로 시작하고, 그다음 이 YAML 문서를 생성한 템플릿 파일을 알려주는 자동 생성 주석 줄이 따라와요.
그다음부터 YAML 데이터가 configmap.yaml 파일에 넣은 것과 정확히 같다는 것을 볼 수 있어요.
이제 릴리스를 제거할 수 있어요: helm uninstall full-coral.
간단한 템플릿 호출 추가하기 (Adding a Simple Template Call)
리소스에 name:을 하드코딩하는 것은 보통 나쁜 관행으로 여겨져요. 이름은 릴리스마다 고유해야 해요. 그래서 릴리스 이름을 삽입해 name 필드를 생성하고 싶을 수도 있어요.
TIP: DNS 시스템의 제한 때문에 name: 필드는 63자로 제한돼요. 그 때문에 릴리스 이름은 53자로 제한돼요. Kubernetes 1.3 이하는 24자로만 제한했어요 (따라서 14자 이름).
configmap.yaml을 그에 따라 수정해 봐요.
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
큰 변화는 이제 {{ .Release.Name }}-configmap인 name: 필드의 값에서 와요.
템플릿 지시문은 {{와 }} 블록으로 둘러싸여요.
템플릿 지시문 {{ .Release.Name }}은 릴리스 이름을 템플릿에 주입해요. 템플릿에 전달되는 값은 네임스페이스된 객체로 생각할 수 있으며, 점(.)이 각 네임스페이스 요소를 구분해요.
Release 앞의 선행 점은 이 범위에 대해 가장 위쪽 네임스페이스에서 시작한다는 것을 나타내요 (범위에 대해서는 잠시 후에 이야기할 거예요). 그래서 .Release.Name을 "위쪽 네임스페이스에서 시작해서 Release 객체를 찾고, 그 안에서 Name이라는 객체를 찾아라"로 읽을 수 있어요.
Release 객체는 Helm의 내장 객체 중 하나이며, 나중에 더 자세히 다룰 거예요. 지금은 이것이 라이브러리가 우리 릴리스에 할당한 릴리스 이름을 표시한다고만 말해도 충분해요.
이제 리소스를 설치하면 이 템플릿 지시문 사용의 결과를 바로 볼 수 있어요:
$ helm install clunky-serval ./mychart
NAME: clunky-serval
LAST DEPLOYED: Tue Nov 1 17:45:37 2016
NAMESPACE: default
STATUS: DEPLOYED
REVISION: 1
TEST SUITE: None
helm get manifest clunky-serval을 실행해 생성된 전체 YAML을 볼 수 있어요.
Kubernetes 안의 ConfigMap 이름이 이전의 mychart-configmap 대신 clunky-serval-configmap인 것에 주목하세요.
이 시점에서 템플릿의 가장 기본적인 형태를 봤어요: {{와 }} 안에 템플릿 지시문이 임베디드된 YAML 파일이에요. 다음 부분에서 템플릿을 더 깊이 살펴볼 거예요. 하지만 넘어가기 전에 템플릿 생성을 더 빠르게 만드는 한 가지 요령이 있어요: 템플릿 렌더링을 테스트하고 싶지만 실제로는 아무것도 설치하지 않으려면 helm install --debug --dry-run goodly-guppy ./mychart을 사용할 수 있어요. 이것은 템플릿을 렌더링해요. 하지만 차트를 설치하는 대신 렌더링된 템플릿을 반환해 출력을 볼 수 있게 해줘요:
$ helm install --debug --dry-run goodly-guppy ./mychart
install.go:149: [debug] Original chart version: ""
install.go:166: [debug] CHART PATH: /Users/ninja/mychart
NAME: goodly-guppy
LAST DEPLOYED: Thu Dec 26 17:24:13 2019
NAMESPACE: default
STATUS: pending-install
REVISION: 1
TEST SUITE: None
USER-SUPPLIED VALUES:
{}
COMPUTED VALUES:
affinity: {}
fullnameOverride: ""
image:
pullPolicy: IfNotPresent
repository: nginx
imagePullSecrets: []
ingress:
annotations: {}
enabled: false
hosts:
- host: chart-example.local
paths: []
tls: []
nameOverride: ""
nodeSelector: {}
podSecurityContext: {}
replicaCount: 1
resources: {}
securityContext: {}
service:
port: 80
type: ClusterIP
serviceAccount:
create: true
name: null
tolerations: []
HOOKS:
MANIFEST:
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: goodly-guppy-configmap
data:
myvalue: "Hello World"
--dry-run을 사용하면 코드를 더 쉽게 테스트할 수 있지만, Kubernetes 자체가 생성한 템플릿을 받아들인다는 것을 보장하지는 않아요. --dry-run이 작동한다고 해서 차트가 설치될 것이라고 가정하지 않는 것이 좋아요.
차트 템플릿 가이드에서 여기서 정의한 기본 차트를 가지고 Helm 템플릿 언어를 자세히 탐구해요. 그리고 내장 객체로 시작할 거예요.