SLASH 기술 블로그

Helm - 쿠버네티스의 패키지 매니저 본문

인프라/쿠버네티스

Helm - 쿠버네티스의 패키지 매니저

SLASH 2021. 6. 21. 22:28
반응형

헬름은 쿠버네티스, etcd와 같은 CNCF Graduated Projects 중 하나로, 쿠버네티스의 패키지 매니저이다.

 

패키지? npm이나 Homebrew같은 것이라면 익숙하지만 쿠버네티스에서 관리할 패키지가 있나?

쿠버네티스에서 "패키지"가 존재한다는 개념을 이해하기 어려울 것이다.

Helm이 등장하게 된 배경을 알아보면서, 쿠버네티스의 패키지 개념을 파악해보자!

 

배경

쿠버네티스 클러스터를 사용하다보면 관리해야 할 오브젝트가 무척이나 많다. 하나의 어플리케이션 단위로 배포를 하기 위해서는 Deployment, ConfigMap, Service 등의 리소스가 하나로 묶여야 하고, 필요에 따라서는 ConfigMap의 환경 변수나 Deployment의 레플리카 수를 조절해야 할 수도 있다. (개발 환경에 따라 서버의 수를 다르게 하는 경우를 생각해보자.)

 

Kubernetes 개념 파악하기에서 컨테이너 오케스트레이션 기술에 대해 이야기했던 것처럼, 결국 또 다시 관리 이슈로 인해 복잡성이 증가했고, 이러한 복잡성을 해소하려는 노력의 일환으로 등장한 것이 Helm이다.

 

Helm에서는 필요한 쿠버네티스 리소스들을 하나로 묶어서 패키징할 수 있다. 우리가 Homebrew같은 패키지 매니저를 통해서 다양한 명령어를 brew install 만으로 곧장 사용할 수 있는 것처럼, Helm을 통해서 다양한 어플리케이션을 곧바로 배포할 수 있다.

 

말만 들어서는 잘 모르겠으니 얼마나 편한지 직접 한 번 써보자! 

 

직접 써보기 - Jenkins 서버 구축

젠킨스는 강력한 기능을 가진 만큼 설정이 어려운 것으로 악명이 높다. Helm을 사용하면 서버를 조금 더 편하게 구축할 수 있을까?

 

테스트를 위해서 먼저 minikube로 로컬에 쿠버네티스 클러스터를 만들어주고, 아티팩트 허브의 젠킨스 차트 페이지에 나와있는 대로 repo를 추가한 다음 install을 해주었다.

❯ minikube start
❯ helm repo add jenkins https://charts.jenkins.io
❯ helm install jenkins

 

kubectl get을 통해 jenkins 서비스와 pod이 제대로 생성된 것을 확인할 수 있다.

초기 실행에 필요한 것들이 많은지, 5분 정도 지났는데 아직도 초기화 중.

❯ kubectl get po,svc
NAME                       READY   STATUS     RESTARTS   AGE
pod/jenkins-1620287776-0   0/2     Init:0/1   0          4m51s

NAME                               TYPE        CLUSTER-IP     ...
service/jenkins-1620287776         ClusterIP   10.96.25.159  
service/jenkins-1620287776-agent   ClusterIP   10.107.164.116

 

15분 정도 경과 후, 드디어 초기화가 완료되었다. Helm에서 차트를 인스톨해 새로운 릴리즈를 생성하면 릴리즈의 상태와 함께 생성 이후 해야할 작업들을 알려준다. (helm get notes <release-name> 명령으로도 볼 수 있다)

NOTES
1. Get your 'admin' user password by running:
  kubectl exec --namespace default -it svc/jenkins-1620287776 -c jenkins -- /bin/cat /run/secrets/chart-admin-password && echo

2. Get the Jenkins URL to visit by running these commands in the same shell:
  echo http://127.0.0.1:8080
  kubectl --namespace default port-forward svc/jenkins-1620287776 8080:8080
...

 

노트에 나와있는대로 컨테이너에 접속해 어드민 비밀번호를 확인하고 URL로 접속을 해보았다. 잘 되는 듯하다!

127.0.0.1:8080으로 접속.


학습하면서 소모된 시간을 제외하면, 거의 20분 내로 젠킨스 서버 하나를 구축했다. 이마저도 대부분은 부팅에 필요한 시간이었다. Helm을 통해서 배포를 했기 때문에, 젠킨스가 버전을 업데이트하면 역시 명령어 한 두 개로 손쉽게 서버를 업그레이드할 수 있다.

 

Helm의 매커니즘

Helm을 통해서 젠킨스같은 온프레미스 서비스를 쉽게 구축해서 사용할 수 있는 것도 좋지만, 사실 대부분은 쿠버네티스 배포를 위해서 Helm을 사용하는 경우가 많을 것이다. (Draft같은 서비스에서는 Helm 사용이 필수적이다. 애초에 같은 사람이 만들어서...)

 

이렇게 자신이 만든 어플리케이션을 쿠버네티스를 통해 배포를 할 경우, 직접 차트(Chart)를 만들어야 한다.

 

Helm의 차트는 Homebrew의 포뮬러와 비슷하게, 어플리케이션 실행을 위해 쿠버네티스 클러스터에서 필요한 모든 리소스 정의를 가지고 있는 패키지이다. 이 차트를 쿠버네티스 클러스터에 설치하면 새로운 릴리즈가 생성된다.

 

공식 사이트에서는 Helm의 기본 매커니즘을 다음과 같이 소개했다.

헬름은 쿠버네티스 내부에 charts 를 설치하고, 각 설치에 대해 새로운 release 를 생성한다. 새로운 차트를 찾기 위해 헬름 차트 repositories 를 검색할 수 있다.

 

사용 흐름

본래라면 차트에 대해 좀 더 자세하게 설명하고 직접 만들어보는 과정이 들어가야 맞을 것 같다. 나는 차트를 써보는 것은 많이 했지만 직접 만들어본 적은 없었기 때문에 그 대신 Helm을 사용할 때 어떤 과정을 통해서 차트를 설치하고 사용하게 되는지, 전체적인 흐름을 이야기하는 게 더 좋을 것 같다.

 

일반적으로 helm repo add, helm install 을 통해서 차트를 설치하고,

❯ helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
❯ helm install ingress-nginx ingress-nginx/ingress-nginx

 

이후 helm show <command> 를 통해서 세부 설정을 고쳐나간 다음 helm upgrade를 통해서 업그레이드를 하게 된다. 필요하다면 네임스페이스나 버전을 지정할 수도 있다.

❯ helm show values ingress-nginx/ingress-nginx
❯ helm upgrade ingress-nginx ingress-nginx/ingress-nginx --values nginx-values.yaml

 

보통은 차트를 설치하면 어떻게 접근하거나 사용하는지에 대한 지시가 나오는데, (이러한 지시 사항은 helm get notes를 통해서 볼 수 있다) 이 과정까지 하나로 스크립트로 묶어서 사용하면 편하다. 일례로 다음과 같은 식이다.

RELEASE_NAME=bser-airflow
NAMESPACE=bser

# Upgrade existing chart with values
helm upgrade $RELEASE_NAME airflow-stable/airflow \
    --namespace $NAMESPACE \
    --version 8.1.3 \
    --values airflow/values.yaml

# Get the pod name to access
export POD_NAME=$(kubectl get pods --namespace bser -l "component=web,app=airflow" -o jsonpath="{.items[0].metadata.name}")

# Use port-forwarding to access Airflow web server (8080 port)
kubectl port-forward --namespace $NAMESPACE $POD_NAME 8080:8080

 

아래는 Helm을 사용하면서 유용하게 썼던 명령어들을 모아놓은 것이다.

# Repo 추가
helm repo add <name> <url>
helm repo add stable https://charts.helm.sh/stable
heml repo update

# 로컬에 설치된 Repo에서 Chart 검색
helm search repo <keyword>
helm search repo mysql

# 공개 Hub에서 Chart 검색
helm search hub <keyword>
helm search hub mysql

# 기본 설정으로 Chart 설치
helm install <chart> --generate-name
helm install stable/mysql --generate-name
helm install <name> <chart>
helm install mydb stable/mysql  # 이름 지정

# 설정을 오버라이딩하면서 Chart 설치
echo "{username: turastory}" > config.yaml
helm install -f config.yaml ...
helm install --values config.yaml ...
heml install --set username=turastory ... # in cli

# Chart를 설치하면 새로운 릴리즈를 생성 - 여러 버전의 차트를 이름으로 식별하고 관리할 수 있음.

# Chart 정보 보기
helm show <command> <chart>
helm show chart stable/mysql
helm show values stable/mysql
helm show readme stable/mysql
helm show all stable/mysql

# Chart에 관한 노트 보기
helm get notes <chart>

# 릴리즈된 Chart 목록 보기
helm ls
helm list

# Chart 제거 - 여기서 이름은 --generate-name을 통해 생성된 이름 / 혹은 직접 지정한 이름
helm uninstall <name>
helm uninstall mysql-1620279723

# Chart 제거 (이력 보존)
helm uninstall <name> --keep-history
helm uninstall mysql-1620279723 --keep-history

# 릴리즈 상태/이력 보기
helm status <name>
helm history <name>
helm history mysql-1620279723

# 지정된 버전으로 롤백 (--keep-history 플래그로 이력을 남겼을 경우)
helm rollback <name> <revision>
helm rollback mysql-1620279723 1

# 릴리즈 업그레이드 (구성 변경 or 버전 업)
helm upgrade -f config.yaml <name> <chart>

# Chart 생성
helm create <chart-name>

Helm에 대해 간단히 알아보았다.

 

kubectl만으로도 서비스를 구축하고 사용하는 데에 큰 문제는 없다. 그렇지만 다른 패키지 매니저가 그러하듯 다양한 패키지의 사용을 편하게 만들어주고, 이제는 거의 공식이라고 할 수 있을 정도로 많은 서비스들이 Helm을 쓰고 있는 만큼, 쿠버네티스를 사용하고 있다면 한 번쯤은 꼭 써봐야하는 기술이라고 생각한다.

 

나는 사용자 관점에서의 이야기를 조금 다루었지만 관심이 있는 분들이라면 조금 더 심도있게 알아보기를 권한다. 짧은 글이지만 도움이 되었기를 바라며 글을 마친다.

 

@turastory

반응형
Comments