본문 바로가기

윈도우 개발환경

쿠버네티스로 MSA DevOps 환경 구축; 6. Helm | Chart - 패키지 설치

쿠버네티스로 MSA DevOps 환경 구축

1. 로컬 쿠버네티스설치

2. 로컬 컨테이너 Registry

3. Pod, Service, Deployment

4. 포트포워딩 없는 Minikube

5. URL기반 Service - Ingress

6. Helm | Chart - 패키지 설치

7. Helm | Chart - 패키지 만들기

8. ArgoCD - GitOps

8. Helm 사용하기

쿠버네티스는 예를 들어 하나의 마이크로서비스, 또는 API서비스를 배포하기 위해 많은 절차를 거쳐야 한다. Docker image를 찾아 Pod템플릿을 만들고 ReplicaSet을 정의해서 Deployment를 만들고, Service를 정의하고 Deployment와 연결해 주는 작업을 해야 하는데, 이 작업을 새로운 API서비스를 만들 때마다 해야 한다. 만약 한 번만 만들면 모든 API서비스 배포에 사용할 수 있다면? 여러 단계의 명령을 하나로 줄일 수 있다면?

 

이런 작업은 쿠버네티스에 소프트웨어를 설치할 때에도 같이 적용되는데, 예를 들어 MySQL을 설치한다고 하면, MySQL docker image를 사용해서 Pod를 템플릿으로 만들고 ReplicaSet으로 정의해서 Deployment파일을 만들고, Service파일까지 만들어야 쿠버네티스에 배포가 되고 MySQL을 개발이나 운영에 사용할 수가 있다. 만약 install명령 하나로 MySQL을 사용할 수 있게 준비해 준다면?

 

이런 고민들을 해결해 주는 것이 쿠버네티스의 패키지 매니저, Helm이다. Helm을 사용하면,

 

  • Artifact Hub에서 찾을 수 있는 많은 소프트웨어를 install 명령으로 쉽게 배포할 수 있고,
  • 배포하는 소프트웨어, 또는 서비스와 연관된 소프트웨어(dependency)를 같이 배포, 관리할 수 있고,
  • 쿠버네티스 배포와 관련된 파일들(templates)과, 배포에 필요한 변수정의(value.yml)를 분리하여,
  • 비슷한 소프트웨어 패키지의 배포에는 같은 templates를 적용할 수 있고,
  • 버전관리를 통해 체계적으로 upgrade와 rollback 할 수 있다.

a. Helm 설치

 

Helm

 

v3-1-0.helm.sh

Helm의 공홈에는 Helm을 윈도우에 설치하기 위해 chocolatey를 사용하도록 권하고 있는데, 나는 노트북에 설치되어 있는 winget을 이용하여 설치하기로 했다. winget은 윈도우가 사용을 권하고 있는 듯하고, chocolatey는 오픈소스 쪽에서 권하고 있는 듯한데, 쉽게 사용하기에는 winget이 더 좋다.

 

winget install Helm.Helm

 

만일, 윈도우 터미널에서 winget명령이 실행되지 않거나, winget에 대한 정보를 알고 싶다면 아래를 참고하면 된다.

 

WinGet 도구를 사용하여 애플리케이션 설치 및 관리

WinGet 명령줄 도구를 사용하면 개발자가 Windows 컴퓨터에서 애플리케이션을 검색, 설치, 업그레이드, 제거 및 구성할 수 있습니다.

learn.microsoft.com

b. helm을 이용한 소프트웨어 패키지(Chart) 설치

다른 패키지 관리자와 마찬가지로 helm도 패키지(Chart)를 검색할 수 있는 Artifact Hub라는 공식 페이지가 있다.

 

Artifact Hub

Find, install and publish Cloud Native packages

artifacthub.io

Docker처럼 Artifact Hub에 있는 소프트웨어 패키지(Char)를 helm명령으로도 직접 검색할 수 있지만, 

 

helm search hub <검색대상>
ex) helm search hum mariadb

 

Docker와는 달리 패키지를 만드는 단체가 많아, 하나의 소프트웨어를 검색해도 많은 패키지(Chart)가 검색되어 나오기 때문에 어떤 패키지(Chart)를 설치해야 할지 선택하는 것이 쉽지 않다. 

 

그래서 Artifact Hub 페이지를 이용해서 패키지를 찾고, 설치에 필요한 명령어도 복사해서 사용하는 편이 편리하다. 뿐만 아니라, 패키지마다 values.yml파일의 내용도 다르기 때문에, 설치할 때 값을 변경하려면 설명을 참고하는 것이 좋다.

 

왼쪽에서 패키지(Chart) 선호도와 날짜를 확인할 수 있고, 선택하면 나오는 오른쪽 페이지에서 상세정보 확인 가능
왼쪽은 INSTALL을 눌렀을 때 나오는 설치 방법, 오른쪽은 VALUE SCHEMA를 선택하면 나오는 매개변수의 정의

화면에서 예제로 선택한 mariadb를 내 쿠버네티스 클러스터에 설치하려면,

 

  • INSTALL화면에 있는 두 명령어를 차례로 복사해서 실행한다.
helm repo add bitnami https://charts.bitnami.com/bitnami
helm install my-mariadb bitnami/mariadb --version 19.0.5

 

  • 설치하면 나오는 README의 내용을 참고하여 쿠버네티스에 설치된 mariadb에 접속한다.

설명을 따르면 mariadb에 로그인 하려면, 

 

Username: root
Password : $(kubectl get secret --namespace default my-mariadb -o jsonpath="{.data.mariadb-root-password}" | base64 -d)

 

를 사용하라고 되어 있는데, "$(kubectl ...)"명령이 리눅스 명령이기 때문에 Git Bash에서 아래를 실행하거나,

 

echo $(kubectl get secret --namespace default my-mariadb -o jsonpath="{.data.mariadb-root-password}" | base64 -d)

 

윈도우의 PowerShell에서 아래를 실행하면

 

kubectl get secret --namespace default my-mariadb -o jsonpath="{.data.mariadb-root-password}" | %{[Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($_))}

 

root의 password를 얻을 수 있다.

 

이렇게 하는 이유는 쿠버네티스가 secret.yml에 선언된 값을 보여줄 때 base64로 인코딩해서 보여주기 때문에, 다시 디코딩해야 사용할 수 있는 실제 값이 나오기 때문이다.

 

helm으로 설치한 mariadb의 Service를 kubectl을 사용해서  확인해 보면 type이 ClusterIP로 나오기 때문에 클러스터 내에서만 접속이 가능하다.

 

mariadb에 접속하기 위해서는 README에서 설명한 것처럼 mariadb가 설치되어 있는 Pod를 임시로 만들고 연결해서,

 

kubectl run my-mariadb-client --rm --tty -i --restart="Never" --image  docker.io/bitnami/mariadb:11.4.3-debian-12-r0 --namespace default --command -- bash

 

mysql client를 실행한 다음,

 

mysql -h my-mariadb.default.svc.cluster.local -uroot -p

 

앞에서 얻은 password를 복사해서 넣으면 연결이 되고, mysql명령을 수행할 수 있다.

 

  • 포트포워딩을 사용하여 VSCode와 같이 외부 프로그램에서 연결할 수 있게 만들 수도 있다.
kubectl port-forward svc/my-mariadb 3306

 

  • 설치한 mariadb를 삭제하려면, 설치할 때 사용한 이름 "my-mariadb"를 참조해서 uninstall 하면 된다.
helm uninstall my-mariadb