업무 기록/Cloud Native

Kubernetes exec 헬스체크 – 활용 예시

Seob 2025. 4. 10. 21:25
반응형

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 는 초기화가 확실히 끝나야만 서비스로 트래픽을 연결시키고 싶을 때 유용하니 잘 활용하면 장애 예방에도 큰 도움이 됩니다.

반응형