Kubernetes exec 헬스체크 – 활용 예시
Kubernetes에서 컨테이너 상태를 체크할 때 livenessProbe, readinessProbe, startupProbe 세 가지 방식이 있습니다.
이 중에서 가장 유연하게 쓸 수 있는 게 바로 exec 방식이 있는데 직접 컨테이너 안에서 명령어를 실행해서 그 결과를 기반으로 상태를 판단하는 방식인데 잘 쓰면 아주 강력하고 상황에 맞게 커스터마이징도 쉽습니다.
본문에서는 exec 을 통한 예제에 대해 작성했습니다.
1. 헬스체크란?
Kubernetes는 총 3가지 종류의 헬스체크(Probe)를 제공합니다
종류 | 목적 | 실패 시 행동 |
StartupProbe | 컨테이너가 처음 정상적으로 시작되었는지 확인 | 실패 시 재시작 (단, Readiness/Liveness보다 우선함 |
ReadinessProbe | 트래픽을 받을 준비가 되었는지 확인 | 실패 시 Service에서 제외 (트래픽 유입 차단) |
LivenessProbe | 컨테이너가 정상적으로 동작 중인지 확인 | 실패 시 Kubelet이 컨테이너 재시작 |
2. exec 방식이란?
exec 는 말그대로 컨테이너 내부에서 명령어를 실행합니다.
명령어가 exec code 0 으로 끝나면 정상, 그 외에는 비정상으로 판단합니다.
StartupProbe:
exec:
command:
- cat
- /tmp/mslee
initialDelaySeconds: 5
periodSeconds: 10
이런 식으로 /tmp/mslee 파일이 존재하면 정상으로 보는 단순한 예제 입니다.
3. 활용 예시
초기 상태
$ cat mslee.yaml
apiVersion: v1
kind: Pod
metadata:
name: mslee-nginx
labels:
app: mslee
spec:
containers:
- name: mslee-nginx
image: nginx
volumeMounts:
- name: tmp-volume
mountPath: /tmp
ports:
- containerPort: 80
startupProbe:
exec:
command:
- cat
- /tmp/mslee
initialDelaySeconds: 10
periodSeconds: 10
failureThreshold: 3
volumes:
- name: tmp-volume
hostPath:
path: /tmp
type: DirectoryOrCreate
---
apiVersion: v1
kind: Service
metadata:
name: mslee-service
labels:
app: mslee
spec:
ports:
- name: http
port: 80
targetPort: 80
selector:
app: mslee
$ kubectl apply -f mslee.yaml
$ kubectl get pod -l app=mslee
NAME READY STATUS RESTARTS
mslee-nginx 1/2 Running 1
$ kubectl exec -it bashcommand -- curl mslee-service
no healthy upstream
mslee-nginx 은 nginx 이미지 기반으로 구동된 컨테이너이며 StartupProbe 에서 /tmp/mslee 파일에 대해 exec 방식으로 헬스체크를 하고 있습니다.
현재 /tmp/mslee 에 파일이 존재하지 않기 때문에 정상적으로 구동하지 않고 있으며 bashcommand 라는 다른 POD을 통해 호출 했을 때 no healthy upstream 이라고 반환됩니다.
/tmp/mslee 파일 생성
$ touch /tmp/mslee
이후 컨테이너 상태 확인
$ kubectl get pod -l app=mslee
mslee-nginx 2/2 Running 7
$ kubectl exec -it bashcommand -- curl mslee-service
<!DOCTYPE html>
<html><head><title>Welcome to nginx!</title> ...
정상적으로 응답을 반환하는 것을 확인 할 수 있습니다.
4. exec 방식, 언제 활용하면 좋을까요?
- 앱 내부에 HTTP Health Check 엔드포인트가 없을 때
- 특정 파일이 생기거나 어떤 스크립트가 성공했는지를 기준으로 판단 할 때
- 상태를 외부에서 볼 수 없는 경우 (예: DB 마이그레이션 완료 여부)
5. 추천 활용 예시
상황 | 명령 예시 |
데이터 마이그레이션 완료 여부 확인 | [ -f /tmp/migrate.done ] |
특정 디렉토리 마운트 확인 | mountpoiunt -q /mnt/data |
DB 테이블 존재 여부 확인 | psql -c '\dt mslee_table' |
마무리
exec 방식은 정말 강력하지만 너무 복잡한 로직을 넣으면 나중에 디버깅이 힘들 수 있습니다.
명령은 되도록 단순하게 하되 실패 상황도 명확하게 만드는 것도 중요합니다.
특히 StartupProbe 는 초기화가 확실히 끝나야만 서비스로 트래픽을 연결시키고 싶을 때 유용하니 잘 활용하면 장애 예방에도 큰 도움이 됩니다.