이 글은 일프로 선생님의 쿠버네티스 어나더 클래스 지상편을 수강하고
복습 메뉴얼을 가이드에 따라 작성한 포스팅입니다
쿠버는 probe라는 기능을 통해서 앱을 관리한다
개략적인 설명
pod가 만들어지자마자 startupProbe가 동작한다
startupProbe가 성공하면
readinessProbe와 livenessProbe가 동작한다
readinessProbe가 성공하면 pod를 외부 트래픽과 연결한다
livenessProbe가 성공하다가 실패하면 App을 재기동한다
상세 설명
/ready URL에 10초에 한 번, 10번씩 호출을 해서 단 한번이라도 응답이 오면 성공이라고 간주한다
이 프로브가 성공하면 앞서 설명했듯 readinessProbe와 ivenessProbe가 동작한다
프로브가 실패할 경우 컨테이너를 재시작한다
프로브 자체가 없을 경우 성공으로 간주한다
앞서 설명했듯이 10초를 주기로 1번이라도 응답이 오면 성공으로 간주한다
만일 2회 이상 응답이 안 오면 실패로 간주한다
성공일 경우 이 pod를 바라보는 service와 연결을한다 ->
정확히는 service의 selector와 pod의 label을 연결한다 -> 외부 트래픽 연결
실패일 경우 pod와 service의 연결을 해제한다
app이 살아있는 지를 체크한다
이 프로브가 실패하면 app을 재기동한다.
성공하면 유지를 한다
나머지 속성은 앞서 설명했던 것과 같다
일시적인 장애가 있는 경우
만일 Memory Leak이나, Hikari Connection Pool 고갈 등의 문제로 앱이 정상적으로 동작하지 않는 경우가 있다
잠시 후면 정상 동작할 수 있었을 App이,
LivenessProbe로 인해 재기동되어서 처리 중인 작업이 모두 실패하게 된다
-> LivenessProbe는 체크 주기를 길게 해서 Pod가 쉽게 재기동하는 것을 방지하는 것이 좋다
Readiness Probe의 경우 실패시 외부 접근을 금지시키기 때문에, 크게 부담스럽게 받아들이지 않아도 된다
응용 과제
응용1 : startupProbe가 실패 되도록 설정해서 Pod가 무한 재기동 상태가 되도록 설정해 보세요.
(여러분들이 가장 많이 겪게될 Pod 에러입니다)
내 답안
successThreshold * periodScdons > faiilureThreadhold * periodScdons 의 시간이 짧게 한다
즉, 프로브가 성공하는 시간보다 실패하는 시간을 더 짧게 가져간다
(위 내용은 실험을 통해 검증)
startupProbe:
httpGet:
path: "/startup"
port: 8080
periodSeconds: 5
failureThreshold: 1
일프로님 답안
- 내 답안과 같은 것으로 보인다 -
응용2 : 일시적 장애 상황(App 내부 부하 증가)가 시작 된 후, 30초 뒤에 트래픽이 중단되고, 3분 뒤에는 App이 재기동 되도록 설정해 보세요.
readinessProbe:
httpGet:
path: "/readiness"
port: 8080
periodSeconds: 10
failureThreshold: 3
livenessProbe:
httpGet:
path: "/liveness"
port: 8080
periodSeconds: 60
failureThreshold: 3
10*3초 뒤에는 중단되고
60*3초 뒤에 App이 재기동된다
응용3 : Secret 파일(/usr/src/myapp/datasource/postgresql-info.yaml)이 존재하는지 체크하는 readinessProbe를 만들어 보세요.
(꼭 API를 날리는 것만이 readinessProbe 활용의 전부는 아닙니다)
readinessProbe:
exec:
command: ["cat", "/usr/src/myapp/datasource/postgresql-info.yaml"]
...
P.S. 마지막 응용3이... 시나리오대로 동작하지 않는다.
file이 없을 경우 트래픽 차단되고 있을 경우 트래픽 연결이 되는 것을 보고자 했는데... 이상하다..
일프로님의 답변이 달렸다, 한 번 다시 시도해볼 예정!
수행해보기
하지만 난 손이 빠르지 않았다... 그리고 어느 타이밍에 지워야 하는지 모르겠다!
→ 왠지 손탓이 아닌 것 같다 secret으로 지정된 path는 read-only로 보인다
자세한 내용을 공식 문서에 못 찾았지만,
기본적으로 Secret은 Read-Only인 것 같다
위와 같이 false 로 해도 설정이 통하지 않는다
그래서 생각을 해본 결과 예제를 아래처럼 변경하기로 했다
readinessProbe:
exec:
command: ["cat", "/usr/src/myapp/something.yaml"]
그리고 필요한 파일을 잠시 뒤에 만들어주자. (천천히 만들어도 된다!)
그러면 이제 몇 초 뒤에 ! 아래처럼 트래픽이 유입되는 걸 확인할 수 있다
참고하면 좋은 글 ^^
쿠버 공식 문서 ♥
https://kubernetes.io/ko/docs/concepts/workloads/pods/pod-lifecycle/
'Infra, DevOps > 인프런 k8s 복습인증' 카테고리의 다른 글
[일프로님 k8s 복습인증] 4. Object 그려보며 이해하기 (0) | 2024.01.24 |
---|---|
[일프로님 k8s 복습인증] 3. 실무에서 느껴본 쿠버네티스가 정말 편한 이유 (1) | 2024.01.24 |
[일프로님 k8s 복습인증] 2. 쿠버네티스 무게감 있게 설치하기 (0) | 2024.01.23 |
[일프로님 k8s 복습인증] 1. 컨테이너 한방 정리 (0) | 2024.01.23 |
hi hello... World >< 가장 아름다운 하나의 해답이 존재한다
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!