티스토리 뷰
기본적으로 configMap 을 통한 파일을 등록하는건 1depth 만 지원된다.
airflow 의 plugin 파일을 helm chart 폴더에서 관리하고자 했는데 안타갑게도 서브디렉토리는 사실상 필수였다.
가장 쉽게 생각할 수 있는 접근은 git clone 을 해서 특정 리파지토리의 브랜치를 다운로드 받아서 처리하는것인데
로컬에서 쉽게 배포하고 테스트 할 수 있는걸 원했다. 그래서 삽질의 삽질을 하다가 약간의 트릭으로 할 긴했다.
해결의 실마리?
configMap 을 정의할때 다음과 같이 key, path 를 직접 정의하면 subdir 을 지정하는게 가능하다.
그러면 local 폴더의 경로에서 / 를 다른문자열로 치환하고, 이를 1depth 파일처럼 관리하고, 다시 이걸 key, path 로 맵핑하면 된다는 말이 된다.
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: nginx
volumeMounts:
- name: config-volume
mountPath: /etc/myapp
volumes:
- name: config-volume
configMap:
name: my-config
items:
- key: config1.txt
path: special-config.txt
- key: config2.txt
path: subdir/config2.txt
해결방법
우선 ./include/plugins 폴더에 있는 파일을 configMap 으로 등록할때 상대경로를 추출하고 이 경로에서 / 를 -_-_ 로 변경해서 파일명으로만 인지되게 구성을 했다.
airflow-plugins-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: airflow-plugins
{{- if and (not .Values.n2c.application) .Values.namespace }}
namespace: test
data:
{{- $basePath := "include/plugins/" -}}
{{- range $path, $_ := .Files.Glob (printf "%s**" $basePath) -}}
{{- $relPath := $path | replace $basePath "" -}}
{{ $relPath | replace "/" "-_-_" | nindent 2 -}}: |
{{ $.Files.Get $path | nindent 4 }}
{{- end -}}
그리고, 이걸 사용할때는 key 와 path 를 맵핑을 해서 처리했다.
실제 path 를 지정하면 내부적으로 심볼릭링크 기반으로 맵핑을 하는 구조라서 실제 이걸 다른 볼륨에 복사하기위해서는 물리파일이 복사되도록 cp -rL 옵션을 줘서 복사하면 된다.
_helpers.tpl
{{- define "airflow.volumes.plugins" -}}
- name: plugins-ro-volume
configMap:
name: airflow-plugins
items:
{{- $basePath := "include/plugins/" -}}
{{ range $path, $_ := .Files.Glob (printf "%s**" $basePath) }}
{{- $relPath := $path | replace $basePath "" -}}
{{- $token := splitList "/" $relPath }}
- key: {{ $relPath | replace "/" "-_-_" | quote }}
path: {{ $relPath | quote }}
{{- end }}
{{- end -}}
이해돕기
좀더 이해를 돕자면, 실제 경로를 path 로 잡고, key 와 configMap 상의 파일명은 / 를 치환한 파일명으로 바꿔쳐서 다시 맵핑한다는 말이다. 아래 템플릿 결과를 보면 좀더 이해가 빠를것으로 보인다.
뭐 내가 이렇게 억지로 만들긴 했는데 configMap 에서 다루는것이다보니 파일 갯수가 크지 않을 경우에만 사용하자.
그나마 helm chart 기반이니 이런 노가다를 써먹을순 있었던거 같다.
'docker & k8s > helm chart' 카테고리의 다른 글
[helm chart] range 하위에서 include 사용시 오류 해결 방법 : error calling include (0) | 2024.08.21 |
---|---|
[Helm Chart] 문자열에서 "파일명" 혹은 "파일경로" 만 추출하기 (0) | 2024.06.21 |
[Helm Chart] 파일에 선언한 값을 dict 로 만들어 사용하기 (0) | 2024.06.20 |
[Helm Chart] 파일을 include 와 values.yaml 바인딩 같이 하기 (0) | 2024.06.11 |
[Helm Chart] couldn't parse image reference 문제 : float64 문제 (0) | 2024.06.10 |