컨테이너 프로브
실제 서비스를 운영하게 되면 쿠버네티스의 컨테이너를 배포해서 운영하게 될 것이다. 그런데 컨테이너가 정상적으로 동작하지 않으면 서비스에 장애가 발생할 것이므로, 컨테이너의 상태를 확인해야 할 것이다. 컨테이너 프로브는 컨테이너가 제대로 실행되고 있는지 진단한다.
컨테이너 프로브에는 세가지 종류가 있으며, 이를 Manifest File 작성 시에 설정해 줄 수 있다. 프로브는 컨테이너의 상태에 따라 startupProbe, readinessProbe, livenessProbe 순서로 동작한다. 프로브는 설정하지 않을 수도 있으며, 원하는 프로브들을 여러개 설정할 수 있다.
1. startupProbe
컨테이너 내의 어플리케이션이 시작되었는지 확인한다.
프로브들 중에서 가장 먼저 실행되는 프로브로, startupProbe에서 진단이 실패되면, 성공할 때까지 readinessProbe와 livenessProbe를 실행시키지 않는다. 즉, 어플리케이션이 모두 시작되기 이전에 다른 probe들에 의해서 방해받는 것을 방지하는 것이다. 예를들어서, 시작이 다 되지도 않은 컨테이너인데 liveness 진단이 실패로 되어 kubelet이 Pod을 kill할 수도 있다. 그렇지만 startupProbe 진단 성공 이전에 liveness와 readiness 진단을 하지 않는다면, 지연시간을 두고 시작되는 컨테이너들이 잘못 kill되는 것을 방지할 수 있다.
2. readinessProbe
컨테이너 내의 어플리케이션이 생성되고 나서 컨테이너가 요청을 처리할 준비가 되었는지 확인한다.
Pod은 컨테이너들이 모두 준비가 되었을 때 트래픽을 처리할 수 있는 상태 인것으로 확인된다.
예를 들어서, readinessProbe는 백엔드 서비스를 진단할 때 사용될 수 있다. 진단이 실패이면, 트래픽을 처리할 수 없는 상태라는 것이므로 엔드포인트 컨트롤러는 Pod의 IP 주소를 엔드 포인트에서 제거한다.
readinessProbe를 선언하지 않으면 기본 상태는 Success이다. 즉, 실패에 대한 진단을 하지 않을 것이다.
3. livenessProbe
livenessProbe는 컨테이너가 정상적으로 동작 중인지 확인한다. kubelet은 livenessProbe를 사용해서 진단 결과 실패일 경우 restartPolicy에 따라서 재시작을 한다. livenessProbe를 선언하지 않으면 기본 상태는 Success 이다.
프로브 핸들러
kubelet은 프로브 핸들러를 호출하여 상태를 주기적으로 진단한다. 컨테이너 프로브를 설정할 때 어떤 프로브 핸들러를 사용할지 설정할 수 있으며, 여러개를 사용할 수 도 있다. 프로브 핸들러는 세가지 종류가 있다.
HTTPGetAction | 특정 경로에 HTTP GET 요청을 시도하고 반환된 응답코드를 확인한다. |
TCPSocketAction | 특정 TCP 포트를 연결하고 포트가 활성화 되어있는지 확인한다. |
ExecAction | 컨테이너 내의 지정된 바이너리 명령을 실행하고 명령의 exit code를 확인한다. (0 이면 정상 종료, non-zero면 비정상 종료) |
컨테이너 프로브 진단 결과
- Success : 진단 통과
- Failure : 실패
- Unknown : 진단 자체의 실패
컨테이너 프로브 설정 예시
ManifestFile에 livenessProbe와 ExecAction 프로브 핸들러를 설정해주었다.
exec-liveness.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-exec
spec:
containers:
- name: liveness
image: registry.k8s.io/busybox
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30; rm -f /tmp/healthy; sleep 600
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 5
kubectl create -f exec-liveness.yaml 명령어로 pod을 생성한다.
35초가 지난 이후 어떻게 실행되었는지 kubectl describe pod liveness-exec 명령어로 확인해보면 다음과 같다.
/tmp/healthy 디렉토리가 삭제되어서 정상적으로 컨테이너가 실행되지 않아서 livenessProbe가 진단 실패했다. 그래서 kubelet이 컨테이너를 kill했다가 다시 컨테이너가 재시작되어 다시 image를 pull 해오는 것을 확인할 수 있다.
참고자료
'Cloud Engineering > Kubernetes ⚙️' 카테고리의 다른 글
[Kubernetes] DaemonSet (데몬셋) (0) | 2023.02.13 |
---|---|
[Kubernetes] Replication Controller (레플리케이션 컨트롤러) (0) | 2023.02.11 |
[Kubernetes] Pod Lifecycle (Pod의 생명주기) 와 컨테이너의 상태 (0) | 2023.02.11 |
[Kubernetes] Namespace 생성, 삭제, 확인하기 (0) | 2023.02.09 |
[Kubernetes] Annotation 추가하기 (0) | 2023.02.09 |