본문 바로가기

IT

Helm, Helm chart

728x90

쿠버네티스(Kubernetes)는 컨테이너화된 애플리케이션을 관리하기 위한 강력한 오케스트레이션 도구로 널리 사용되고 있다. 하지만 쿠버네티스의 기본적인 오브젝트(예: Deployment, Service, ConfigMap 등)를 사용해 복잡한 애플리케이션을 배포하고 관리하는 것은 반복적이고 오류가 발생할 수 있는 작업이다. 이를 해결하기 위해 Helm이 개발되었다.

 

Helm은 쿠버네티스의 패키지 매니저로, 애플리케이션의 배포, 업그레이드, 롤백, 삭제 등을 효율적으로 관리할 수 있도록 도와준다. 이를 통해 인프라스트럭처를 코드로 관리하는 Infrastructure as Code(IaC) 개념을 보다 쉽게 구현할 수 있습니다.

 

Helm이 제공하는 주요 장점은 다음과 같다:

  • 간소화된 배포: Helm Chart를 사용하면 복잡한 애플리케이션의 모든 구성 요소를 하나의 패키지로 관리할 수 있다. 이를 통해 배포 절차가 간소화되고 일관성을 유지할 수 있다.
  • 업그레이드 및 롤백: Helm은 배포된 애플리케이션의 버전을 쉽게 업그레이드하거나 이전 버전으로 롤백할 수 있는 기능을 제공한다. 이는 신속한 오류 복구와 배포 안정성을 높이는 데 도움이 된다.
  • 공유 및 재사용: Helm Chart는 쉽게 공유하고 재사용할 수 있다. 이는 팀 간 협업을 촉진하고, 이미 검증된 배포 구성을 여러 프로젝트에서 사용할 수 있도록 다.
  • 파라미터화된 구성: Helm Chart는 변수(Values)를 사용해 설정을 커스터마이징할 수 있다. 이를 통해 같은 Chart를 다양한 환경에 맞게 쉽게 조정할 수 있다.
  • 템플릿화된 구성: Helm은 Go 템플릿을 사용해 배포 스크립트를 자동으로 생성다. 이는 중복을 줄이고 구성 관리의 유연성을 높인다.

쿠버네티스에서 어플리케이션을 배포하기 위해 필요한 object(리소스)들을 예로 들어보면 아래가 있다.

  • service : pod를 외부 IP를 노출시키기 위해 서비스가 필요하다.
  • deployment : pod를 관리하기 위해 deployment가 필요하다.
  • statefulset : database와 같은 stateful application을 위해 필요하다
  • configMap : external configuration 설정을 위해 필요하다
  • secret : credential과 같은 secret한 정보들을 저장하기 위해 필요하다.

그리고 위와 같은 object들을 생성하기 위해서는 각각 마다 yaml을 생성해주어야 한다. 그리고 위와 같은 yaml파일들을 사전에 정의해두고 패키징 한 뒤에 추후에 쿠버네티스 클러스터에 어플리케이션을 배포할 때 위와 같은 object들을 쉽게 배포하기 위해 패키징한게 바로 helm-chart다.

 

helm chart는 쿠버네티스 리소스를 정의해둔 Yaml파일들의 묶음이다. 실제로 활용해볼 수 있는 helm chart들을 검색해보면 database앱인 mongodb, elasticsearch, monitoring app인 prometheus와 같은 앱들을 쉽게 쿠버네티스 클러스터에 배포할 수 있게 해주는 helm chart들이 public hub에 이미 push돼 있다. 유저들은 그냥 받아서 사용하기만 하면 위와 같은 앱들을 쉽게 쿠버네티스에 배포할 수 있다.

 

helm 설치

$ curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3
$ chmod 700 get_helm.sh
$ ./get_helm.sh

 

Helm은 v2에서 v3로 변하면서 아키텍처적와 개념이 바뀌었다. Helm Server부분이였던 tiller부분이 삭제되었다. 해당 내용은 하기 링크에서 확인 가능하다.

https://helm.sh/docs/topics/v2_v3_migration/

 

Migrating Helm v2 to v3

Learn how to migrate Helm v2 to v3.

helm.sh

 

helm 명령어

Helm 버전 확인하기
helm version

helm 자동완성
source <(helm completion bash)
helm 명령어 입력 후 tap

Helm 가이드
helm completion

repo 검색
helm search repo [keyword]

hub 검색
helm search hub [keyword]
 
레포지토리 관리
helm repo add [name] [url]

레포지토리 리스트 확인
helm repo list

레포지토리 업데이트
helm repo update

레포지토리 삭제
helm repo remove [name]
 
배포 관리
helm install [name] [chart] [flags]

배포 리스트 보기
helm list

배포 상태 확인
helm status

배포 삭제
helm uninstall

 

Helm Chart는 애플리케이션의 배포 구성을 담고 있는 패키지이다. Helm Chart의 기본 구조는 다음과 같습니다:

  • Chart.yaml: 차트의 메타데이터(이름, 버전, 설명 등)를 포함한다.
  • values.yaml: 기본 설정 값을 정의합니다. 이 값들은 사용자가 오버라이드할 수 있습니다.
  • templates/: 쿠버네티스 리소스를 정의하는 템플릿 파일들이 위치한다.
  • charts/: 서브 차트를 포함할 수 있습니다. 복잡한 애플리케이션의 경우 여러 서브 차트를 함께 배포할 수 있다.
.
└── spring-app
    ├── Chart.yaml
    ├── templates
    │   ├── clusterRoleBinding.yaml
    │   ├── configmap.yaml
    │   ├── deployment.yaml
    │   ├── ingress.yaml
    │   ├── role.yaml
    │   ├── roleBinding.yaml
    │   ├── secret.yaml
    │   ├── service.yaml
    │   └── serviceAccount.yaml
    └── values.yaml

 

Chart.yaml

apiVersion: 차트 API 버전 (필수)
name: 차트명 (필수)
version: SemVer 2 버전 (필수)
kubeVersion: 호환되는 쿠버네티스 버전의 SemVer 범위 (선택)
description: 이 프로젝트에 대한 간략한 설명 (선택)
type: 차트 타입 (선택) (application, library)
keywords:
  - 이 프로젝트에 대한 키워드 리스트 (선택)
home: 프로젝트 홈페이지의 URL (선택)
sources:
  - 이 프로젝트의 소스코드 URL 리스트 (선택)
dependencies: # 차트 필요조건들의 리스트 (optional)
  - name: 차트명 (nginx)
    version: 차트의 버전 ("1.2.3")
    repository: 저장소 URL ("https://example.com/charts") 또는 ("@repo-name")
    condition: (선택) 차트들의 활성/비활성을 결정하는 boolean 값을 만드는 yaml 경로 (예시: subchart1.enabled)
    tags: # (선택)
      - 활성화 / 비활성을 함께하기 위해 차트들을 그룹화 할 수 있는 태그들
    enabled: (선택) 차트가 로드될수 있는지 결정하는 boolean
    import-values: # (선택)
      - ImportValues 는 가져올 상위 키에 대한 소스 값의 맵핑을 보유한다. 각 항목은 문자열이거나 하위 / 상위 하위 목록 항목 쌍일 수 있다.
    alias: (선택) 차트에 대한 별명으로 사용된다. 같은 차트를 여러번 추가해야할때 유용하다.
maintainers: # (선택)
  - name: maintainer들의 이름 (각 maintainer마다 필수)
    email: maintainer들의 email (각 maintainer마다 선택)
    url: maintainer에 대한 URL (각 maintainer마다 선택)
icon: 아이콘으로 사용될 SVG나 PNG 이미지 URL (선택)
appVersion: 이 앱의 버전 (선택). SemVer인 필요는 없다.
deprecated: 차트의 deprecated 여부 (선택, boolean)
annotations:
  example: 키로 매핑된 주석들의 리스트 (선택).

 

Chart 패키지

helm package <Chart.yaml 경로>

Chart.yaml에 정의한 <name항목값>-<version항목값>.tgz 로 압축파일이 생성된다.

repository에 helm chart를 등록한다.

Repository는 크게 Local, Public, Private의 3가지 유형이 있다. 필자는 Public repository로 깃을 사용한다.

 

깃헙 프로젝트를 생성 -> index.yaml 생성(helm repo index <tgz>) -> commint & push -> helm 레파지토리 추가(helm repo add github-stable <git tgz주소> -> helm repo list 확인