헬름 작동 과정(Helm in Action)

헬름 + 쿠버네티스 가이드북
이민석's avatar
Apr 29, 2024
헬름 작동 과정(Helm in Action)

헬름 + 쿠버네티스 가이드북은 Bharath Thippireddy의 Helm Kubernetes Packaging Manager for Developers and DevOps을 보고 작성되었습니다.

가이드북의 전체 목차 및 인덱싱은 헬름 + 쿠버네티스 가이드북 문서를 참고해주세요.

사전 준비

  1. 헬름 설치하기

  2. 헬름과 큐브콘픽(KUBECONFIG)

  3. 확인하기

헬름 설치하기

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

실습

  1. 많이 쓰는 명령어

  2. bitnami/mysql 설치

  3. biynami/mysql 실행

  4. 네임스페이스 별로 헬름 사용하기

  5. 헬름 리스트 조회하기

많이 쓰는 명령어

레포지토리 등록부터 실제 사용까지 아래의 명령어를 사용해서 작업을 진행합니다.

만약 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) 명령어를 사용하였습니다.

  1. 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
  2. mydb-mysql-clinet 내부에서 mysql 접속하기

    mysql -h mydb-mysql.default.svc.cluster.local -uroot -p"$MYSQL_ROOT_PASSWORD"
    Enter password: <여기에 bitnami/mysql 설치 후에 나온 Password 복사 붙여넣기>
  3. 테이블 조회하기

    1. 명령어

      show databases;
    2. 결과

      mysql> show databases;
      +--------------------+
      | Database           |
      +--------------------+
      | information_schema |
      | my_database        |
      | mysql              |
      | performance_schema |
      | sys                |
      +--------------------+
      5 rows in set (0.00 sec)
  4. mydb-mysql-client가 실행된 상태에서 다른 터미널을 열어서 아래 명령어 입력하기

    1. 명령어

      kubectl get pods
    2. 결과

      NAME                READY   STATUS    RESTARTS   AGE
      mydb-mysql-0        1/1     Running   0          27m
      mydb-mysql-client   1/1     Running   0          6m47s
  5. mydb-mysql-client에서 exit을 입력하여 컨테이너를 종료하고 아래 명령어 입력하기

    1. 명령어

      kubectl delete pod mydb-mysql-client
    2. 결과

      NAME                READY   STATUS        RESTARTS   AGE
      mydb-mysql-0        1/1     Running   0          27m
      mydb-mysql-client   1/1     Terminating   0          9m21s
  6. mydb 제거하고 pod 조회하기

    1. 명령어

      helm uninstall mydb
    2. 결과

      No resources found in default namespace.

네임스페이스 별로 헬름 사용하기

Helm에서 관리하는 이름은 고유해야 합니다.
하지만 고유 범위는 쿠버네티스 네임스페이스에 한정하기 때문에, 여러 개의 네임스페이스에 같은 이름을 사용할 수 있습니다.

예를 들어, 기본 네임스페이스(default)와 새로운 네임스페이스(teamtwo)가 있다면 mydb라는 이름으로 2개의 헬름 차트를 실행할 수 있습니다.

  1. 네임스페이스 생성

    kubectl create ns teamtwo
  2. 1번째 mydb 생성하기

    helm install mydb bitnami/mysql
  3. 2번째 mydb 생성하기

    helm install --namespace teamtwo mydb bitnami/mysql
  4. 전체 pods 조회하기

    Windows11, PowerShell에서는 grep을 설치해야 합니다.

    choco install grep
    1. 명령어

       kubectl get pods --all-namespaces | grep mydb
    2. 결과

      default       mydb-mysql-0                             0/1     Running   1 (39s ago)   2m30s
      teamtwo       mydb-mysql-0                             1/1     Running   0             2m10s
  5. 전체 pods 조회하기(wide option)

    1. 명령어

      kubectl get pods --all-namepsaces -o wide | grep mydb
      
      kubectl get pods -A -o wide | grep mydb
    2. 결과

      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>
  6. 라벨과 함께 전체 pods 조회하기(wide option)

    1. 명령어

      kubectl get pods --all-namespaces -o wide | grep -E "mydb|NAMESPACE"
      
      kubectl get pods -A -o wide | grep -E "mydb|NAMESPACE"
    2. 결과

      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>
  7. 정리하기

    helm uninstall mydb
    helm uninstall mydb -n teamtwo
    kubectl delete ns teamtwo

헬름 리스트 조회하기

  1. 아래 명령어로 헬름 리스트 조회가 가능합니다.

    바로 직전에 helm을 모두 지웠기 떄문에 하나를 다시 배포합니다.

    helm install mydb bitnami/mysql
    1. 명령어

      helm list
    2. 결과

      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

  1. 아래의 명령어를 실행하여 동적 변수를 포함한 헬름 실행

    1. 단일 변수 설정

      helm install mydb bitnami/mysql --set auth.rootPassword = test1234
    2. 변수 파일 사용

      values.yaml 만들기

      전달하고 싶은 단일 변수들의 묶음을 yaml 형식으로 작성하기

      auth:
        rootPassword: "test1234"
      helm install mydb bitnami/mysql --values auth.rootPassword

  1. 헬름 리시트업하기

    helm list

  1. 헬름 레포 업데이트하기

    helm repo update

  1. values.yaml 파일 변경 후, 헬름 차트 업데이트하기

    helm upgrade mydb bitnami/mysql --values values.yaml

  1. helm upgrade mydb bitnami/mysql —reuse-values

헬름 동적 변수 조회하기

챕터 핼름 동적 변수 사용하기와 같이 values.yaml를 사용하면, 쿠버네티스에 환경 변수(Secrets)가 등록이 됩니다.

  1. 아래 명령어로 환경 변수 리스트 조회하기

    1. 명령어

      kubectl get secrets -A | grep -v "kube"
    2. 결과

      NAMESPACE     NAME                         TYPE                            DATA   AGE
      sample        mydb-mysql                   Opaque                          2      13s
      sample        sh.helm.release.v1.mydb.v1   helm.sh/release.v1              1      13s
  2. 환경변수 값 조회하기

    1. kubectl get secret mydb-mysql -n sample -o jsonpath="{.data.mysql-password}" | base64 -d

    2. 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을 참고해주세요.

Share article

Unchaptered