템플릿 안에서 파일 접근하기
템플릿 안에서 파일 접근하기 (Accessing Files Inside Templates)
이 문서는 템플릿에서 .Files 객체로 파일의 내용을 읽어오는 방법을 다뤄요. 기본 예시, 경로 헬퍼, Glob 패턴, ConfigMap·Secret 유틸리티, 인코딩, 줄 단위 읽기를 설명해요.
출처: 문서
본문
이전 섹션에서 이름이 있는 템플릿을 만들고 접근하는 여러 방법을 살펴봤어요. 이것은 한 템플릿에서 다른 템플릿을 쉽게 가져올 수 있게 해줘요. 하지만 때로는 템플릿이 아닌 파일을 가져와 그 내용을 템플릿 렌더러로 보내지 않고 주입하는 것이 바람직할 수 있어요.
Helm은 .Files 객체를 통해 파일에 접근할 수 있게 해줘요. 템플릿 예시로 들어가기 전에 이 기능이 어떻게 작동하는지에 대해 몇 가지 알아둘 점이 있어요:
-
Helm 차트에 추가 파일을 넣어도 괜찮아요. 이 파일들은 번들로 묶여요. 하지만 주의하세요. Kubernetes 객체의 저장 제한 때문에 차트는 1M보다 작아야 해요.
-
일부 파일은 주로 보안상의 이유로
.Files객체를 통해 접근할 수 없어요. -
templates/안의 파일은 접근할 수 없어요. -
.helmignore로 제외된 파일은 접근할 수 없어요. -
Helm 애플리케이션 서브차트 밖의 파일(부모 차트의 파일 포함)은 접근할 수 없어요.
-
-
차트는 UNIX 모드 정보를 보존하지 않으므로 파일 수준 권한은
.Files객체와 관련해 파일 가용성에 영향을 미치지 않아요.
기본 예시 (Basic example)
이러한 주의 사항을 마치고, 세 파일을 ConfigMap으로 읽는 템플릿을 작성해 봐요. 시작하려면 차트에 세 파일을 추가하고, 세 개 모두를 mychart/ 디렉터리 안에 직접 넣어요.
config1.toml:
message = "Hello from config 1"
config2.toml:
message = "This is config 2"
config3.toml:
message = "Goodbye from config 3"
이 각각은 단순한 TOML 파일이에요 (옛날 Windows INI 파일이라고 생각하면 됨). 파일 이름을 알고 있으므로 range 함수로 반복하면서 내용을 ConfigMap에 주입할 수 있어요.
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
{{- $files := .Files }}
{{- range tuple "config1.toml" "config2.toml" "config3.toml" }}
{{ . }}: |-
{{ $files.Get . }}
{{- end }}
이 ConfigMap은 이전 섹션에서 논의한 여러 기법을 사용해요. 예를 들어 .Files 객체에 대한 참조를 담는 $files 변수를 만들고, tuple 함수로 반복할 파일 목록을 만들고, 각 파일 이름({{ . }}: |-) 다음에 파일 내용({{ $files.Get . }})을 출력해요.
이 템플릿을 실행하면 세 파일의 내용이 담긴 단일 ConfigMap이 생성돼요:
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: quieting-giraf-configmap
data:
config1.toml: |-
message = "Hello from config 1"
config2.toml: |-
message = "This is config 2"
config3.toml: |-
message = "Goodbye from config 3"
경로 헬퍼 (Path helpers)
파일을 다룰 때 파일 경로 자체에 몇 가지 표준 작업을 수행하는 것이 매우 유용할 수 있어요. 이를 돕기 위해 Helm은 Go의 path 패키지의 많은 함수를 가져와 사용할 수 있게 해줘요. 이 모든 함수는 Go 패키지와 같은 이름으로 접근할 수 있지만, 첫 글자는 소문자예요. 예를 들어 Base는 base가 되는 식이에요.
가져온 함수는 다음과 같아요:
-
base (Base)
-
dir (Dir)
-
ext (Ext)
-
isAbs (IsAbs)
-
clean (Clean)
Glob 패턴 (Glob patterns)
차트가 커지면 파일을 더 잘 조직할 필요를 더 느낄 수 있어요. 그래서 glob 패턴의 모든 유연성으로 특정 파일을 추출하는 데 도움이 되는 Files.Glob(pattern string) 메서드를 제공해요.
.Glob은 Files 타입을 반환하므로 반환된 객체에서 어떤 Files 메서드든 호출할 수 있어요.
예를 들어 다음 디렉터리 구조를 상상해 보세요:
foo/:
foo.txt foo.yaml
bar/:
bar.go bar.conf baz.yaml
Glob으로 여러 옵션을 사용할 수 있어요:
{{ $currentScope := .}}
{{ range $path, $_ := .Files.Glob "*.yaml" }}
{{- with $currentScope}}
{{ .Files.Get $path }}
{{- end }}
{{ end }}
또는
{{ range $path, $_ := .Files.Glob "*.yaml" }}
{{ $.Files.Get $path }}
{{ end }}
ConfigMap과 Secrets 유틸리티 함수 (ConfigMap and Secrets utility functions)
(Helm 2.0.2 이상에서 사용 가능)
파일 내용을 ConfigMap과 Secrets에 둘 다 넣어 실행 시 pod에 마운트하고 싶은 것은 매우 흔해요. 이를 돕기 위해 Files 타입에 몇 가지 유틸리티 메서드를 제공해요.
더 나은 구성을 위해 특히 Glob 메서드와 함께 이 메서드들을 사용하는 것이 유용해요.
위 예시의 디렉터리 구조가 주어졌을 때:
---
apiVersion: v1
kind: ConfigMap
metadata:
name: conf
data:
{{- (.Files.Glob "foo/*").AsConfig | nindent 2 }}
---
apiVersion: v1
kind: Secret
metadata:
name: very-secret
type: Opaque
data:
{{- (.Files.Glob "bar/*").AsSecrets | nindent 2 }}
인코딩 (Encoding)
성공적인 전송을 보장하기 위해 파일을 가져와 템플릿이 base-64로 인코딩하게 할 수 있어요:
apiVersion: v1
kind: Secret
metadata:
name: {{ .Release.Name }}-secret
type: Opaque
data:
token: |-
{{ .Files.Get "config1.toml" | b64enc }}
위 코드는 이전에 사용한 것과 같은 config1.toml 파일을 가져와 인코딩해요:
# Source: mychart/templates/secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: lucky-turkey-secret
type: Opaque
data:
token: |-
bWVzc2FnZSA9ICJIZWxsbyBmcm9tIGNvbmZpZyAxIgo=
줄 단위 (Lines)
때로는 템플릿에서 파일의 각 줄에 접근하는 것이 바람직할 수 있어요. 이를 위한 편리한 Lines 메서드를 제공해요.
range 함수로 Lines를 반복할 수 있어요:
data:
some-file.txt: {{ range .Files.Lines "foo/bar.txt" }}
{{ . }}{{ end }}
참조하는 파일이 비어 있거나 존재하지 않으면 Lines는 실패하는 대신 빈 목록을 반환해요. 그러면 range 루프가 아무 출력도 만들지 않으므로 누락되었거나 빈 파일을 참조해도 템플릿 렌더링이 실패하지 않아요.
helm install 중에 차트 외부의 파일을 전달할 방법은 없어요. 사용자에게 데이터를 제공하도록 요청하는 경우 helm install -f 또는 helm install --set으로 로드해야 해요.
이 논의로 Helm 템플릿을 작성하는 도구와 기술에 대한 깊은 탐구를 마무리해요. 다음 섹션에서는 templates/NOTES.txt라는 특별한 파일을 사용해 차트 사용자에게 설치 후 안내를 보내는 방법을 볼 거예요.