전공영역 공부 기록

helm hook 사용방법

악분 2022. 12. 25. 17:23
반응형

영상: https://youtu.be/ZHBkvNVtpIA

 

개요

helm hook은 helm 차트 라이플 사이클을 이용하여, 사용자가 원하는 동작을 추가하는 기능입니다. pod, configmap 등 쿠버네티스 리소스에 annotation을 설정하여 helm hook을 구현할 수 있습니다.

apiVersion: batch/v1
kind: Job
metadata:
  name:  test
  annotations:
    "helm.sh/hook": post-install
...

 

종류

helm install, delete, upgrade, delete, test에 hook을 할 수 있습니다. 각 기능이 동작하기 전/후로 hook을 추가할 수 있습니다. 자세한 내용은 공식문서를 참고하시길 바랍니다.

https://helm.sh/docs/topics/charts_hooks/

 

주의사항

helm hook과 template pod상태 관계

만약, helm template에 pod가 있다면, helm hook과 helm template의 pod상태는 관계가 없습니다.

 

post hook이 실행되는 시점은 helm template이 전부 release가 된 후입니다. 그러므로 pod가 running상태가 아니어도 helm hook이 실행됩니다.

따라서, pod가 상태에 따라 동작하는 로직을 helm hook에 사용하면 안됩니다.

 

helm hook이 끝날때까지 대기

job, pod로 helm hook을 사용하면, helm 클라이언트는 hook리소스가 성공 또는 실패로 끝날때까지 대기합니다.

 

삭제 정책

helm hook으로 정의한 리소스는 helm release로 관리되지 않습니다. 그러므로 hook으로 생성된 리소스는 사용자가 수동으로 삭제해야 합니다.

 

다행히, 삭제 정책(delete-policy)를 지원해주고 있어, annotation에 삭제 정책을 설정하여 리소스 삭제를 관리할 수 있습니다.

apiVersion: batch/v1
kind: Job
metadata:
  name:  test
  annotations:
    "helm.sh/hook": post-install
    "helm.sh/hook-delete-policy": hook-succeeded
...

 

예제 1

예제 코드링크: https://github.com/sungwook-practice/helm_hook_test/tree/main/example1/charts

예제 1번은 post-install hook예제입니다. nginx deployment를 release된 후에 job이 실행됩니다. job은 annotation에 helm hook설정이 되어 있습니다.

apiVersion: batch/v1
kind: Job
metadata:
  name:  {{ .Chart.Name }}-post-install-hook-{{ .Release.Name }}
  namespace: {{ .Release.Namespace }}
  labels:
    app:  {{ .Chart.Name }}-post-install-hook-{{ .Release.Name }}
  annotations:
    "helm.sh/hook": post-install

 

helm install을 하면 약 1분동안 멈추게 됩니다. helm client가 helm hook으로 실행된 job이 끝날 때까지 대기하기 때문입니다.

helm install example1 ./example1/charts/

 

job이 종료되면 아래 그림과 같이 helm 실행 결과가 화면에 출력됩니다.

 

pod목록을 조회하면 nginx pod와 실행종료된 job pod가 있습니다.

kubectl get po

 

예제 2

[예제 1]에서 실행했던 helm release를 삭제해보겠습니다.

helm uninstall example1

 

pod목록을 조회하면 job pod가 그대로 있는 것이 확인됩니다.

kubectl get po
kubectl delete po {pod이름}

 

helm은 hook으로 생성한 리소스를 삭제하지 않습니다. 그래서 삭제하는 옵션을 annotation에 설정해야 합니다.

apiVersion: batch/v1
kind: Job
metadata:
  name:  {{ .Chart.Name }}-post-install-hook-{{ .Release.Name }}
  namespace: {{ .Release.Namespace }}
  labels:
    app:  {{ .Chart.Name }}-post-install-hook-{{ .Release.Name }}
  annotations:
    "helm.sh/hook": post-install
    "helm.sh/hook-delete-policy": hook-succeeded

 

반응형

'전공영역 공부 기록' 카테고리의 다른 글

쿠버네티스 Headless 서비스  (0) 2023.01.01
kubernetes에서 code-server 실행  (0) 2023.01.01
자주사용하는 curl 명령어 정리  (0) 2022.12.24
EKS add-ons  (0) 2022.12.21
aws eks kubeconfig 업데이트 명령어  (0) 2022.12.20