[helm] Hooks

jeonghyun yu·2024년 7월 5일

Logging PoC

목록 보기
1/3
post-thumbnail

hook이란?

릴리즈 수명주기의 특정 지점에 차트 개발자가 개입할 수 있도록 제공하는 매커니즘

  • 설치 시 다른 차트가 로드되기 전에 컨피그맵이나 시크릿 로드
  • 새 차트 설치 전에 DB 백업 실행
  • 릴리즈 제거 전 작업 수행

Hook의 종류

  • pre-install
    • template 렌더링되고 쿠버네티스에서 리소스 생성되기 전에 실행
  • post-install
    • 쿠버네티스에 모든 리소스가 로드된 후에 실행
  • pre-delete
    • 쿠버네티스에서 리소스가 삭제되기 전에 실행
  • post-delete
    • 릴리즈의 모든 리소스가 삭제된 후 실행
  • pre-upgrade
  • post-upgrade
  • pre-rollback
  • post-rollback
  • test

릴리즈 수명주기

예시) helm install

  1. 사용자가 helm install foo 실행
  2. 헬름 라이브러리 설치 API 호출
  3. crd/ 디렉터리의 CRD 설치
  4. 검증 후 라이브러리는 foo 템플릿 렌더링
  5. 라이브러리는 pre-install 훅 실행을 준비 = 쿠버네티스 훅 리소스 로딩
  6. 라이브러리는 가중치, 리소스 종류, 이름을 기준으로 훅을 오름차순 정렬
  7. 라이브러리는 가장 낮은 가중치의 훅을 먼저 로드
  8. 훅이 Ready 될 때까지 대기 (CRD 제외)
  9. 라이브러리는 결과로 나온 리소스를 쿠버네티스에 로드
    --wait 플래그가 설정된 경우 라이브러리는 모든 리소스가 Ready 상태가 될 때까지 대기, 준비가 될 때까지 post-install 훅을 실행하지 않음
  10. 라이브러리는 post-install 훅을 실행 = 훅 리소스 로딩
  11. 라이브러리는 훅이 Ready 될 때까지 대기
  12. 라이브러리는 릴리스 객체를 클라이언트에 반환
  13. 클라이언트가 종료
  • 굵은 글씨가 hook을 구현했을 때 발생되는 단계
  • 훅이 ready 상태가 될 때까지 대기한다는 말은
    훅의 Job 또는 Pod 가 성공 완료될 때까지 기다린다는 말
    훅이 실패하면 릴리즈 실패
    blocking 작업 이므로 작업이 실행되는 동안 헬름 클라이언트가 일시정지 된다.
    • 그래서 install/upgrade 도중 timeout 나면 삭제가 정상적으로 되지 않았던 것 같다.

릴리즈에 관리되지 않는 훅 리소스

훅이 생성하는 리소스는 현재 릴리즈의 일부로 추적되거나 관리되지 않는다. 향후 헬름3에 릴리즈 삭제 시 훅 리소스에 대한 가비지 수집 기능이 추가될 수는 있지만 현재는 아니다!
실직적으로, helm uninstall 로 리소스를 제거할 수 없음을 의미한다. 이러한 리소스를 삭제하려면 훅 템플릿 파일에 helm.sh/hook-delete-policy 어노테이션을 추가하거나, Job 리소스의 TTL 필드를 설정해야 한다.

hook annotation

  • hook 구현
    • 하나의 리소스로 한개 이상의 훅 구현 가능
annotations:
  "helm.sh/hook": post-install,post-upgrade
  • hook 가중치
    • 양수/음수 문자열 표기
annotations:
  "helm.sh/hook-weight": "5"
  • hook 삭제 정책
    • 한 개 이상의 정책 적용 가능
annotations:
  "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
  • before-hook-creation : 새 훅이 시작되기 전에 이전 리소스 삭제 (default)
  • hook-succeeded : 훅이 성공적으로 실행된 후에 리소스 삭제
  • hook-failed : 실행 중 훅이 실패한 경우 리소스 삭제

다른 해결 방안

  • helm install my-release my-chart --debug
    • 실제로 실행하지 않고 명령어 수행 시 실행되는 모습을 볼 수 있다.

0개의 댓글