Search

쿠버네티스 Helm Chart 에 대한 정리

생성일
2024/08/13 14:23
Category
Kubernetes
태그
Kubernetes
Helm

목적

헬름 차트에 대한 개념을 이해한다.

헬름

헬름은 쿠버네티스 패키지 관리자 입니다. 쿠버네티스와 헬름의 관계는 Yum 이나 APT 와 비슷하다고 볼 수 있습니다.
패키지(Chart) 에는 레디스 클러스터, 워드프레스 환경 등의 소프트웨어를 하나의 명령어로 쿠버네티스 클러스터에 배포할 수 있습니다.
롤링 업데이트 등에도 지원하는 것들이 많아 쿠버네티스에서 최적화된 설정으로 사용할 수 있는 장점이 있습니다.
 헬름 v2 와 v3에 대해
헬름은 v3로 버전 업데이트되면서 크게 변경되었습니다. 이전 v2 에서는 쿠버네티스 클러스터 내부에 Tiller 라는 강력한 권한을 가진 시스템 구성 요소가 배포되어 있어야 해서 항상 보안상의 문제가 우려되었었습니다. v3로 업데이트되고 나서 클라이언트 측에서 보안 대책으로 처리가 이루어지면서 이 문제가 해결되었고, 이전보다 쉽게 사용할 수 있게 되었습니다.
헬름 v2 는 2020년 11월에 지원 중단되었으며, 이후 v2 에서 v3로의 마이그레이션 툴 등이 제공되고 있습니다.

헬름 설치

헬름을 사용할 때 필요한 것은 헬름 클라이언트 바이너리 뿐입니다. 환경에 맞게 바이너리를 배포하면 준비 작업은 끝입니다.
# Mac $ OS_TYPE=darwin # Linux $ OS_TYPE=linux # 헬름 버전 $ VERSION=3.2.0 $ cd /tmp $ curl -sL https://get.helm.sh/helm-v${VERSION}-${OS_TYPE}-amd64.tar.gz -o /tmp/helm.tar.gz $ tar -xvf /tamp/helm.tar.gz $ mv ${OS_TYPE}-amd64/helm /usr/local/bin/ $ chmod 755 /usr/local/bin/helm
Bash
복사
bash, zsh 자동 완성 기능도 제공 합니다.
# 자동 완성 기능 활성화 $ source <(helm completion bash) $ source <(helm completion zsh)
Bash
복사
헬름은 클라이언트 측에서 처리하기 때문에 kubectl 과 같은 인증 정보를 사용합니다. 기본적으로 ~/.kube/config 를 사용하지만, 필요에 따라 kubectl 과 마찬가지로 —kubeconfig나 —kube-context 등을 사용 합니다.
헬름에 관한 설정은 helm help 명령어로 확인할 수 있으며, OS 에 따라 디렉터리가 다릅니다.
# 사용 디렉터리 확인 $ helm help
Bash
복사

헬름 저장소 추가

헬름 저장소를 추가하려면 helm repo add 명령어를 사용 합니다.
# Stable 저장소 추가 $ helm repo add stable https://charts.helm.sh/stable # Bitnami 가 제공하는 헬름 저장소 추가 $ helm repo add bitnami https://charts.bitnami.com/bitnami # 등록된 저장소 출력 $ helm repo list # 헬름 저장소 변경 $ helm repo update
Bash
복사

차트 검색

테스트로 nginx 차트를 검새해봅니다.
# 헬름 저장소에서 차트 검색 helm search repo jenkins ─╯ NAME CHART VERSION APP VERSION DESCRIPTION bitnami/jenkins 10.1.3 2.332.3 Jenkins is an open source Continuous Integratio... stable/jenkins 2.5.4 lts DEPRECATED - Open source continuous integration...
Bash
복사

아티팩트 허브

아티팩트 허브는 여러 헬름 저장소를 통합 검색할 수 있는 서비스 입니다.
헬름 커뮤니티가 관리하는 저장소는 물론, 다양한 OSS가 제공하는 헬름 저장소도 등록되어 있습니다.

차트 설치

버전 이외에 설정 가능한 파라미터나 상세한 정보를 확인하려면 helm show 명령어를 사용 합니다.
helm show values bitnami/jenkins
Bash
복사

설치 명령어에 파라미터를 지정하여 설치하는 경우

파라미터가 적은 경우 설치 명령어 안에 파라미터를 지정할 수 있습니다. 헬름 차트에서 덮어 쓰는 파라미터에 대해 —set 옵션을 사용 합니다.
╰─ helm install seoul-jenkins bitnami/jenkins --version 10.1.3 ─╯ NAME: seoul-jenkins LAST DEPLOYED: Thu Jun 2 14:41:15 2022 NAMESPACE: seoul-poc STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: CHART NAME: jenkins CHART VERSION: 10.1.3 APP VERSION: 2.332.3 ** Please be patient while the chart is being deployed ** 1. Get the Jenkins URL by running: ** Please ensure an external IP is associated to the seoul-jenkins service before proceeding ** ** Watch the status using: kubectl get svc --namespace seoul-poc -w seoul-jenkins ** export SERVICE_IP=$(kubectl get svc --namespace seoul-poc seoul-jenkins --template "{{ range (index .status.loadBalancer.ingress 0) }}{{ . }}{{ end }}") echo "Jenkins URL: http://$SERVICE_IP/" 2. Login with the following credentials echo Username: user echo Password: $(kubectl get secret --namespace seoul-poc seoul-jenkins -o jsonpath="{.data.jenkins-password}" | base64 -d)
Bash
복사
Username: user Password: afrRfEglEd
Bash
복사

values 파일을 생성하여 설치하는 경우

파라미터가 많은 경우나 코드화하여 진행하는 경우에는 values 파일을 생성하여 읽어들이는 방법이 있습니다.
jenkinsUser: pocuser jenkinsPassword: poc-pass
YAML
복사
그리고 values 파일을 사용하도록 —values 옵션을 지정하여 설치 합니다.
# Chart 버전 10.9.1 에서 일부 젠킨스 관련 파라미터를 덮어 쓰고 설치 ╰─ helm upgrade seoul-jenkins bitnami/jenkins --version 10.1.3 \ --values values.yaml
Bash
복사

설치한 차트 테스트

설치한 차트가 제대로 동작하는지 확인하려면 helm test 명령어를 사용 합니다.
# 설치한 차트 테스트 실행 ╰─ helm test seoul-jenkins
Bash
복사

템플릿으로 매니페스트 생성

헬름 템플릿 파일을 If 구문이나 Range 구문 등도 사용할 수 있어 복잡해지기 쉽고 실제로 적용되는 매니페스트를 예측하기 어려운 경우도 있습니다. 그래서 helm install 명령어로 애플리케이션을 배포하면 실제로 적용되는 매니페스트가 예상치 못한 방향으로 적용되는 경우도 있습니다.
헬름에는 helm template 라는 명령어가 있습니다. 이 명령어를 사용하면 생성된 매니페스트를 출력만 하고 쿠버네티스 클러스터에 적용하지는 않습니다. 생성된 매니페스트를 확인한 후 별도 kubectl apply 명령어로 적용 합니다.
그래서 CI/CD 파이프라인을 깃옵스로 구성하면, 애플리케이션을 직접 설치하지 않고 템플릿 엔진으로 헬름을 사용하는 경우도 있습니다.

헬름 아키텍처

헬름 클라이언트는 헬름 저장소에서 다운로드한 차트와 values의 조합을 릴리스(Release)로 관리하고 쿠버네티스의 시크릿으로 데이터를 저장합니다. 그래서 별도 데이터베이스가 필요 없다는 것도 한 가지 장점 입니다.
╰─ kubectl get secret -l owner=helm ─╯ NAME TYPE DATA AGE sh.helm.release.v1.seoul-jenkins.v1 helm.sh/release.v1 1 58m sh.helm.release.v1.seoul-jenkins.v2 helm.sh/release.v1 1 8m23s
Bash
복사

릴리스 확인

차트는 설치 후 릴리스로 관리 됩니다. 릴리스 목록을 확인하면 헬름에 설치된 시스템을 확인할 수 있습니다.
# 설치 후 릴리스 확인 ╰─ helm list ─╯ NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION seoul-jenkins seoul-poc 2 2022-06-02 15:30:58.906812 +0900 KST deployed jenkins-10.1.3 2.332.3
Bash
복사

릴리스 삭제

설치한 차트를 삭제하려면 릴리스를 지정하여 삭제 합니다.
# 릴리스 삭제 ╰─ helm uninstall seoul-jenkins
Bash
복사

커스텀 차트 생성

헬름에서는 차트라는 단위로 시스템을 패키징 합니다. 차트 내용은 쿠버네티스의 매니페스트 템플릿과 변수가 메인 입니다. 커스텀 시스템을 패키징하려면 신규로 차트를 생성합니다. 이 생성은 프로그래밍에서 말하는 프레임워크라는 프로젝트를 생성하는 처리입니다.
# 신규 커스텀 차트 양식 생성 ╰─ helm create seoul-poc-eks
Bash
복사
╰─ tree ─╯ . ├── Chart.yaml ├── charts ├── templates │ ├── NOTES.txt │ ├── _helpers.tpl │ ├── deployment.yaml │ ├── hpa.yaml │ ├── ingress.yaml │ ├── service.yaml │ ├── serviceaccount.yaml │ └── tests │ └── test-connection.yaml └── values.yaml 3 directories, 10 files
Bash
복사
차트를 신규로 생성하면 디플로이먼트/서비스/인그레스/HPA/ServiceAccount 리소스 템플릿이 자동으로 생성됩니다. 기본적으로 롤링 업데이트가 가능하도록 디플로이먼트를 사용하여 생성하는 것을 추천하지만, 파드 및 레플리카셋에서도 패키지 생성은 가능 합니다. 차트는 모두 직접 생성해도 좋지만, 쿠버네티스 버전 업그레이드에 따라 이전에는 어노테이션 아래에 지정했던 것이 spec 아래로 변경되는 등 매니페스트 문법이 변경되기도 하기 때문에 기본적으로 helm create 를 사용한 양식으로 생성하는 것을 추천 합니다. 그리고 한번 차트를 생성한 매니페스트도 계속해서 쿠버네티스 버전에 맞춰야 하는데, 헬름에는 자동으로 맞춰주는 기능이 없으므로 매니페스트 유지 보수를 별도로 해야 합니다.
파일명
용도
templates/*.yaml
설치하는 매니페스트 템플릿
templates/tests/*.yaml
설치한 차트가 정상적으로 동작하는지 테스트하는 매니페스트 템플릿
values.yaml
사용자가 나중에 덮어 쓸 수 있는 기본값 정의 리소스 제한, 사용 이미지, 포트 번호 등을 다양하게 제공
templates/NOTES.txt
helm install 시 출력되는 메시지
requirements.yaml
의존하는 차트와 해당 버전 기록
templates/_helpers.tpl
릴리스 이름으로 변수를 정의하는 등의 헬퍼 변수 정의
Chart.yaml
차트 메타데이터