Helm 은 릴리스 정보를 네임스페이스의 Secret 에 저장한다. 설치할 때 쓴 values 파일 자체는 남지 않지만 적용된 값은 남는다.
helm list -A
helm get values <릴리스> -n <네임스페이스> # 사용자가 준 값만
helm get values <릴리스> -n <네임스페이스> --all # 차트 기본값까지 합친 전체
helm get manifest <릴리스> -n <네임스페이스> # 실제로 적용된 매니페스트
helm get all <릴리스> -n <네임스페이스>
이전 리비전의 값도 볼 수 있다. 업그레이드하면서 설정이 사라진 것 같을 때 여기서 비교한다.
helm history <릴리스> -n <네임스페이스>
helm get values <릴리스> -n <네임스페이스> --revision 3
되돌릴 때는 helm rollback <릴리스> <리비전> 을 쓴다.
helm upgrade 는 릴리스에 저장된 값을 기억한다. 다만 어느 쪽을 쓰느냐에 따라 결과가 다르다.
| 방식 | 동작 |
|---|---|
-f values.yaml |
준 파일의 값 + 차트 기본값. 이전에 준 값 중 파일에 없는 것은 사라진다 |
--reuse-values |
이전 값을 그대로 쓰고 --set 으로 준 것만 덮는다. 새 차트에서 추가된 기본값은 반영되지 않는다 |
--reset-values |
이전 값을 버리고 차트 기본값에서 시작한다 |
가장 안전한 방식은 현재 값을 파일로 받아 두고 그 파일로 업그레이드하는 것이다. 값이 파일로 남아 무엇이 적용됐는지 추적할 수 있다.
helm get values ingress-nginx -n ingress-nginx > current-values.yaml
helm upgrade ingress-nginx ingress-nginx/ingress-nginx -n ingress-nginx -f current-values.yaml
차트를 크게 건너뛰어 올릴 때는 값이 유지돼도 템플릿 구조가 바뀌어 결과가 달라질 수 있다. 미리 렌더링해 차이를 본다.
helm upgrade <릴리스> <차트> -n <네임스페이스> -f current-values.yaml --dry-run --debug > new.yaml
helm get manifest <릴리스> -n <네임스페이스> > old.yaml
diff old.yaml new.yaml
Helm 은 --set 의 점을 계층 구분자로 해석한다. 애노테이션 키처럼 점이 들어간 이름은 역슬래시로 이스케이프해야 한다.
helm install ingress-nginx ingress-nginx/ingress-nginx \
-n ingress-nginx --create-namespace \
--set controller.service.type=LoadBalancer \
--set controller.service.externalTrafficPolicy=Local \
--set controller.service.nodePorts.http=30080 \
--set 'controller.service.annotations.service\.beta\.kubernetes\.io/aws-load-balancer-type=nlb'
이스케이프하지 않으면 service: beta: kubernetes: io/... 같은 중첩 구조로 들어가 애노테이션이 붙지 않는다. 셸이 역슬래시를 먹지 않도록 전체를 홑따옴표로 감싼다. 값에 쉼표가 들어가면 그것도 \, 로 이스케이프한다.
이런 키가 여럿이면 --set 보다 values 파일이 낫다. 파일 안에서는 이스케이프가 필요 없다.
controller:
service:
type: LoadBalancer
externalTrafficPolicy: Local
nodePorts:
http: 30080
annotations:
service.beta.kubernetes.io/aws-load-balancer-type: nlb
helm reinstall 이라는 명령은 없다. 목적에 따라 둘 중 하나다.
# 완전히 지우고 새로 설치
helm uninstall <릴리스> -n <네임스페이스>
helm install <릴리스> <차트> -n <네임스페이스> -f values.yaml
# 있으면 업그레이드, 없으면 설치 — CI 에서 쓰는 형태
helm upgrade --install <릴리스> <차트> -n <네임스페이스> -f values.yaml
helm uninstall 은 PVC 를 지우지 않는다. StatefulSet 의 volumeClaimTemplates 로 만들어진 것도 남는다. 데이터까지 지우려면 따로 확인하고 삭제한다.
kubectl get pvc -n <네임스페이스>
cannot re-use a name that is still in use 는 같은 이름의 릴리스가 남아 있다는 뜻이다. helm list -a -n <네임스페이스> 로 실패 상태의 릴리스까지 확인한다. 릴리스는 지웠는데 리소스가 남았다면 소유자 라벨로 찾는다.
kubectl get all,secret -n <네임스페이스> -l owner=helm
| 하려는 일 | 명령 |
|---|---|
| 차트 뼈대 생성 | helm create <이름> |
| 의존성을 잠금 파일대로 내려받기 | helm dependency build |
| 의존성 버전을 갱신하고 잠금 파일 재작성 | helm dependency update |
| 배포용 패키지 | helm package . |
빌드 파이프라인에서는 build 를 쓴다. Chart.lock 에 적힌 버전 그대로 받으므로 결과가 재현된다. update 는 버전 범위 안에서 최신을 받아 잠금 파일을 바꾼다.