보뇨 다이어리

[CKA] Cluster Architecture - Helm 본문

컴퓨터 관련/Docker, Kubernetes 정보

[CKA] Cluster Architecture - Helm

보뇨 2026. 9. 25. 19:23
반응형

[8. Helm]

출제 비중: 중간. 커리큘럼에 "Helm으로 클러스터 컴포넌트 설치"가 명시돼 있어 보통 한 문제.
설치, 업그레이드, 롤백, 렌더링 결과 저장 중 하나가 나온다.
관련 문제: 0020 (Helm 설치와 업그레이드)


1. 왜 Helm을 쓰나

  앱 하나를 배포하려면 Deployment, Service, ConfigMap 같은 YAML이 여러 개 필요하다.
  환경마다 replicas나 이미지 태그만 조금씩 다른데,
  YAML을 통째로 복사해서 관리하면 금방 엉망이 된다.
  Helm은 YAML을 템플릿으로 만들고, 바뀌는 값만 따로 넣게 해준다.
  apt나 brew 같은 패키지 매니저라고 생각하면 된다.


2. 용어 4개

    chart      템플릿 YAML과 기본값 묶음. 보통 .tgz 파일          = 설치 프로그램
    values     템플릿에 넣을 값. --set 이나 -f values.yaml 로 덮어씀  = 설치 옵션
    release    차트를 클러스터에 설치한 인스턴스 하나              = 설치된 프로그램
    revision   release 의 변경 이력 번호. install 이 1, upgrade 마다 +1 = 버전 기록

  같은 차트로 release 를 여러 개 설치할 수 있다.
  예) shop-web 과 admin-web 을 같은 webapp 차트로 따로 띄움.


3. 시험 명령

  차트 찾기와 확인
    helm repo add <name> <url> && helm repo update
    helm search repo <kw> --versions                  차트 버전 목록
    helm show values <chart>                          바꿀 수 있는 값 확인

  설치, 변경, 삭제
    helm install <release> <chart> -n <ns> --create-namespace --version X --set k=v
    helm upgrade <release> <chart> -n <ns> --version Y
    helm rollback <release> <rev> -n <ns>
    helm uninstall <release> -n <ns>

  조회
    helm list -A
    helm history <release> -n <ns>

  렌더링만 (설치 안 함)
    helm template <release> <chart> -f values.yaml > out.yaml

  chart 자리에 들어가는 것
    repo 차트   : <repo 이름>/<차트 이름>       예) bitnami/nginx
    로컬 파일   : 파일 경로 그대로               예) /tmp/charts/webapp-0.1.0.tgz
    로컬 파일은 repo add 가 필요 없다.


4. show 와 get 의 차이

    helm show values     설치 전 "차트"를 본다       넣는 값: repo/chart 또는 tgz 경로
    helm get values      설치된 "release"를 본다     넣는 값: release 이름 + -n

  release 이름을 show 에 넣으면 이런 에러가 난다.
    Error: non-absolute URLs should be in form of repo_name/path_to_chart
  helm list 의 CHART 열 (예: aipub-backend-api-0.1.0) 도 차트 이름+버전 표시일 뿐,
  차트 파일 경로가 아니다.

  설치된 release 조회
    helm get values <release> -n <ns>            설치할 때 사용자가 넣은 값만
    helm get values <release> -n <ns> --all      차트 기본값까지 합친 전체 값
    helm get manifest <release> -n <ns>          실제로 적용된 YAML
    helm history <release> -n <ns>               revision 이력

  get values 에서 아무것도 안 나오면 기본값 그대로 설치했다는 뜻.


5. 함정

  - upgrade 하면 이전 --set 값이 사라진다.
    upgrade 는 기본적으로 차트 기본값에서 다시 시작한다.
    이전에 준 값은 다시 넣거나 옵션으로 유지해야 한다. (0020 의 핵심)
  - -n 누락. release 는 네임스페이스에 속한다.
    빼먹으면 default 에서 찾아서 "not found".
  - rollback 도 revision 이 +1 된다.
    1로 롤백하면 revision 1이 되는 게 아니라, 1의 내용으로 새 revision 이 생긴다.
  - 권한. helm 은 kubectl 과 같은 kubeconfig 를 쓴다.
    list 를 sudo 로 쳤다면 get 도 sudo 로 쳐야 같은 클러스터를 본다.


6. 실무 팁: 특정 Pod 의 설정값 찾기

  helm get manifest 는 release 가 만든 모든 리소스의 YAML 을 한 번에 보여준다.
  ConfigMap, env, 이미지 태그를 찾을 때 grep 으로 바로 찾으면 된다.

    sudo helm get manifest aipub-backend-api -n aipub | grep -n -A20 "kind: ConfigMap"
    sudo helm get manifest aipub-backend-api -n aipub | grep -n "image:"
    sudo helm get manifest aipub-backend-api -n aipub | grep -n -B2 -A2 "<찾는 키>"

  주의
    - manifest 는 "helm 이 마지막으로 적용한 내용"이다.
      누가 kubectl edit 으로 직접 고쳤다면 실제 상태와 다르다.
      지금 실제 값은 kubectl get cm <이름> -n <ns> -o yaml 로 확인한다.
    - values 와 manifest 에는 DB 비밀번호, API 키가 들어 있는 경우가 많다.
      출력을 메신저나 문서에 붙여넣기 전에 확인한다.
    - 운영 서버에서는 get, list, history 같은 조회 명령만 쓴다.
      install, upgrade, rollback, uninstall 은 실제 서비스를 바꾼다.
      실습은 kind 클러스터에서 한다.


7. 문제 0020 힌트 (맥북 터미널에서)

  시작: ./bin/q start 20
  채점: ./bin/q check 20
  초기화: ./bin/q reset 20

  요구사항
    1) ns helm-shop 에 release shop-web 으로 webapp 0.1.0 설치. replicaCount=2
    2) 0.2.0 으로 업그레이드. replicaCount=2 유지
    3) helm history 결과를 /tmp/cncf-out/helm-history.txt 에 저장

  힌트
    1) 차트는 repo 가 아니라 로컬 tgz 파일. chart 자리에 무엇을 넣나?
    2) 네임스페이스가 없을 수 있다. install 에 붙일 옵션이 있다.
    3) 업그레이드 후 replicas 가 2 인지 반드시 확인.
       1로 돌아갔다면 upgrade 함정에 걸린 것. 유지하는 방법은 두 가지.

  채점 주의
    history 에 0.1.0 다음 0.2.0 이 순서대로 있어야 한다.
    잘못 설치해서 다시 하려면 q reset 20 으로 초기화하는 게 안전.

  차트 파일 위치
    맥북의 /tmp/cncf-out/charts/ 에 있다. 노드 안이나 다른 서버에는 없다.
    Finder 에서는 /tmp 가 숨겨져 있으니 터미널로 본다.


8. 문제 0020 풀이 (통과)

  1) 0.1.0 설치
    helm install shop-web /tmp/cncf-out/charts/webapp-0.1.0.tgz \
      -n helm-shop --create-namespace \
      --set replicaCount=2

    shop-web                 release 이름
    /tmp/.../0.1.0.tgz       chart 자리에 로컬 파일 경로. 버전은 파일이 정한다
    --create-namespace       네임스페이스가 없으면 만든다
    --set replicaCount=2     차트 기본값을 덮어쓴다
    --version 은 쓰지 않는다. repo 차트에서 버전을 고를 때 쓰는 옵션이다.

  2) 설치 확인
    helm list -n helm-shop                  CHART 열 webapp-0.1.0
    kubectl -n helm-shop get deploy         shop-web-webapp 2/2
    Deployment 이름은 차트 템플릿이 "release 이름-차트 이름"으로 만든다.

  3) 0.2.0 으로 업그레이드
    helm upgrade shop-web /tmp/cncf-out/charts/webapp-0.2.0.tgz \
      -n helm-shop \
      --set replicaCount=2

    --set 을 빼면 차트 기본값에서 다시 시작해 replicas 가 1로 돌아간다.
    유지 방법 두 가지
      --set replicaCount=2 다시 적기    무엇이 들어가는지 명확. 시험 권장
      --reuse-values                   이전 값을 전부 가져감. 값이 많을 때 편함
                                       새 차트 버전에 생긴 기본값을 놓칠 수 있음

  4) replicas 유지 확인
    kubectl -n helm-shop get deploy shop-web-webapp -o jsonpath='{.spec.replicas}'; echo
    helm list -n helm-shop                  CHART 열 webapp-0.2.0

  5) history 저장
    helm history shop-web -n helm-shop > /tmp/cncf-out/helm-history.txt
    revision 1 = 0.1.0 superseded, revision 2 = 0.2.0 deployed

  6) 채점
    ./bin/q check 20

  복습: reset 후 3번에서 --set 을 일부러 빼고 upgrade 해 보기.
  replicas 가 1로 돌아가는 걸 직접 보면 함정이 확실히 기억에 남는다.

반응형