개요
Docker는 어떠한 이유로 프로세스가 종료되면 컨테이너도 종료된다. 종료된 컨테이너는 수동으로 동작시키거나 새 컨테이너를 생성시킬 때까지 비활성상태가 유지되고, 사용자에게 서비스를 제공하지 못한다.
Kubernetes는 애플리케이션이 충돌할 때마다 서비스를 복구하기 위해 컨테이너를 재시작하려고 시도한다. 재시작 횟수는 get pods 명령으로 확인할 수 있다. (RESTART 부분)
kubectl get pods
컨테이너가 정상인데 애플리케이션이 동작하지 않는 상태인 경우, 쿠버네티스는 컨테이너가 정상적으로 동작하고 있기 때문에 애플리케이션도 정상적으로 동작하는 상태인 것으로 간주한다. 하지만 실제로 서비스는 사용자에게 제공되지 않는 상태이기 때문에 컨테이너를 재시작하거나, 삭제 후 새 컨테이너를 생성해야 한다.
livenessProbe
kubelet에 의해 주기적으로 수행되는 진단(diagnostic)인 프로브 중에서 컨테이너가 동작 중인지에 대한 여부를 나타내는 프로브다. 컨테이너에 설정하면 컨테이너 내 애플리케이션이 실제로 정상적으로 동작하는지 주기적으로 확인하며, 프로브가 실패하는 경우 재시작 정책의 대상이 된다. 컨테이너가 프로브를 제공하지 않으면 기본 상태는 Success로 설정된다.
프로브가 진단 수행 시 호출하는 핸들러는 아래와 같다.
- httpGet
지정한 포트 및 경로에서 컨테이너의 IP주소에 대한 HTTP Get 요청 수행
응답 상태 코드가 200 이상 400 이하이면 진단을 성공한 것으로 판단한다. - tcpSocket
지정된 포트에서 컨테이너의 IP주소에 대해 TCP 검사 수행
포트 활성화 시 진단을 성공한 것으로 판단한다. - exec
컨테이너 내에서 지정된 명령어 실행
응답 코드가 0이면 진단을 성공한 것으로 판단한다.
이전의 readinessProbe와 동일하며, livenessProbe 또한 포드 정의 파일에 정의할 수 있다.
apiVersion: v1
kind: Pod
metadata:
name: simple-webapp
labels:
name: simple-webapp
spec:
containers:
- name: simple-webapp
image: simple-webapp
ports:
- containerPort: 8080
livenessProbe:
httpGet:
path: /api/healthy
port: 8080
initialDelaySeconds: 10
periodSeconds: 5
failureThreshold: 8