쿠버네티스용 MCP 서버를 Helm으로 설치하려다 차트 렌더링이 실패했다. 에러가 조금 의외였다.

error: wrong type for value; expected chartutil.Values; got []interface {}

imagePullSecrets를 values에 넣었을 뿐인데 이 에러가 났다. 비워 두면 정상 설치되고, 값을 넣으면 실패했다.

tpl 안의 점(.)이 문제였다

deployment 템플릿은 이렇게 생겨 있었다.

{{- with .Values.imagePullSecrets }}
imagePullSecrets:
  {{- tpl (toYaml .) . | nindent 8 }}
{{- end }}

with 블록 안에서 점(.)은 루트가 아니라 .Values.imagePullSecrets 배열을 가리킨다. 반면 tpl의 두 번째 인자에는 루트 컨텍스트(chartutil.Values)가 필요하다. 배열이 전달되면서 기대한 타입과 실제 타입이 다르다는 오류가 발생했다.

고치는 방법은 점을 달러($)로 바꾸는 것이다. $withrange 안에서도 항상 루트 컨텍스트를 가리킨다.

{{- with .Values.imagePullSecrets }}
imagePullSecrets:
  {{- tpl (toYaml .) $ | nindent 8 }}
{{- end }}

같은 패턴이 deployment.yaml 전반에 반복돼 있었다. podAnnotations, livenessProbe, readinessProbe, resources, affinity, tolerationswith 안에서 tpl ... .을 쓰는 자리가 열두 곳이었고, serviceaccount.yaml의 annotations도 같은 문제였다. 전부 $를 넘기도록 수정했다. 추가 18줄, 삭제 13줄이다.

빈 값일 때 실패하지 않았던 이유는 단순하다. with는 값이 비어 있으면(falsy) 블록 자체를 건너뛴다. 그래서 아무것도 넣지 않았을 때는 tpl까지 가지 않고, 값을 넣는 순간 처음으로 그 줄을 실행하면서 실패한 것이다.

kubernetes-mcp-server PR #744 병합 결과

main 파이프라인에 영향을 주던 문제를 수정한 PR #744가 제출 당일 병합됐다.

CI에 회귀 케이스도 넣었다

이대로 고치고 끝내면 다음에 또 누군가 똑같이 .을 쓴다. 차트에 tpl을 검증하는 테스트 values가 있길래 거기에 serviceAccount.annotations 케이스를 추가했다. with 블록 안에서 tpl이 도는 상황을 한 번 밟게 해 두면 누가 또 $를 빠뜨렸을 때 CI에서 잡힌다.

PR은 제출 당일 병합됐다. 해당 문제가 main 파이프라인에도 영향을 주고 있어 메인테이너가 우선 검토했다.

Helm 템플릿에서 withrange를 쓸 때 tpl이나 include에 루트 컨텍스트를 넘겨야 한다면 점이 아니라 $를 써야 한다. 이 한 줄을 기억하려다 PR까지 올리게 됐다.


참고