티스토리 뷰

반응형

기본적으로 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 기반이니 이런 노가다를 써먹을순 있었던거 같다.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함