일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 리액트
- git-hooks
- backend
- Atomic Design 패턴으로 페이지 만들기
- yarn-berry
- Kubernetes
- 롱 폴링
- 배포
- docker
- GHCR
- 캐시
- methodreference
- 디렉토리이동
- 배포자동화
- Infra
- redis
- Atomic Design
- deployment
- 개발
- 자동화
- 쿠버네티스
- aws
- 도커
- react
- styled-components
- 소켓IO
- 인프라
- 백엔드
- 예제
- 스타일 컴포넌트
- Today
- Total
SLASH 기술 블로그
Helm - 쿠버네티스의 패키지 매니저 본문
헬름은 쿠버네티스, 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로 접속을 해보았다. 잘 되는 듯하다!
학습하면서 소모된 시간을 제외하면, 거의 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을 쓰고 있는 만큼, 쿠버네티스를 사용하고 있다면 한 번쯤은 꼭 써봐야하는 기술이라고 생각한다.
나는 사용자 관점에서의 이야기를 조금 다루었지만 관심이 있는 분들이라면 조금 더 심도있게 알아보기를 권한다. 짧은 글이지만 도움이 되었기를 바라며 글을 마친다.
'인프라 > 쿠버네티스' 카테고리의 다른 글
쿠버네티스로 배포하기 4 - 배포 과정 단순화하기 (Skaffold) (1) | 2021.08.03 |
---|---|
쿠버네티스로 배포하기 3 - 서비스 노출하기 (Ingress) (0) | 2021.05.30 |
쿠버네티스로 배포하기 2 - 쿠버네티스에 이미지 올리기 (0) | 2021.05.19 |
Kubernetes에서 GitHub Container Registry 사용 시 주의점 (0) | 2021.05.10 |
쿠버네티스로 배포하기 1 - 어플리케이션 컨테이너화 (0) | 2021.05.09 |