Search

gomgomshrimp, 1 minute ago
helm chart에서 아래 같은 에러가 발생합니다.
Failed to load target state: failed to generate manifest for source 1 of 1: rpc error: code = Unknown desc = `helm template . --name-template kic-st-kyverno-cluster-policy --namespace kyverno --kube-version 1.27 <api versions removed> --include-crds` failed exit status 1: Error: parse error at (kyverno-cluster-policy/templates/mutate-thinq-service-label.yaml:23): function "request" not defined Use --debug flag to render out invalid YAML
Plain Text
복사
이 에러는 다음 부분을 수정하면 해결됩니다.
"{{ request.object.spec.template.metadata.labels.\\"thinq.service\\" || '' }}"
Plain Text
복사
아래 같이 수정
"{{`{{ request.object.spec.template.metadata.labels.\\"thinq.service\\" || '' }}`}}"
Plain Text
복사
이유를 설명해주세요.
OpenAI GPT-4o, now
위의 수정 내용과 이유를 설명드리겠습니다. 문제의 원인과 수정된 해결 방법을 잘 이해하기 위해 하나씩 분석해보겠습니다.

원인 분석

원래 템플릿 코드는 다음과 같았습니다:
"{{ request.object.spec.template.metadata.labels.\\"thinq.service\\" || '' }}"
YAML
복사

1. Helm 템플릿 엔진

Helm은 Go 템플릿 엔진에 기반하고 있으며, 템플릿 변수나 Helm에서 사용 가능한 함수를 {{ }} 사이에 작성해야 합니다. 하지만 request는 Helm 자체의 내장 함수가 아닙니다. request는 Kubernetes Admission Webhook과 같은 환경에서 사용 가능한 Open Policy Agent (OPA) 또는 Kyverno 같은 정책 엔진에서 제공하는 입력 변수입니다. 즉, Helm의 템플릿 엔진은 request 객체를 인식하지 않습니다.
이로 인해 Helm은 구문에서 request를 함수나 식별자로 인식하지 못하고, 다음과 같은 오류를 발생시켰습니다:
Error: parse error at (...) function "request" not defined
Plain Text
복사

2. Helm 내의 특별한 패턴 충돌

"{{ request.object.spec..." 형식은 템플릿 표현식 {{ }} 내부에 또 다른 템플릿 표현식처럼 보이게 만듭니다. Helm 템플릿 엔진은 이와 같은 중첩된 표현식을 올바르게 처리하지 못하거나, 이를 유효하지 않은 템플릿 구문으로 해석합니다.

해결 방법 및 수정 내용

수정된 코드는 다음과 같습니다:
"{{`{{ request.object.spec.template.metadata.labels.\\"thinq.service\\" || '' }}`}}"
YAML
복사

주요 수정 포인트

Helm 템플릿에서 내부적으로 템플릿 변수를 사용하려면 raw 템플릿 표현식({{}} 사이)를 포함하는 문자열을 감싸야 합니다. {{}} 사이 구문이 실제로 렌더링되지 않고 문자 그대로 처리되도록 해야 합니다.
이에 따라 변경된 코드는 Helm 템플릿 엔진에게 다음 내용을 전달합니다:
Helm 템플릿 내부적으로는 텍스트를 감싸는 리터럴 문자열 형태로 인식 ({{는 템플릿 구문으로 실행되는 대신 텍스트 그대로 남는다).
Helm이 해당 문자열을 패스하여 실제 실행 환경(Kyverno 등)에서 request를 처리하도록 합니다.

어떻게 동작하는가?

수정된 코드에서:
"{{`{{ request.object.spec.template.metadata.labels.\\"thinq.service\\" || '' }}`}}"
YAML
복사
1.
Helm은 {{ ... }} 안에서 {{로 시작하고 }}로 끝나는 raw 템플릿 표현식을 문자열 형식으로 처리합니다.
2.
Helm이 생성하는 최종 Kubernetes 매니페스트는 다음과 비슷하게 출력됩니다:
"{{ request.object.spec.template.metadata.labels.\\"thinq.service\\" || '' }}"
YAML
복사
1.
결과적으로, 이 매니페스트 내용은 Helm 템플릿이 아니라 실행 환경(예: Kyverno 정책 엔진)에서 request 변수를 처리할 수 있게 합니다.

결론

이 수정은 템플릿 내부에서 Kyverno 엔진이 올바로 처리하도록 텍스트를 전달하며, Helm 템플릿에서는 이를 그대로 문자열로 취급하게 만들어 주는 방식입니다.
특히 중요한 점은 Helm이 request 객체나 OPA/Kyverno와 관련된 문맥을 이해하지 못한다는 점입니다. 따라서 Helm 템플릿 충돌 문제를 해결하기 위해, 내부 템플릿 표현식을 문자 그대로(raw)로 처리하도록 보장한 것입니다.