헬름 + 쿠버네티스 가이드북은 Bharath Thippireddy의 Helm Kubernetes Packaging Manager for Developers and DevOps을 보고 작성되었습니다.
가이드북의 전체 목차 및 인덱싱은 헬름 + 쿠버네티스 가이드북 문서를 참고해주세요.
사전 준비
헬름 설치하기
헬름과 큐브콘픽(KUBECONFIG)
확인하기
헬름 설치하기
Helm(Docs) | Installing Helm # From Chocolatey Windows를 참고하여 헬름을 설치하였습니다.
헬름과 큐브콘픽(KUBECONFIG)
만약 헬름과 kubectl을 모두 설치하였다면 시스템 사용자 경로 하위에 큐브콘픽파일이 생겼을 것입니다.
~/.kube/config
헬름은 이 파일을 참조하여 작업을 진행합니다.
이 파일은 kubectl 설치 시에 생성되지만, Docker Desktop for Windows를 예전에 설치한 PC에는 하위 디렉토리에 kubectl이 깔려 있습니다. 이 경우, 아래의 트러블 슈팅 문서를 참조해주세요.
만약 kubectl에서 8080 엑세스 관련 에러가 나온다면 Docker Desktop for Windows의 설정에서 Kubernetes를 활성화하고 잠시 기다려주세요.
→ 자세한 트러블 슈팅 문서 보기
→ Unchaptered(Blog) | Unable to connect to the server / Kubernetes cluster unreachable
클러스터 환경과 이를 구성하는 minikube
전체 실습에서는 minikube를 사용하고 있지만 Docker Desktop for Windows에서 내부로 제공해주는 Kubernetes Cluster도 정상적으로 작동합니다.
이미 Docker를 사용 중인 PC라면 그대로 사용하는게 좋아보입니다.
단 설치를 하고 싶다면 Minikube (Docs) | minikube start를 참고하여 운영체제 별로 설치를 진행하면 됩니다.
확인하기
아래 명령어를 쳐서 helm, kubectl의 설치 성공을 확인합니다.
helm --help
kubectl --help
실습
많이 쓰는 명령어
bitnami/mysql 설치
biynami/mysql 실행
네임스페이스 별로 헬름 사용하기
헬름 리스트 조회하기
많이 쓰는 명령어
레포지토리 등록부터 실제 사용까지 아래의 명령어를 사용해서 작업을 진행합니다.
만약 kubectl에서 8080 엑세스 관련 에러가 나온다면 Docker Desktop for Windows의 설정에서 Kubernetes를 활성화하고 잠시 기다려주세요.
→ 자세한 트러블 슈팅 문서 보기
→ Unchaptered(Blog) | Unable to connect to the server / Kubernetes cluster unreachable
Helm Repo List
helm repo list helm repo add bitanmi https://charts.bitnami.com/bitnami helm repo list helm repo remove bitnami helm repo add bitnami https://charts.bitnami.com/bitnami
Search the Repo
helm search repo mysql helm search repo database helm search repo database helm search repo database --version
Install a Package
kubectl get pods (Below Two commands - In a Different Shell/Commandline window/tab) minikube ssh docker images helm install mydb bitnami/mysql
Check the Cluster
kubectl get pods minikube ssh docker images
To check the Installation Status:
helm status mydb
To upgrade
ROOT_PASSWORD=$(kubectl get secret --namespace default mydb-mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode) helm upgrade --namespace default mysql-release bitnami/mysql --set auth.rootPassword=$ROOT_PASSWORD
Remove
helm uninstall mysql-release
bitnami/mysql 설치
아래 명령어를 실행해주세요.
helm install mydb bitnami/mysql
명령어 결과로 다음과 같은 문구가 나옵니다.
** Please be patient while the chart is being deployed **
Tip:
Watch the deployment status using the command: kubectl get pods -w --namespace default
Services:
echo Primary: mydb-mysql.default.svc.cluster.local:3306
Execute the following to get the administrator credentials:
echo Username: root
echo Password=$(kubectl get secret --namespace default mydb-mysql -o jsonpath="{.data.mysql-root-password}" | base64 -d)
To connect to your database:
1. Run a pod that you can use as a client:
kubectl run mydb-mysql-client --rm --tty -i --restart='Never' --image docker.io/bitnami/mysql:8.0.36-debian-12-r10 --namespace default --env MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD --command -- bash
2. To connect to primary service (read/write):
mysql -h mydb-mysql.default.svc.cluster.local -uroot -p"$MYSQL_ROOT_PASSWORD"
WARNING: There are "resources" sections in the chart not set. Using "resourcesPreset" is not recommended for production. For production installations, please set the following values according to your workload needs:
- primary.resources
- secondary.resources
+info https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
여기서 몇 가지 환경변수를 등록해야 합니다.
저는 Windows 11 + PowerShell을 사용하기 때문에 아래와 같이 변형하여 입력하였습니다.
Primary
echo Primary: mydb-mysql.default.svc.cluster.local:3306
Username
echo Username: root
Password
여기서 찾은 Password는 이후 bitnami/mysql의 client 컨테이너 내부의 password로 사용됩니다.
또한 password는 디코드 해야하지만, Windows11에 있는 cmd/PowerShell/GitCMD 에서는 base64 -d가 지원되지 않습니다.
MacOS / Linux
echo Password=$(kubectl get secret --namespace default mydb-mysql -o jsonpath="{.data.mysql-root-password}" | base64 -d)
Windows11
방법 1 : base64 설치
패키지 매니저를 사용해서 base64를 설치하면, 커맨드가 작동합니다. 2024-04-29PowerShell에서 작동확인되었습니다.
choco install base64 echo Password=$(kubectl get secret --namespace default mydb-mysql -o jsonpath="{.data.mysql-root-password}" | base64 -d)
방법 2 : Base 64 디코딩 및 인코딩 사이트 사용
bitnami/mysql 실행
위에서 나온 스크립트 중 인터렉티브 런(run -it) 명령어를 사용하였습니다.
mydb-mysql-client 실행하기
kubectl run mydb-mysql-client --rm --tty -i --restart='Never' --image docker.io/bitnami/mysql:8.0.36-debian-12-r10 --namespace default --env MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD --command -- bash
mydb-mysql-clinet 내부에서 mysql 접속하기
mysql -h mydb-mysql.default.svc.cluster.local -uroot -p"$MYSQL_ROOT_PASSWORD" Enter password: <여기에 bitnami/mysql 설치 후에 나온 Password 복사 붙여넣기>
테이블 조회하기
명령어
show databases;
결과
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | my_database | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.00 sec)
mydb-mysql-client가 실행된 상태에서 다른 터미널을 열어서 아래 명령어 입력하기
명령어
kubectl get pods
결과
NAME READY STATUS RESTARTS AGE mydb-mysql-0 1/1 Running 0 27m mydb-mysql-client 1/1 Running 0 6m47s
mydb-mysql-client에서
exit
을 입력하여 컨테이너를 종료하고 아래 명령어 입력하기명령어
kubectl delete pod mydb-mysql-client
결과
NAME READY STATUS RESTARTS AGE mydb-mysql-0 1/1 Running 0 27m mydb-mysql-client 1/1 Terminating 0 9m21s
mydb 제거하고 pod 조회하기
명령어
helm uninstall mydb
결과
No resources found in default namespace.
네임스페이스 별로 헬름 사용하기
Helm에서 관리하는 이름은 고유해야 합니다.
하지만 고유 범위는 쿠버네티스 네임스페이스에 한정하기 때문에, 여러 개의 네임스페이스에 같은 이름을 사용할 수 있습니다.
예를 들어, 기본 네임스페이스(default)와 새로운 네임스페이스(teamtwo)가 있다면 mydb라는 이름으로 2개의 헬름 차트를 실행할 수 있습니다.
네임스페이스 생성
kubectl create ns teamtwo
1번째 mydb 생성하기
helm install mydb bitnami/mysql
2번째 mydb 생성하기
helm install --namespace teamtwo mydb bitnami/mysql
전체 pods 조회하기
Windows11, PowerShell에서는 grep을 설치해야 합니다.
choco install grep
명령어
kubectl get pods --all-namespaces | grep mydb
결과
default mydb-mysql-0 0/1 Running 1 (39s ago) 2m30s teamtwo mydb-mysql-0 1/1 Running 0 2m10s
전체 pods 조회하기(wide option)
명령어
kubectl get pods --all-namepsaces -o wide | grep mydb kubectl get pods -A -o wide | grep mydb
결과
default mydb-mysql-0 0/1 Running 1 (97s ago) 3m28s 10.1.0.11 docker-desktop <none> <none> teamtwo mydb-mysql-0 1/1 Running 0 3m8s 10.1.0.12 docker-desktop <none> <none>
라벨과 함께 전체 pods 조회하기(wide option)
명령어
kubectl get pods --all-namespaces -o wide | grep -E "mydb|NAMESPACE" kubectl get pods -A -o wide | grep -E "mydb|NAMESPACE"
결과
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES default mydb-mysql-0 0/1 Running 3 (52s ago) 6m24s 10.1.0.11 docker-desktop <none> <none> teamtwo mydb-mysql-0 1/1 Running 0 6m4s 10.1.0.12 docker-desktop <none> <none>
정리하기
helm uninstall mydb helm uninstall mydb -n teamtwo kubectl delete ns teamtwo
헬름 리스트 조회하기
아래 명령어로 헬름 리스트 조회가 가능합니다.
바로 직전에 helm을 모두 지웠기 떄문에 하나를 다시 배포합니다.
helm install mydb bitnami/mysql
명령어
helm list
결과
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION mydb default 1 2024-04-29 16:42:58.6910642 +0900 KST deployed mysql-10.1.1 8.0.36
헬름 동적 변수 사용하기
주의사항
헬름을 처음 사용 할 때, values.yaml이라는 동적 변수 파일을 사용하였을 것입니다.
하지만 이후에 helm upgrade <이름> <배포자>/<이름>을 실행할 때, values.yaml 파일을 명시하지 않으면 기본값이 사용됩니다.
따라서 모든 helm upgrade 구문에는 동적 변수 파일을 명시해야 합니다.
GOOD : helm upgrade mydb bitnami/mysql --values values.yaml
BAD : helm upgrdae mydb bitnami/mysql
아래의 명령어를 실행하여 동적 변수를 포함한 헬름 실행
단일 변수 설정
helm install mydb bitnami/mysql --set auth.rootPassword = test1234
변수 파일 사용
values.yaml 만들기
전달하고 싶은 단일 변수들의 묶음을 yaml 형식으로 작성하기
auth: rootPassword: "test1234"
helm install mydb bitnami/mysql --values auth.rootPassword
헬름 리시트업하기
helm list
헬름 레포 업데이트하기
helm repo update
values.yaml
파일 변경 후, 헬름 차트 업데이트하기helm upgrade mydb bitnami/mysql --values values.yaml
helm upgrade mydb bitnami/mysql —reuse-values
헬름 동적 변수 조회하기
챕터 핼름 동적 변수 사용하기와 같이 values.yaml를 사용하면, 쿠버네티스에 환경 변수(Secrets)가 등록이 됩니다.
아래 명령어로 환경 변수 리스트 조회하기
명령어
kubectl get secrets -A | grep -v "kube"
결과
NAMESPACE NAME TYPE DATA AGE sample mydb-mysql Opaque 2 13s sample sh.helm.release.v1.mydb.v1 helm.sh/release.v1 1 13s
환경변수 값 조회하기
kubectl get secret mydb-mysql -n sample -o jsonpath="{.data.mysql-password}" | base64 -d
kubectl get secret mydb-mysql -n sample -o jsonpath="{.data.mysql-root-password}" | base64 -d
더 자세하게 Helm Secrets를 제어하는 방법 GitGuardian (Blog) | How to Handle Secrets in Helm을 참고해주세요.