Post

Helm Hook을 통한 리소스 생성 순서 제어

Kubernetes 환경에서 Helm을 Package Manager로 사용해 애플리케이션을 배포하는 과정에서 종종 데이터베이스 초기화, 스키마 마이그레이션, 캐시 무효화 등의 이유로 특정 리소스가 먼저 생성되어야 하는 경우를 마주할 때가 있습니다.

이때 Helm Hook을 사용하면 특정 이벤트(예: pre-install, post-install, pre-delete, post-delete)가 발생할 때 특정 작업을 수행할 수 있습니다.

Helm Hook이란?

Helm Hook은 Helm Chart 설치, 업그레이드, 삭제 등의 특정 LifeCycle Event가 발생할 때 실행되는 작업을 정의할 수 있는 기능입니다.

Helm Hook은 YAML 형식의 Kubernetes Manifest파일에 Metadata Annotation으로 아래와 같이 선언할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: v1
kind: Pod
metadata:
  annotations:
    helm.sh/hook: pre-install
    helm.sh/hook-weight: "5"
    helm.sh/hook-delete-policy: hook-succeeded
spec:
  containers:
    - name: job
      image: busybox
      args: ['sh', '-c', 'echo "Hello, World!"']

Helm Hook Attributes

Hook 설정에 주로 사용하는 대표적인 어노테이션과 설명입니다.

Hook 속성 설명 예시 값
helm.sh/hook Hook의 타입을 지정 pre-install, post-delete
helm.sh/hook-weight 동일한 Hook 타입 내에서 실행 순서 제어(낮은 값부터 실행) 0, 1, 2, … (default: 0)
helm.sh/hook-delete-policy Hook 실행 완료 후 리소스를 어떻게 처리할지 결정 hook-succeeded, hook-failed

Helm Hook Types

Helm에서 지원하는 주요 Hook 타입과 활용 예시입니다.

Hook 타입 설명 활용 예시
pre-install 차트 설치 전 실행되는 훅 DB 스키마 세팅, 기본 데이터 로딩 등 사전 준비 단계
post-install 차트 설치 후 실행되는 훅 배포 확인, 알림 전송, 외부 시스템 연동
pre-upgrade 차트 업그레이드 전 실행 기존 리소스 백업, DB 마이그레이션 스크립트 실행, 캐시 갱신
post-upgrade 차트 업그레이드 후 실행 배포 성공 알림 전송, 새로운 기능 활성화 작업
pre-delete 차트 삭제 전 실행 외부 의존 리소스 정리 (스토리지, DNS 레코드), 인증 토큰 폐기
post-delete 차트 삭제 후 실행 리소스 정리 완료 알림, 로그 기록
pre-rollback 롤백 전 실행 롤백 대상 리소스 상태 백업, 알림 처리 자동화
post-rollback 롤백 후 실행 롤백 성공/실패 알림 전송, 리소스 상태 복구
test helm test 명령 실행 시, 테스트용 리소스(또는 작업) 애플리케이션 기능 검증, API 통합 테스트, CI 파이프라인과 연동 시 유용
test-success helm test 실행 후, 성공 시 호출 성공 알림 전송, 모니터링 시스템 업데이트
test-failure helm test 실행 후, 실패 시 호출 실패 원인 로깅, 운영팀에 알림 전송

Hook 실행 예제

Helm Chart를 설치할 때 pre-install, post-install , hook-weight 을 사용한 예시입니다.
디렉토리는 다음과 같고 pre-install-job-w1.yaml, pre-install-job-w2.yaml, pre-install-job-w3.yaml 파일은 각각 helm.sh/hook-weight 의 값을 1, 2, 3으로 주었습니다.

예상대로라면 hook-weight 값이 낮은 순서대로 실행되고 pre-install -> Deployment -> post-install 순서로 실행이 되어야 합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
❯ tree
.
├── Chart.yaml
├── charts
├── templates
│   ├── NOTES.txt
│   ├── _helpers.tpl
│   ├── deployment.yaml
│   ├── post-install-job.yaml
│   ├── pre-install-job-w1.yaml
│   ├── pre-install-job-w2.yaml
│   └── pre-install-job-w3.yaml
└── values.yaml

Helm Chart에 대해 더 자세한 내용은 https://github.com/KKamJi98/kubernetes/tree/main/Helm/kkamji-hook-prac 에서 확인하실 수 있습니다.

pre-install Manifest 파일

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
apiVersion: batch/v1
kind: Job
metadata:
  name: pre-install-job-w1
  annotations:
    helm.sh/hook: pre-install # pre-install 훅 지정
    helm.sh/hook-delete-policy: hook-succeeded # Job 성공 시 자동 삭제
    helm.sh/hook-weight: "1" # 훅 실행 우선순위 (낮을수록 먼저 실행)
spec:
  template:
    spec:
      restartPolicy: Never
      containers:
      - name: amazonlinux-pre-install
        image: public.ecr.aws/amazonlinux/amazonlinux:2023-minimal
        command: [ "/bin/sh" ]
        args:
        - "-c"
        - |
          echo "start"
          sleep 10
          echo "done"

deployment(main) Manifest 파일

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# deployment(main)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kkamji-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kkamji
  template:
    metadata:
      labels:
        app: kkamji
    spec:
      containers:
        - name: kkamji
          image: nginx
          ports:
            - containerPort: 80

post-install Manifest 파일

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: batch/v1
kind: Job
metadata:
  name: post-install-job
  annotations:
    helm.sh/hook: post-install
    helm.sh/hook-delete-policy: hook-succeeded
spec:
  template:
    spec:
      restartPolicy: Never
      containers:
      - name: amazonlinux-pre-install
        image: public.ecr.aws/amazonlinux/amazonlinux:2023-minimal
        command: [ "/bin/sh" ]
        args:
        - "-c"
        - |
          echo "start"
          sleep 10
          echo "done"

Helm Chart 설치 (Hook 확인인)

kubectl get pod -w 명령어로 Helm Chart가 리소스를 생성하는 순서를 확인하겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
❯ helm install hook-prac . -f values.yaml
NAME: hook-prac
LAST DEPLOYED: Wed Jan 15 18:20:03 2025
NAMESPACE: hook-prac
STATUS: deployed
...
...
...

❯ kubectl get pod -w
NAME                       READY   STATUS    RESTARTS   AGE
pre-install-job-w1-pgfb8   0/1     Pending   0          0s
pre-install-job-w1-pgfb8   0/1     Pending   0          0s
pre-install-job-w1-pgfb8   0/1     ContainerCreating   0          0s
pre-install-job-w1-pgfb8   1/1     Running             0          1s
pre-install-job-w1-pgfb8   0/1     Completed           0          11s
pre-install-job-w1-pgfb8   0/1     Completed           0          12s
pre-install-job-w1-pgfb8   0/1     Completed           0          13s
pre-install-job-w2-g9cnt   0/1     Pending             0          0s
pre-install-job-w2-g9cnt   0/1     Pending             0          0s
pre-install-job-w2-g9cnt   0/1     ContainerCreating   0          0s
pre-install-job-w2-g9cnt   1/1     Running             0          1s
pre-install-job-w2-g9cnt   0/1     Completed           0          11s
pre-install-job-w2-g9cnt   0/1     Completed           0          12s
pre-install-job-w2-g9cnt   0/1     Completed           0          13s
pre-install-job-w3-jqc7p   0/1     Pending             0          0s
pre-install-job-w3-jqc7p   0/1     Pending             0          0s
pre-install-job-w3-jqc7p   0/1     ContainerCreating   0          0s
pre-install-job-w3-jqc7p   1/1     Running             0          1s
pre-install-job-w3-jqc7p   0/1     Completed           0          11s
pre-install-job-w3-jqc7p   0/1     Completed           0          12s
pre-install-job-w3-jqc7p   0/1     Completed           0          13s
pre-install-job-w1-pgfb8   0/1     Completed           0          39s
pre-install-job-w1-pgfb8   0/1     Completed           0          39s
pre-install-job-w2-g9cnt   0/1     Completed           0          26s
pre-install-job-w2-g9cnt   0/1     Completed           0          26s
pre-install-job-w3-jqc7p   0/1     Completed           0          13s
pre-install-job-w3-jqc7p   0/1     Completed           0          13s
kkamji-deployment-7979949d4-zg5sp   0/1     Pending             0          0s
kkamji-deployment-7979949d4-zg5sp   0/1     Pending             0          0s
kkamji-deployment-7979949d4-zg5sp   0/1     ContainerCreating   0          0s
post-install-job-v74xs              0/1     Pending             0          0s
post-install-job-v74xs              0/1     Pending             0          1s
post-install-job-v74xs              0/1     ContainerCreating   0          1s
post-install-job-v74xs              1/1     Running             0          2s
kkamji-deployment-7979949d4-zg5sp   1/1     Running             0          3s
post-install-job-v74xs              0/1     Completed           0          12s
post-install-job-v74xs              0/1     Completed           0          13s
post-install-job-v74xs              0/1     Completed           0          14s
post-install-job-v74xs              0/1     Completed           0          14s
post-install-job-v74xs              0/1     Completed           0          14s

결과

예상대로 hook-weight가 낮은 pre-install Job들이 순서대로 실행된 뒤, 메인 Deployment가 생성되고, 마지막으로 post-install Job이 실행되었습니다.
이를 통해 hook-weight 값이 낮은 순서대로 실행되고 pre-install -> Deployment -> post-install 순서로 실행이 되었음을 확인할 수 있습니다.


궁금하신 점이나 추가해야 할 부분은 댓글이나 아래의 링크를 통해 문의해주세요.
Written with KKam._.Ji

This post is licensed under CC BY 4.0 by the author.