Istio의 Ambient mode 도입을 위해 리서치를 진행하던 중, 일부 설정 값이 예상과 달리 적용되지 않는 문제를 마주했다. 원인을 파악하기 위해 Istio의 Helm 차트를 깊이 있게 분석했고, 이 과정에서 알게 된 Profile 주입 방식과 차트 템플릿 렌더링 순서에 대한 내용을 공유하고자 한다. Helm 차트란? Helm 차트는 쿠버네티스(Kubernetes) 리소스를 템플릿화하여 재사용성과 유지보수성을 높여주는 패키징 도구다. 애플리케이션 배포에 […] ||
Istio의 Ambient mode 도입을 위해 리서치를 진행하던 중, 일부 설정 값이 예상과 달리 적용되지 않는 문제를 마주했다. 원인을 파악하기 위해 Istio의 Helm 차트를 깊이 있게 분석했고, 이 과정에서 알게 된 Profile 주입 방식과 차트 템플릿 렌더링 순서에 대한 내용을 공유하고자 한다.
Helm 차트란?
Helm 차트는 쿠버네티스(Kubernetes) 리소스를 템플릿화하여 재사용성과 유지보수성을 높여주는 패키징 도구다. 애플리케이션 배포에 필요한 매니페스트(Manifest)들을 하나의 패키지로 묶어 관리할 수 있게 해주며, 쿠버네티스 생태계에서 사실상 표준으로 자리 잡았다.
우리 팀은 모든 애플리케이션을 Helm 차트로 구성하여 운영 중이며, ArgoCD와 결합해 GitOps 방식으로 배포를 관리하고 있다.
주입한 값이 적용되지 않는 문제
Istio 차트를 다루던 중 다음과 같은 상황이 발생했다.
# 차트의 기본 values 파일
...
cniBinDir: /opt/cni/bin
...
# profile-platform-gke 파일
cni:
cniBinDir: ""
# 사용자 정의 values 파일
cniBinDir: mypath
일반적으로 Helm에서는 차트에 포함된 기본 values보다 사용자가 직접 주입하는 values의 우선순위가 더 높다. 따라서 위와 같이 배포할 경우 cniBinDir에 mypath 값이 적용될 것이라 예상했으나, 실제로는 profile-platform-gke.yaml 파일에 정의된 빈 문자열 값이 적용되는 현상이 발생했다.
Istio Helm 차트 분석
Istio의 Ambient mode를 사용하려면 istiod, base, cni, ztunnel 등 여러 차트를 한 번에 배포해야 한다. 이때 특정 모드에 대한 값을 각각의 차트에 개별적으로 정의하는 번거로움을 줄이기 위해, Istio는 Profile이라는 개념을 도입해 모드별 값을 한 곳에서 통합 관리한다.
istio-cni 차트 트리 구조
├── files
│ ├── profile-ambient.yaml
│ ├── profile-platform-gke.yaml
├── templates
│ ├── daemonset.yaml
│ ├── zzy_descope_legacy.yaml
│ └── zzz_profile.yaml
├── README.md
├── Chart.yaml
└── values.yaml
Istio CNI 차트의 구조를 살펴보면 일반적인 차트와 달리 files 폴더에 Profile 관련 파일이, templates 폴더에는 zzz_profile.yaml, zzy_descope_legacy.yaml과 같은 특수한 파일이 존재함을 알 수 있다.
Profile 사용 방법
helm install istio-cni istio/cni \
--set profile=ambient \
--set global.platform=gke \
-n istio-system --wait
profile=ambient를 주입하면 profile-ambient.yaml의 값이 병합된다.
global.platform=gke를 주입하면 profile-platform-gke.yaml의 값이 추가로 병합된다.
즉, 프로필을 지정하면 차트의 기본 values가 아닌 전용 profile 파일이 먼저 적용되고, 이후 사용자가 주입한 값이 덮어쓰게 된다.
원인 분석: 템플릿 로직과