Pod health check
readinessProbe | livenessProbe | |
정의 | 컨테이너가 응답할 준비가 되었는지 아닌지/앱이 구동되기 전까지 (파드와)서비스가 연결되지 않도록 해줌 | 컨테이너가 응답하는지 아닌지 |
실패 시 | 파드를 서비스로부터 제외(엔드포인트 제거) | 컨테이너 종료 → restart |
사용하는 경우 | Pod가 처음 구동될 때, 앱이 정상 실행될 때까지 대기해야 하는 경우(=대용량 데이터 불러오는 경우) | 앱의 장애상황 감지, 앱이 무한 루프나 Deadlock에 빠져서 응답을 하지 않는 경우 |
어떤 노드가 죽어서 거기에 떠있는 파드도 죽었을 때, 다른 노드에 새 파드가 생성되려고 함 → 파드는 Running이지만 앱이 부팅중일 때 | 파드의 앱이 장애남 → 파드는 돌아감(500에러) |
readinessProbe : 컨테이너가 실행된 후 서비스 요청 응답 여부 확인, Pod 내 구동되고 있는 프로세스의 health check, 애플리케이션이 시작할 준비가 되었는지 아닌지 확인, 어플리케이션이 구동되기 전까지 서비스와 연결되지 않게 해줌
- 컨테이너가 실행된 다음 바로 서비스에 투입되어 트래픽을 받지 않고, 실제 트래픽을 받을 준비가 되었음을 확인한 후 트래픽을 받을 수 있음 → 애플리케이션 초기화까지 시간이 걸리거나 대용량 데이터를 불러와야하는 상황 등에 대비 가능(→초기화시간에 접속하려고 하면 오류 발생 - 애플리케이션이 로드되지 않은 상황에서 트래픽이 해당 애플리케이션으로 라우팅될 수 있기 때문)
- 컨테이너의 지속적인 유지 및 관리를 위해서 자체적으로 중단을 수행하는 경우
- 실패하면 엔드포인트 컨트롤러는 해당 파드에 연결된 모든 서비스들의 엔드포인트에서 파드의 IP주소 제거(service에서 해당 파드 제외)
- 과정
더보기
- Pod가 뜨게되면 readinessProbe는 initialDelaySeconds에 지정한 값 만큼 기다렸다가 periodSeconds의 값만큼 한번씩 httpGet에 세팅한 path와 port로 health check를 위한 HTTP Get 요청을 날린다.
- 여기서 전달받은 response의 stauts code가 성공(200) 이라면 kubelet은 해당 Pod의 컨테이너가 살아있다고 간주하게 된다.
- 따라서 Rolling Update시에 새로 뜬 Pod에 대해서 readinessProbe의 역할을 마치기 전까지 기존 Pod를 terminate 시키지 않기 때문에 Rolling Update로 인한 다운 타임이 방지된다.
- 하지만 반대로 httpGet에 세팅한 경로로 health check를 했는데 성공(200)이 아닌 400 혹은 500의 status 를 리턴 받는다면, 이 Pod는 이상이 있는 것으로 간주하고 해당 pod로 라우팅되지 않도록 처리한다.
livenessProbe : 컨테이너가 실행됐는지 확인, 애플리케이션이 응답하는지 아닌지 확인
- 파드는 Running, 서비스(어플리케이션)는 정상적이지 않은 경우
- 실패하면 컨테이너 종료, restart 정책에 따라 컨테이너 재시작
- EX) 지정된 포트에 TCP 연결을 시도, 연결되지 않으면 컨테이너를 재시작한다.
STATUS가 running일때 READY가 0/X : 아직 컨테이너의 readiness probe가 통과하지 못함
startupProbe : 컨테이너 내의 애플리케이션이 시작되었는지 확인
- 성공할 때 까지 다른 probe는 활성화되지 않음
- 서비스를 시작하는 데 오랜 시간이 걸리거나 불규칙한 컨테이너에 설정하는 경우(써드파티에서 특정 데이터를 다운받는 경우)
- 실패하면 컨테이너 종료, restart 정책에 따라 재시작
컨테이너 진단 handler
컨테이너가 구현한 handler를 kubelet이 호출해 실행
- Exec : 컨테이너 안에 지정된 명령어를 실행하고 종료 코드가 0일 때 Success
- 볼륨이 연결되어 있는 경우(그 볼륨이 존재하는지 확인)
- TCPSocket : 컨테이너 안에 지정된 IP와 포트로 TCP상태 확인, 포트가 열려있으면 Success
- HTTPGet : 컨테이너 안에 지정된 IP, Port, 경로로 HTTP GET요청 보내 응답 상태 코드가 200~400이면 Success
- EX) 앱에 /health를 날리면 status:200을 받고 서비스 정상 운영중임을 알려줌
옵션
*() = default
- initialDelaySeconds(0초): 최초 Probe하기 전 delay 설정
- periodSeconds(10초): Probe를 확인하는 시간의 간격
- failureThreshold(3회): 몇 번의 실패 결과를 받아야 정말 실패로 인정할건지
- timeoutSeconds(1초): 지정된 시간까지 결과가 와야함
- successThreshold(1회): 몇 번의 성공 결과를 받아야 정말 성공으로 인정할건지
실습
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: django
namespace: ingress-nginx
spec:
selector:
matchLabels:
app: django
template:
metadata:
labels:
app: django
spec:
containers:
- name: api-server-dev
image: clnova.kr-central-1.kcr.dev/winnie-repo/swagger_api_server:v5
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8000
livenessProbe: # health check
tcpSocket:
port: 8000
initialDelaySeconds: 60 #60초후 tcp통신이 되면 컨테이너 정상적으로 뜸
periodSeconds: 30 #30초마다 health check
failureThreshold: 3 #3번 실패 시 container restart
---
apiVersion: v1
kind: Service
metadata:
name: django-svc
namespace: ingress-nginx
spec:
selector:
app: django
ports:
- port: 8000
targetPort: 8000
nodePort: 30300
type: NodePort
- readinessProbe 적용
더보기

Readiness probe가 실패한 django POD의 상태가 Running 이기는 하지만 Ready 상태가 0/1 → 컨테이너가 준비 상태 아님

60초 후 service의 endpoint가 생성됨


- livenessProbe 적용
'인턴' 카테고리의 다른 글
체험형 인턴 경험 정리 (0) | 2024.01.29 |
---|---|
[Kubernetes] Helm / Kustomize (0) | 2023.02.03 |
compute usage를 나타내는 Kibana 대시보드 (0) | 2023.02.03 |
[Kubernetes] helm chart 생성 (1) | 2023.02.03 |