Helm Chart
1. 개요
1. 개요
Helm 차트는 쿠버네티스 애플리케이션을 정의, 설치, 업그레이드하는 데 사용되는 패키지 관리 도구이다. 애플리케이션에 필요한 모든 리소스를 하나의 패키지로 묶어 배포 과정을 단순화하고 표준화한다. 이는 리눅스의 APT나 YUM과 같은 패키지 관리자와 유사한 개념으로, 컨테이너 오케스트레이션 환경에서 애플리케이션의 생명주기를 관리하는 핵심 도구 역할을 한다.
Helm은 2015년 Deis[2]에 의해 최초로 등장했으며, 이후 쿠버네티스 커뮤니티의 핵심 프로젝트로 성장했다. 이 도구의 주요 용도는 쿠버네티스 애플리케이션 패키징, 배포 템플릿화 및 버전 관리, 의존성 관리, 그리고 배포 릴리스 관리에 있다. 복잡한 마이크로서비스 아키텍처나 다수의 YAML 매니페스트 파일로 구성된 애플리케이션을 효율적으로 처리할 수 있게 해준다.
DevOps 및 CI/CD 파이프라인에서 Helm 차트는 애플리케이션 배포를 자동화하고 재현 가능하게 만드는 표준 수단으로 널리 채택되었다. 단일 명령어로 애플리케이션을 설치하거나 특정 버전으로 롤백하는 것이 가능하여, 운영 효율성과 안정성을 크게 향상시킨다. 따라서 Helm은 현대적인 클라우드 네이티브 애플리케이션 개발과 운영에 필수적인 요소가 되었다.
2. 구성 요소
2. 구성 요소
2.1. Chart.yaml
2.1. Chart.yaml
Chart.yaml 파일은 Helm Chart의 메타데이터를 정의하는 핵심 구성 파일이다. 이 파일은 YAML 형식으로 작성되며, 차트의 이름, 버전, 설명, 의존성 등 애플리케이션 패키지의 정체성과 요구사항을 기술한다. helm create 명령어로 새 차트를 생성하면 기본적인 Chart.yaml 파일이 만들어지며, 사용자는 이를 기반으로 애플리케이션에 맞게 수정한다.
파일에는 필수 필드와 선택적 필드가 존재한다. 필수 필드로는 차트의 이름을 지정하는 name, 시맨틱 버저닝 규칙을 따르는 version, 그리고 애플리케이션의 현재 버전을 나타내는 appVersion이 있다. version 필드는 Helm Chart 자체의 릴리스 버전을, appVersion은 차트가 패키징하는 실제 소프트웨어(예: nginx, Redis)의 버전을 기록한다. 이 구분을 통해 차트의 템플릿이나 의존성 변경과 내부 애플리케이션의 업데이트를 독립적으로 관리할 수 있다.
선택적 필드에는 차트에 대한 간략한 설명을 담는 description, 프로젝트 홈페이지 URL을 나타내는 home, 그리고 유지보수자 정보를 리스트 형태로 기재하는 maintainers 등이 포함된다. 또한, dependencies 필드를 통해 이 차트가 동작하기 위해 필요한 다른 Helm Chart(예: 데이터베이스, 메시지 큐)를 명시할 수 있어 복잡한 애플리케이션 스택의 의존성을 체계적으로 관리한다.
Chart.yaml 파일은 Helm이 차트를 인식하고, Helm 저장소에 게시하며, 의존성을 해결하는 데 필요한 모든 정보를 제공한다. 따라서 이 파일의 정확한 작성을 통해 쿠버네티스 애플리케이션의 배포 프로세스를 표준화하고 재현 가능하게 만드는 기초를 마련한다.
2.2. 템플릿 (Templates)
2.2. 템플릿 (Templates)
템플릿은 Helm Chart의 핵심 구성 요소로, 쿠버네티스 리소스 매니페스트 파일을 동적으로 생성하는 역할을 한다. 이 파일들은 Go 프로그래밍 언어의 템플릿 엔진을 기반으로 하며, 표준 YAML 형식으로 작성된다. 템플릿을 사용하면 단일 애플리케이션 정의에서 다양한 환경(예: 개발, 스테이징, 프로덕션)에 맞는 서로 다른 설정을 가진 매니페스트를 쉽게 생성할 수 있다.
템플릿 디렉터리에는 디플로이먼트, 서비스, 컨피그맵, 시크릿 등 필요한 모든 쿠버네티스 리소스 정의 파일이 포함된다. 각 파일 내에는 {{ .Values.변수명 }}과 같은 구문을 통해 외부에서 주입될 값을 참조하는 플레이스홀더가 존재한다. 이는 values.yaml 파일에 정의된 기본값이나 사용자가 설치 시 --set 플래그로 제공하는 값으로 대체된다. 템플릿은 또한 조건문(if/else), 반복문(range), 파이프라인, 함수와 같은 프로그래밍 로직을 지원하여 복잡한 배포 시나리오를 처리할 수 있다.
템플릿의 작동은 Helm이 설치나 업그레이드 명령을 실행할 때 시작된다. Helm은 템플릿 파일을 렌더링하기 전에 values.yaml 파일과 사용자 제공 값을 병합하여 최종 값을 구성한다. 그런 후 Go 템플릿 엔진이 이 값을 사용해 모든 플레이스홀더와 로직을 처리하고, 순수한 YAML 형식의 쿠버네티스 매니페스트를 생성한다. 이렇게 생성된 매니페스트는 쿠버네티스 API 서버로 전송되어 실제 리소스를 생성하거나 업데이트한다.
이러한 템플릿 시스템은 애플리케이션 패키징의 재사용성과 유연성을 극대화한다. 개발자는 환경별 차이(예: 데이터베이스 엔드포인트, 레플리카 수, 리소스 할당량)를 값으로 추상화하여 동일한 차트로 일관된 배포를 관리할 수 있다. 이는 DevOps 실무와 CI/CD 파이프라인에서 표준화된 배포 프로세스를 구현하는 데 중요한 기여를 한다.
2.3. values.yaml
2.3. values.yaml
values.yaml 파일은 Helm Chart의 구성 가능한 매개변수에 대한 기본값을 정의하는 설정 파일이다. 이 파일은 차트 사용자가 애플리케이션을 자신의 환경에 맞게 쉽게 커스터마이즈할 수 있도록 하는 핵심 메커니즘을 제공한다. 템플릿 (Templates) 디렉터리 내의 YAML 파일들은 이 values.yaml에 정의된 값들을 참조하여 최종 쿠버네티스 매니페스트 파일을 동적으로 생성한다.
파일 구조는 일반적으로 키-값 쌍으로 이루어져 있으며, 애플리케이션의 이미지 태그, 레플리카 수, 서비스 타입, 리소스 제한, 환경 변수, 구성 파일 내용 등 거의 모든 배포 설정을 포함할 수 있다. 예를 들어, replicaCount: 3, image.repository: nginx와 같은 형태로 값을 지정한다. 사용자는 helm install 또는 helm upgrade 명령어를 실행할 때 --set 플래그를 사용하거나 별도의 사용자 정의 values 파일을 제공하여 이 기본값들을 덮어쓸 수 있다.
이를 통해 동일한 차트를 서로 다른 환경(예: 개발, 스테이징, 프로덕션)이나 다양한 요구사항에 맞게 재사용하는 것이 가능해진다. values.yaml은 애플리케이션의 배포 구성을 선언적으로 관리하고, 코드(템플릿)와 설정(값)을 분리함으로써 DevOps 및 CI/CD 파이프라인에서의 자동화와 일관된 배포를 용이하게 한다.
2.4. 의존성 (Dependencies)
2.4. 의존성 (Dependencies)
Helm 차트는 다른 Helm 차트에 대한 의존성을 정의하고 관리할 수 있다. 이를 통해 복잡한 애플리케이션을 구성하는 여러 마이크로서비스나 컴포넌트를 별도의 차트로 개발한 후, 하나의 상위 차트에서 통합하여 배포할 수 있다. 예를 들어, 웹 애플리케이션 차트가 데이터베이스 차트와 캐시 서버 차트에 의존하도록 구성할 수 있다.
의존성은 Chart.yaml 파일의 dependencies 필드에 명시된다. 각 의존성 항목에는 차트의 이름, 저장소 URL, 버전 범위 등을 지정한다. Helm은 helm dependency update 명령어를 실행하면 이 정보를 바탕으로 의존성 차트들을 다운로드하여 charts/ 디렉토리에 저장한다. 이를 통해 애플리케이션의 모든 구성 요소가 함께 패키징되어 배포의 일관성을 보장한다.
의존성 관리 기능은 재사용성과 모듈화를 크게 향상시킨다. 공통적으로 필요한 인프라 컴포넌트(예: 모니터링용 차트, 로깅 차트)나 라이브러리 역할을 하는 차트를 별도로 만들어 여러 프로젝트에서 참조할 수 있다. 또한, 의존성 차트의 컨피그맵이나 시크릿과 같은 리소스도 상위 차트의 values.yaml 파일을 통해 값을 재정의하여 제어할 수 있다.
2.5. README 및 NOTES.txt
2.5. README 및 NOTES.txt
README 파일은 Helm Chart의 사용 설명서 역할을 한다. 이 파일은 일반적으로 마크다운 형식으로 작성되며, 차트의 목적, 주요 기능, 설치 방법, 구성 가능한 값(values.yaml의 주요 파라미터)에 대한 상세한 설명을 포함한다. 또한 사용 예시나 문제 해결 방법과 같은 추가 정보를 제공하여 사용자가 차트를 효과적으로 이해하고 활용할 수 있도록 돕는다.
NOTES.txt 파일은 템플릿 파일로, Helm을 통해 차트를 설치하거나 업그레이드한 직후 터미널에 자동으로 출력되는 메시지를 정의한다. 이 메시지는 사용자에게 가장 필요한 후속 조치를 안내하는 데 사용된다. 예를 들어, 생성된 서비스의 접근 방법(예: kubectl get svc 명령어), 애플리케이션에 접근하기 위한 URL, 필요한 초기 비밀번호나 설정 값 등을 알려준다. 이는 배포 직후의 사용자 경험을 크게 향상시킨다.
이 두 파일은 차트의 사용성과 접근성을 높이는 핵심 문서이다. 잘 작성된 README 파일은 차트의 품질과 신뢰도를 나타내는 지표가 되며, NOTES.txt를 통한 즉각적인 안내는 쿠버네티스 애플리케이션 배포 후 운영 단계로의 원활한 전환을 돕는다. 따라서 차트 개발자는 애플리케이션 코드와 템플릿뿐만 아니라 이 문서화 작업에도 충분한 주의를 기울여야 한다.
3. 작동 방식
3. 작동 방식
헬름 차트의 작동 방식은 크게 사용자가 정의한 설정값과 차트에 포함된 템플릿 파일을 결합하여 최종 쿠버네티스 매니페스트 파일을 생성하는 과정을 중심으로 이루어진다. 사용자는 helm install 또는 helm upgrade 명령어를 실행할 때, --values 플래그를 통해 커스텀 values.yaml 파일을 제공하거나 --set 인자를 사용하여 개별 값을 직접 덮어쓸 수 있다. 헬름은 이렇게 입력받은 값들을 차트 내 기본 values.yaml 파일과 병합한 후, templates/ 디렉터리에 있는 Go 템플릿 파일들에 적용한다.
템플릿 엔진은 이 병합된 값들을 사용하여 템플릿 파일 내의 변수와 조건문, 반복문 등을 처리한다. 이를 통해 동일한 차트라도 환경(예: 개발, 스테이징, 프로덕션)에 따라 서로 다른 설정을 가진 쿠버네티스 리소스 정의서(YAML 파일)를 생성할 수 있다. 생성된 매니페스트들은 쿠버네티스 API 서버로 전송되어 실제 파드, 디플로이먼트, 서비스 등의 리소스를 생성하거나 업데이트한다.
이 과정에서 헬름은 배포된 애플리케이션의 상태를 하나의 '릴리스'로 관리한다. 각 릴리스는 고유한 이름과 버전 번호를 가지며, 헬름은 이를 통해 특정 버전의 차트와 사용된 설정값의 조합을 기록한다. 이 덕분에 사용자는 helm rollback 명령을 통해 이전 상태로 쉽게 되돌릴 수 있으며, helm history로 모든 변경 내역을 추적할 수 있다. 또한 차트에 정의된 의존성이 있을 경우, 헬름은 이를 자동으로 해결하여 필요한 하위 차트들을 함께 설치하거나 업그레이드하는 작업을 수행한다.
4. 주요 명령어
4. 주요 명령어
4.1. 설치 및 업그레이드
4.1. 설치 및 업그레이드
Helm Chart를 사용한 애플리케이션의 설치와 업그레이드는 helm install과 helm upgrade 명령어를 통해 이루어진다. 설치 시에는 저장소에서 차트를 가져오거나 로컬에 있는 차트의 경로를 지정하며, --values 옵션으로 커스텀 설정 파일을 제공하거나 --set 옵션으로 개별 값을 직접 덮어쓸 수 있다. 이를 통해 동일한 차트로도 개발, 스테이징, 프로덕션 등 다양한 환경에 맞는 배포를 손쉽게 구성할 수 있다. 설치가 성공하면 Helm은 고유한 릴리스 이름을 부여하고, 해당 릴리스의 상태와 리소스 정보를 관리하기 시작한다.
애플리케이션을 업그레이드할 때는 helm upgrade 명령어에 릴리스 이름과 새로운 차트 버전 또는 수정된 설정을 지정한다. Helm은 이전 릴리스의 설정과 새 설정을 비교하여 쿠버네티스 클러스터 내의 리소스에 필요한 변경 사항만을 적용하는 롤링 업데이트를 수행한다. 이 과정에서 문제가 발생하면 helm rollback 명령어를 사용해 이전의 안정적인 릴리스 버전으로 빠르게 복구할 수 있어, DevOps와 CI/CD 파이프라인에서 안정적인 지속적 배포를 가능하게 한다.
차트의 설치, 업그레이드, 롤백 이력은 Helm에 의해 내부적으로 관리된다. helm history 명령어를 실행하면 특정 릴리스에 대한 모든 배포 기록을 확인할 수 있으며, 각 기록은 수정된 시점과 적용된 차트의 버전, 상태 정보를 포함한다. 이는 배포 프로세스의 감사와 문제 추적에 유용하다. 또한 helm list 명령어를 통해 현재 클러스터에 설치되어 관리 중인 모든 릴리스의 목록과 상태를 한눈에 조회할 수 있다.
4.2. 관리 및 삭제
4.2. 관리 및 삭제
헬름 차트를 관리하고 삭제하는 작업은 주로 helm 명령줄 도구를 통해 이루어진다. helm list 명령을 사용하면 현재 클러스터에 설치된 모든 릴리스 목록을 확인할 수 있다. 이 명령은 릴리스 이름, 네임스페이스, 차트 버전, 상태, 업데이트 시간 등의 정보를 보여준다. 특정 릴리스의 상세 구성과 설정값을 확인하려면 helm get manifest나 helm get values 명령을 사용한다. 또한 helm status 명령을 통해 특정 릴리스의 현재 상태와 배포된 쿠버네티스 리소스 정보를 얻을 수 있다.
릴리스를 삭제할 때는 helm uninstall 명령을 사용한다. 이 명령은 해당 릴리스 이름을 지정하여 실행하며, 차트를 통해 배포된 모든 쿠버네티스 리소스(파드, 디플로이먼트, 서비스 등)를 클러스터에서 제거한다. 삭제 작업은 기본적으로 영구적이다. 삭제 후에도 릴리스의 기록을 보존하려면 --keep-history 옵션을 추가할 수 있으며, 이 경우 릴리스 기록은 남지만 관련 리소스는 제거된다.
릴리스 삭제 외에도 차트 저장소를 관리하는 명령도 있다. helm repo list로 등록된 저장소 목록을 확인하고, helm repo remove로 저장소를 제거할 수 있다. 또한 로컬에 다운로드된 차트 아카이브(.tgz 파일)나 차트 디렉토리는 파일 시스템 명령을 통해 직접 삭제하면 된다. 이러한 관리 및 삭제 명령어들은 헬름을 사용한 애플리케이션 라이프사이클 관리의 필수적인 부분을 구성한다.
5. 사용 사례 및 장점
5. 사용 사례 및 장점
헬름 차트는 복잡한 쿠버네티스 애플리케이션을 패키징하고 배포하는 표준화된 방법을 제공한다. 주로 마이크로서비스 아키텍처 기반의 애플리케이션을 구성하는 여러 컨테이너, 서비스, 디플로이먼트, 컨피그맵 등을 하나의 논리적 단위로 묶어 관리하는 데 사용된다. 이를 통해 개발팀과 운영팀은 애플리케이션을 서로 다른 환경(예: 개발, 스테이징, 프로덕션)에 일관되게 배포할 수 있으며, DevOps 및 CI/CD 파이프라인과의 통합을 용이하게 한다.
헬름 차트의 주요 장점은 애플리케이션 배포의 재현성과 자동화에 있다. 차트 내의 템플릿 엔진과 values.yaml 파일을 통해 환경별 구성(예: 데이터베이스 연결 문자열, 리소스 할당량)을 분리하여 관리할 수 있어, 동일한 차트로 다양한 설정을 적용한 배포가 가능하다. 또한 차트 버전과 애플리케이션 버전을 함께 관리함으로써 특정 시점의 배포 상태를 정확히 추적하고, 필요시 이전 버전으로의 롤백을 손쉽게 수행할 수 있다.
의존성 관리 기능은 또 다른 중요한 장점이다. 애플리케이션이 필요로 하는 외부 데이터베이스, 캐시 서버, 메시지 큐 등의 구성 요소를 차트의 의존성으로 선언하면, 헬름이 자동으로 해당 구성 요소를 함께 설치하거나 업그레이드한다. 이는 복잡한 애플리케이션 스택의 생명주기를 단순화하고, 배포 프로세스의 신뢰성을 높인다.
마지막으로, 헬름과 공개 저장소인 아티팩트 허브는 수많이 검증된 공식 및 커뮤니티 차트를 제공한다. 이를 통해 사용자는 프로메테우스, 그라파나, 엔진엑스와 같은 인기 있는 오픈소스 소프트웨어를 몇 가지 명령어만으로 쿠버네티스 클러스터에 빠르게 설치하고 구성할 수 있어, 인프라 구축 시간을 크게 단축시킨다.
