Liveness Probe를 사용하여 Container 가 활성화되어 올바르게 작동하는지 확인한다.
Kubernetes 는 주기적으로 Container 에 Health Check 요청을 Container 로 보내고 지정된 Timeout 시간 내에 응답을 받지 못하면 Container를 재기동 시킨다. 이를 통해 Pod의 상태를 실시간으로 모니터링하고, 문제가 발생한 경우 적시에 대응할 수 있다. 이는 Container 가 제대로 작동하지 않는 상황을 방지하여 신뢰성 확보에 기여한다.
예시
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: my-image
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 10
periodSeconds: 5
해석 : /health 엔드포인트로 HTTP GET 요청을 주기적으로 보내고, 컨테이너가 시작된 후 10초 뒤부터 Probe가 시작된다. Probe는 5초마다 주기적으로 수행되며, 응답이 오는지 확인한다.
Readiness Probe 는 Container 가 트래픽을 수신할 준비가 되었는지 확인하는 데 사용된다. Kubernetes 는 주기적으로 Health Check 요청을 Container 로 보내고, 준비가 되었다는 응답 코드를 수신하면 트래픽을 수신할 준비가 된 컨테이너로 간주한다. 그 외에 다른 코드를 받으면 Kubernetes 는 트래픽을 수신할 준비가 될 때까지 로드밸런서 풀에서 해당 Container 를 제거한다. 이를 통해, Container 가 사용 가능한 상태인지를 실시간으로 확인하고, 사용 가능하지 않은 Pod에 대한 요청을 차단하여 가용성 확보에 기여한다.
예시
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: my-image
readinessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
해석 : 5초 후부터 컨테이너의 8080 포트로 TCP 소켓 연결을 확인하고, 10초마다 주기적으로 Probe를 수행한다.
Startup Probe는 Container 가 올바르게 시작되었는지 확인하는 데 사용된다. Kubernetes는 시작 단계 동안 주기적으로 Health Check 요청을 Container 로 보낸다. 준비가 되었다는 응답 코드를 수신하면 Kubernetes는 해당 Container 가 정상적으로 기동되었다고 판단한다. 지정된 시간 초과 내에 응답을 수신하지 못하면 Kubernetes가 컨테이너를 다시 시작한다. 이를 통해 Liveness Probe 와 마찬가지로, 신뢰성 확보에 기여한다. 해당 Probe는 컨테이너 생성 시 동작하며, 헬스체크에 성공하면 더 이상 동작하지 않는다.
예시
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: my-image
startupProbe:
tcpSocket:
port: 8080
failureThreshold: 30
periodSeconds: 10
해석 : 8080 포트로 TCP 소켓 연결을 기다리며, 10초마다 주기적으로 Probe를 수행한다. 만약 30번의 연속 실패가 발생하면 컨테이너의 시작이 실패로 간주한다.
1. Startup 및 Liveness Probe를 이용
2. Liveness Probe만 이용
위 그림을 비교하였을 때에 Startup Probe를 함께 사용하였을 때에 2가지 이점이 있는 것을 확인할 수 있다.
1. 애플리케이션 기동이 먼저 되면, 설정된 최대 시간보다 빨리 서비스를 할 수 있다. (Readiness Probe가 설정되어 있을 시, 유입이 되기 시작)
2. Liveness Probe의 설정을 조금 더 유연하게 할 수 있다. (Probe 주기, 최대 실패 횟수 등을 다르게 설정 가능)
컨테이너가 정상적인지 아닌지를 체크하는 방법으로 다음과 같이 3가지 방식을 제공한다.
예시
apiVersion: v1
kind: Pod
metadata:
name: liveness-pod
spec:
containers:
- name: liveness-pod
image: my-image
ports:
- containerPort: 8080
livenessProbe:
exec:
command:
- cat
- /healthy
해석 : liveness-pod라는 이름의 Pod를 생성하며, 이 Pod는 my-image 이미지를 사용하고 8080 포트를 사용한다. 또한, 컨테이너의 라이브니스를 확인하기 위해 /healthy 파일을 읽는 명령을 주기적으로 실행한다.
예시
apiVersion: v1
kind: Pod
metadata:
name: readiness-pod
spec:
replicas: 2
selector:
app: readiness-pod
template:
metadata:
name: readiness-pod
labels:
app: readiness-pod
spec:
containers:
- name: readiness-pod
image: my-image
imagePullPolicy: Always
ports:
- containerPort: 8080
readinessProbe:
httpGet:
path: /health
port: 8080
해석 : readiness-pod라는 이름의 Pod를 생성하며, 2개의 복제본을 가진다. 이 Pod는 my-image 이미지를 사용하고 8080 포트를 사용하며, /health 경로로 HTTP GET 요청을 수행하여 준비 상태를 확인한다.
예시
apiVersion: v1
kind: Pod
metadata:
name: liveness-pod-tcp
spec:
containers:
- name: liveness-pod-tcp
image: my-image
imagePullPolicy: Always
ports:
- containerPort: 8080
livenessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
해석 : liveness-pod-tcp라는 이름의 Pod를 생성한다. 이 Pod는 my-image 이미지를 사용하고 8080 포트를 사용한다. 또한, TCP 소켓을 사용하여 5초마다 한 번씩 8080 포트의 라이브니스를 확인한다.
Liveness Probe | Readiness Probe | Startup Probe | |
---|---|---|---|
On failure | - 컨테이너 다시 시작 | - 컨테이너로의 트래픽 전송 중지 | - 컨테이너 다시 시작 |
Check types | - Http - Exec - tcpSocket | - Http - Exec - tcpSocket | - Http - Exec - tcpSocket |
Execute Timing | - 컨테이너 실행 상태 - PosStart 후크 완료 후 - 시작 프로브가 완료된 후 | - 컨테이너 실행 상태 - PosStart 후크 완료 후 - 시작 프로브가 완료된 후 | - 컨테이너 실행 상태 - PosStart 후크 완료 후 |
VALUE | DEFAULT | DESCRIPTION |
---|---|---|
failureThreshold | 3 | Probe 시도가 해당 옵션에 설정된 수 만큼 연속으로 실패하면, Probe가 실패하였다고 판단한다. Kubelet 은 Pod의 Ready 조건을 false 로 설정하고, Probe 유형 별 실패 시 동작을 수행합니다. 기본 값은 3 이다. |
initialDelaySeconds | 0s | Container 가 시작된 후 부터 Startup, Liveness, Readiness Probe가 실행되기 전의 Delay 시간(초) 이다. 기본 값은 0초이며, 최소 값은 0초 이다. |
periodSeconds | 10s | Probe를 수행하는 빈도(초) 이다. 기본 값은 10초 이다. |
successThreshold | 1 | Probe 시도가 실패 후부터 Probe가 성공했다고 판단하는 최소 연속 성공 횟수이다. 기본 값 및 최소 값은 1이다. Startup 및 Liveness Probe는 반드시 1 이어야 한다. |
terminationGracePeriodSeconds (Probe-level) | 30s | Kubelet 이 Probe에 실패한 Container 의 종료를 트리거한 다음, Container Runtime 이 해당 Container 를 강제로 중지하는 사이에 대기하도록 설정한 유예 기간(초) 이다.기본 값은 30 초 이며, 최소 값은 1초 이다. |
timeutSeconds | 1s | Probe 시도 후 실패라고 간주하는 Timeout 시간입니다. 기본 값은 1초 이다. |
참고 :
Kubernetes Probe