📚 3가지 종류의 Probe
- Probe에는 3가지 종류가 있음
- 몇초 간격으로 할지, 성공이랑 실패에 대한 수치를 설정할 수 있음
- 컨테이너 안에 있는 앱에는 ready라는 URL을 사전에 만들어야 함
- 파드가 만들어지자마자 probe 기능들이 동작을 함
App 기동 중
- 응답을 받을 수 없어 계속 실패가 될 것
- startupProbe는 10번을 실패하기 전에 한번이라도 응답이 있으면 성공으로 간주
앱 기동이 성공
- startupProbe 기능을 중지시키고 readiness와 liveness 기능을 동작시킴
- 앱이 살아있는 동안 계속 200 리턴하면서 두 probe 동작이 반복
- readinessProbe는 성공을 했을 때 외부 트래픽을 Pod가 받을 수 있는 상태로 만들어주면서 서비스가 활성화됨
- livenessProbe는 App이 살아있는지를 계속 체크하는 역할
장애 발생
- 앱이 장애가 발생하게 되면 API는 실패를 하게 되고 설정에 따라 두 번 실패하게되면 k8s는 앱을 재기동시킴
Question
왜 귀찮게 Probe마다 API들을 기입하는 항목이 각각 있을까?
livenessProbe랑 readinessProbe는 같이 실패를 할 텐데 굳이 readinessProbe도 계속 호출이 될 필요가 있을까?
🔎 로그를 통한 Probe 이해
- 사실 실제 App에서 startupProbe는 이미 실패중이었음
- 이렇게 앱이 기동되기 전에는 API를 받지 못하기 때문에 실제로 스타트업 프로브에 로그가 찍힐 수가 없음
- 만약에 WAS로 톰캣을 썼다면 startupProbe가 찍히는 건 access.log에서 볼 수 있음
- 위의 사진에서는 동작 확인을 위한 임의로 코드를 구성
- User 초기화 구간에는 readinessProbe가 실패를 하도록 일부러 만듦
- 즉 의도대로 기능이 정확하게 동작을 해준 것
⭐️ 자동화 요구사항을 만족시키는 Probe
1. Application 동작
App 초기화
- 파드가 생성되고 컨테이너 내부에는 JAR 파일이 실행되면서 내부에 있는 Spring 초기화, DB 연결이 끝나야 함
- 이 과정을 통해 트래픽을 받을 수 있는 준비를 마침
User 초기화
- 초기 데이터 로딩, 필수로 연결시켜야 되는 시스템 체크, DB 데이터 Validation
2. 자동화 요구사항
App 초기화
- 시스템적으로 API를 받을 수 없는 상태
- App 상태 체크 기능의 목적은 초기화가 다 끝났는지를 아는 것
- 외부 API 접근 금지 시켜야함
User 초기화
- API를 받을 수 있는 상태
- 앱 상태 체크의 기능의 목적은 앱이 살아 있는지를 아는 것
- 외부 API 접근 금지는 여전히 필요
App 기동 이후
- 앱 상태 체크의 기능의 목적은 앱이 살아 있는지를 아는 것
- 외부 API 접근 허용
3. k8s 제공 기능
App 초기화
- k8s가 API를 계속 날리면서 App 초기화가 끝났는지 판단
- Service와 Pod는 Selector와 labels로 잘 매핑했지만 k8s는 이것을 미리 연결해놓지는 않음
User 초기화
- readinessProbe는 App에서 결과가 실패로 떨어지는 동안 서비스와 파드를 연결하지 않음
- 성공을 하면 두 object를 연결하고 트래픽이 들어오게 됨
- 실패할 경우 재연결 시도
- **User초기화 과정에서 외부 API 접근을 금지 시켜야 하기 때문에 readinessProbe를 일부러 실패시킴**
- readiness와 liveness는 앱이 죽을 때까지 계속 헬스 체크를 해야하기에 로직을 가볍게 만들어야 됨
정리
☠️ 일시적인 장애 발생시
일시적인 장애 발생 시
- 순간적으로 앱의 부하가 높아지고 잠깐 렉이 걸리거나 쓰레드풀이 찰 수도 있음
- 이 순간에도 외부 API가 계속 들어오면서 상황이 더욱 악화됨
- 두 프로브가 실패하게 되면 k8s는 파드를 재기동 시킴
- Probe기능이 없었다면 앱이 다시 정상으로 돌아올 수 있으나 파드를 재기동시키면서 처리 중인 작업들이 모두 실패됨
보완 방법
- 일시 부하 상황에서 readinessProbe가 실패하면서 외부 API 접근을 금지시키고 앱에 추가적인 부담을 감소시킴
- 다만 livenessProbe 체크 주기를 readinessProbe와 같지 않게 설정해서 재기동되는 걸 조금 더 지연시켜야 함
- 중요한 시스템들은 보통 파드를 이중화시키기에 재기동만이 답은 아님
출처
[인프런] 쿠버네티스 어나더 클래스 (지상편) - Sprint 1, 2
저자 : 일프로
'k8s' 카테고리의 다른 글
[1-6] Application 기능으로 이해하기 - Configmap, Secret (1) | 2024.04.16 |
---|---|
Private Cloud에서 k8s 설치하기 (0) | 2024.04.15 |
[1-4] Object 기본적인 이해 (1) | 2024.04.12 |
[1-3] 쿠버네티스가 정말 편한 이유 (0) | 2024.04.10 |
[1-2] 깊이있는 쿠버네티스 설치 (0) | 2024.04.01 |