본문 바로가기
클라우드/Argo

☸️ Helm Values 완벽 가이드: 설정 방법부터 Argo CD InitContainer 비법까지

by gasbugs 2026. 1. 2.

안녕하세요! Kubernetes 패키지 매니저인 Helm을 사용하다 보면 "내가 설정한 값이 왜 반영이 안 됐지?" 혹은 "Argo CD에서 외부 차트를 쓸 때 프라이빗 레포 설정은 어떻게 하지?"라는 고민을 한 번쯤 해보셨을 겁니다.

오늘은 Helm의 값을 주입하는 모든 방법과 그들 사이의 서열(우선순위), 그리고 Argo CD 운영의 고수들이 사용하는 InitContainer 활용법을 10분 분량의 상세한 가이드로 정리해 드립니다. 🛠️


1. 📂 Helm Values를 지정하는 모든 방법

Helm은 유연성을 위해 다양한 방식으로 값을 주입받습니다. 각 방법의 특징과 용도를 정리해 보았습니다.

① values.yaml 파일 (기본값)

차트 내부에 포함된 기본 설정 파일입니다.

  • 용도: 차트 제작자가 제공하는 기본 사양 정의.
  • 특징: 가장 낮은 우선순위를 가집니다.

② --values 또는 -f (외부 파일)

사용자가 직접 작성한 별도의 YAML 파일을 지정합니다.

  • 용도: 환경별(Dev, Staging, Prod) 설정 분리.
  • 명령어: helm install my-app ./my-chart -f values-prod.yaml

③ --set (인라인 플래그)

터미널에서 직접 키-값 쌍을 입력합니다.

  • 용도: CI/CD 파이프라인에서 동적으로 태그를 변경하거나, 아주 간단한 값을 수정할 때.
  • 명령어: helm install my-app ./my-chart --set image.tag=v2.0.0

④ --set-file (파일 내용을 값으로 주입)

파일의 내용(예: 스크립트, 설정 파일)을 통째로 특정 키의 값으로 넣습니다.

  • 용도: ConfigMap에 들어갈 큰 설정 파일 주입.

⑤ --set-string

모든 값을 강제로 문자열로 인식하게 합니다. (숫자 0이 불리언으로 인식되는 것 방지)


2. 🏆 Values 적용 우선순위 (Precedence)

설정 방법이 겹칠 경우 Helm은 어떤 값을 선택할까요? "나중에 정의되거나 더 구체적인 것이 이긴다"고 기억하세요.

우선순위 설정 방법 비고
1 (최고) --set (인라인) 가장 마지막에 덮어쓰는 최종 병기
2 --values (-f) 파일 목록 중 가장 오른쪽에 있는 파일이 우선
3 상위 차트의 values.yaml 부모 차트가 자식 차트의 값을 덮어쓸 때
4 (최저) 차트 내부의 values.yaml 기본값

3. 🏗️ Argo CD의 고급 기법: InitContainer로 Helm Repo 추가하기

Argo CD를 운영하다 보면 이런 상황이 발생합니다.

"사내 프라이빗 Helm 레포지토리가 있는데, Argo CD가 매번 여기서 차트를 가져와야 해요. 그런데 인증 정보나 레포 등록을 매번 선언적으로 관리하기가 까다롭네요."

 

이때 사용하는 것이 Argo CD Repo Server에 InitContainer를 추가하여 Helm Repo를 미리 등록하는 방식입니다.

❓ 이게 무엇인가요?

Argo CD의 구성 요소 중 Git이나 Helm 레포지토리와 통신하는 argocd-repo-server 가 시작되기 전에, 임시 컨테이너(InitContainer)를 띄워 helm repo add 명령어를 실행해 두는 것입니다.

💻 어떻게 설정하나요? (Kustomize/Helm 기준)

Argo CD 설치 매니페스트(Deployment)를 수정해야 합니다.

YAML

# argocd-repo-server Deployment 수정
apiVersion: apps/v1
kind: Deployment
metadata:
  name: argocd-repo-server
spec:
  template:
    spec:
      # 1. Helm 설정을 저장할 공유 볼륨 정의 📂
      volumes:
        - name: helm-working-dir
          emptyDir: {}

      # 2. 메인 컨테이너 전에 실행될 InitContainer 설정 🚀
      initContainers:
        - name: helm-repo-adder
          image: alpine/helm:latest
          command: ["/bin/sh", "-c"]
          args:
            - |
              # 사내 프라이빗 레포지토리 추가
              helm repo add my-private-repo https://charts.mycompany.com --username $REPO_USER --password $REPO_PASS
              # 레포지토리 업데이트
              helm repo update
          env:
            - name: REPO_USER
              valueFrom:
                secretKeyRef:
                  name: repo-credentials
                  key: username
          # 중요: 추가된 레포 정보가 저장되는 경로를 공유 볼륨으로 마운트
          volumeMounts:
            - name: helm-working-dir
              mountPath: /root/.config/helm

      # 3. 메인 컨테이너에서도 동일한 볼륨 마운트 🔗
      containers:
        - name: argocd-repo-server
          volumeMounts:
            - name: helm-working-dir
              mountPath: /app/config/helm # Argo CD가 Helm 설정을 찾는 경로

✨ 이 방식을 쓰는 이유

  1. 동적 관리: Argo CD UI에서 일일이 레포지토리를 등록할 필요 없이, 서버가 뜰 때 코드로 자동 등록됩니다.
  2. 보안: Secret을 통해 자격 증명을 주입하므로 안전합니다.
  3. 의존성 해결: Chart.yaml에 선언된 타사 차트 의존성을 해결할 때 로컬 헬스 캐시가 미리 구축되어 있어 속도가 빠릅니다.

4. 💡 실무 적용 팁

  • 인라인(--set) 지양: Argo CD를 쓸 때는 가급적 values.yaml이나 Git에 저장된 파일을 사용하세요. 인라인 설정은 나중에 추적이 어렵습니다.
  • 구조적 분리: 공통 설정은 values.yaml에, 환경별 차이는 values-dev.yaml, values-prod.yaml로 분리하여 관리하는 것이 GitOps의 정석입니다.
  • Argo CD Helm Application: Argo CD Application 리소스 내에서도 helm.parameters를 통해 --set과 동일한 효과를 낼 수 있습니다.

YAML

spec:
  source:
    chart: my-app
    helm:
      # 인라인 설정과 동일한 효과 ⚡
      parameters:
        - name: "replicaCount"
          value: "3"
      # 외부 파일 지정 효과 📄
      valueFiles:
        - values-prod.yaml

📝 요약

  1. Helm Values는 인라인(--set), 외부 파일(-f), 기본 파일 순으로 우선순위가 높습니다.
  2. Argo CD InitContainer는 Repo Server가 뜨기 전 프라이빗 Helm 레포를 자동으로 등록하여 운영 편의성을 높여줍니다.
  3. 모든 설정은 코드(Git)로 관리하여 추적 가능성을 확보하는 것이 중요합니다.

오늘 내용이 여러분의 안정적인 클러스터 운영에 도움이 되기를 바랍니다! 🎯