템플릿 안에서 파일 접근하기

템플릿 안에서 파일 접근하기 (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 패키지와 같은 이름으로 접근할 수 있지만, 첫 글자는 소문자예요. 예를 들어 Basebase가 되는 식이에요.

가져온 함수는 다음과 같아요:

  • base (Base)

  • dir (Dir)

  • ext (Ext)

  • isAbs (IsAbs)

  • clean (Clean)

Glob 패턴 (Glob patterns)

차트가 커지면 파일을 더 잘 조직할 필요를 더 느낄 수 있어요. 그래서 glob 패턴의 모든 유연성으로 특정 파일을 추출하는 데 도움이 되는 Files.Glob(pattern string) 메서드를 제공해요.

.GlobFiles 타입을 반환하므로 반환된 객체에서 어떤 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라는 특별한 파일을 사용해 차트 사용자에게 설치 후 안내를 보내는 방법을 볼 거예요.

더 알아보기 (Learn more)