차트 테스트 (Chart Tests)

차트 테스트 (Chart Tests)

차트는 여러 쿠버네티스 리소스가 함께 동작하는 묶음이라, 설치했을 때 의도대로 돌아가는지 확인할 방법이 있으면 좋겠죠. Helm에는 차트에 테스트를 정의해 두고 릴리스에 대해 실행할 수 있는 기능이 있어요. 소비자 입장에서도 이 테스트가 차트가 무엇을 하는지 이해하는 지표가 되고요.

출처

A test in a helm chart lives under the templates/ directory and is a workload definition (commonly a Pod or Job) that specifies a container with a given command to run. 출처: https://helm.sh/docs/topics/chart_tests/

테스트가 무엇인가요

차트의 테스트는 templates/ 디렉터리 아래에 두는 워크로드 정의(Pod나 Job)예요. 컨테이너가 exit 0으로 정상 종료하면 테스트 성공으로 보는데요, 그 정의에는 반드시 Helm 테스트 훅 애노테이션이 있어야 해요.

annotations:
  "helm.sh/hook": test

예를 들어 이런 검증을 테스트로 만들 수 있어요.

  • values.yaml의 설정이 제대로 주입됐는지 확인
  • 사용자 이름·비밀번호가 맞는지, 틀린 값은 거부되는지 확인
  • 서비스가 떠 있고 로드밸런싱이 되는지 확인

테스트는 helm test <RELEASE_NAME>으로 실행해요. 차트 소비자가 자기 릴리스가 제대로 동작하는지 빠르게 확인하는 좋은 방법이죠.

예제로 보기

helm create demo로 데모 차트를 만들면 테스트용 파드 정의가 자동으로 들어와요.

$ helm create demo

생성된 demo/templates/tests/test-connection.yaml을 보면 준비된 테스트를 확인할 수 있어요. 그 안에는 busybox 이미지로 wget을 실행하는 Pod 정의가 있고, restartPolicy: Never로 한 번만 실행하도록 되어 있어요.

apiVersion: v1
kind: Pod
metadata:
  name: "{{ include "demo.fullname" . }}-test-connection"
  annotations:
    "helm.sh/hook": test
spec:
  containers:
    - name: wget
      image: busybox
      command: ['wget']
      args: ['{{ include "demo.fullname" . }}:{{ .Values.service.port }}']
  restartPolicy: Never

테스트 스위트 실행하기

먼저 차트를 설치해서 릴리스를 만들고요, 설치 직후에 바로 테스트하면 일시적인 실패(transitive failure)가 나올 수 있으니 Pod들이 활성 상태가 되기를 잠시 기다렸다가 실행하는 게 좋아요.

$ helm install demo demo --namespace default
$ helm test demo
NAME: demo
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE:     demo-test-connection

메모

  • 테스트는 한 YAML 파일 안에 여러 개를 정의해도, 여러 파일에 나눠 담아도 돼요.
  • templates/tests/처럼 tests/ 하위에 모아 격리하는 것도 환영이에요.
  • 테스트도 의 일종이라 helm.sh/hook-weighthelm.sh/hook-delete-policy 같은 애노테이션을 함께 쓸 수 있어요. (Helm v3 이전에는 test-success·test-failure 훅이 쓰였고, test-success는 여전히 호환용으로 허용돼요.)

더 알아보기