Application 기능으로 이해하기 - Probe > 응용과제 [미션2]
▶ 응용1 : startupProbe가 실패 되도록 설정해서 Pod가 무한 재기동 상태가 되도록 설정해 보세요.
사전작업
Object 그려보며 이해하기 실습에서 진행한 인프라 코드들을 재사용하기 위해 배포한 오브젝트들을 kubectl 명령어로 삭제합니다.
[root@k8s-master ~]# kubectl delete ns anotherclass-123
[root@k8s-master ~]# kubectl delete pv api-tester-1231-files
startupProbe가 실패하도록 만들기 위해 Deployment YAML 파일 내용을 아래와 같이 수정합니다.
failureThreshold의 값을 기존 36에서 1로 변경합니다.
startupProbe:
httpGet:
path: "/startup"
port: 8080
periodSeconds: 5
failureThreshold: 1 # 이 부분 수정
로그를 관찰하기 쉽도록 HPA minReplica 1로 바꿉니다.
$ kubectl patch -n anotherclass-123 hpa api-tester-1231-default -p '{"spec":{"minReplicas":1}}'
결과
▶ 응용2 : 일시적 장애 상황(App 내부 부하 증가)가 시작 된 후, 30초 뒤에 트래픽이 중단되고, 3분 뒤에는 App이 재기동 되도록 설정해 보세요.
(아래 API를 날리면 readinessProbe와 livenessProbe가 동시에 실패하게 됩니다)
사전작업
응용 1. 에서 진행한 인프라 코드들을 재사용합니다.
2. 일시적 장애 상황(App 내부 부하 증가)가 시작 된 후, 30초 뒤에 트래픽이 중단되고, 3분 뒤에는 App이 재기동 되도록 Deployment YAML 파일 내용을 아래와 같이 수정합니다.
livenessProbe 의 periodSeconds 값을 기존 10에서 60으로 변경합니다.
startupProbe:
httpGet:
path: "/startup"
port: 8080
periodSeconds: 5
failureThreshold: 10 # 1에서 10으로 다시 증가
readinessProbe:
httpGet:
path: "/readiness"
port: 8080
periodSeconds: 10
failureThreshold: 3
livenessProbe:
httpGet:
path: "/liveness"
port: 8080
periodSeconds: 60 # 이 부분 수정
failureThreshold: 3
1. 30초 뒤 트래픽 중단
readinessProbe는 10초마다 체크하고, 3번 연속 실패해야 Ready가 false가 됩니다.
10초 × 3 = 30초 후 서비스에서 Pod가 제외되어 트래픽이 중단됩니다.
2. 3분 뒤 App 재기동
livenessProbe는 60초마다 체크하고, 3번 연속 실패해야 Pod를 재시작합니다.
60초 × 3 = 180초(3분) 후 컨테이너가 재시작합니다.
3. 일시적 장애사항 부여
// 부하 증가 API - (App 내부 isAppReady와 isAppLive를 False로 바꿈)
curl http://192.168.56.30:31231/server-load-on
2025-06-09 19:43:50 2025-06-09T10:43:50.764Z INFO 1 --- [nio-8080-exec-6] DefaultController : [SyStem] The system load has occurred
2025-06-09 19:43:55 2025-06-09T10:43:55.879Z INFO 1 --- [nio-8080-exec-7] DefaultService : [Kubernetes] readinessProbe is Failed-> [System] isAppReady: false
# livenessProbe 실패 1회차
2025-06-09 19:44:05 2025-06-09T10:44:05.883Z INFO 1 --- [nio-8080-exec-8] DefaultService : [Kubernetes] livenessProbe is Failed-> [System] isAppLive: false
2025-06-09 19:44:05 2025-06-09T10:44:05.883Z INFO 1 --- [nio-8080-exec-9] DefaultService : [Kubernetes] readinessProbe is Failed-> [System] isAppReady: false
2025-06-09 19:44:15 2025-06-09T10:44:15.882Z INFO 1 --- [io-8080-exec-10] DefaultService : [Kubernetes] readinessProbe is Failed-> [System] isAppReady: false
2025-06-09 19:44:15 2025-06-09T10:44:15.895Z INFO 1 --- [nio-8080-exec-1] DefaultService : [Kubernetes] readinessProbe is Failed-> [System] isAppReady: false
2025-06-09 19:44:25 2025-06-09T10:44:25.884Z INFO 1 --- [nio-8080-exec-2] DefaultService : [Kubernetes] readinessProbe is Failed-> [System] isAppReady: false
2025-06-09 19:44:35 2025-06-09T10:44:35.878Z INFO 1 --- [nio-8080-exec-3] DefaultService : [Kubernetes] readinessProbe is Failed-> [System] isAppReady: false
2025-06-09 19:44:45 2025-06-09T10:44:45.884Z INFO 1 --- [nio-8080-exec-4] DefaultService : [Kubernetes] readinessProbe is Failed-> [System] isAppReady: false
2025-06-09 19:44:55 2025-06-09T10:44:55.885Z INFO 1 --- [nio-8080-exec-5] DefaultService : [Kubernetes] readinessProbe is Failed-> [System] isAppReady: false
2025-06-09 19:45:05 2025-06-09T10:45:05.879Z INFO 1 --- [nio-8080-exec-6] DefaultService : [Kubernetes] readinessProbe is Failed-> [System] isAppReady: false
# livenessProbe 실패 2회차
2025-06-09 19:45:05 2025-06-09T10:45:05.880Z INFO 1 --- [nio-8080-exec-7] DefaultService : [Kubernetes] livenessProbe is Failed-> [System] isAppLive: false
2025-06-09 19:45:15 2025-06-09T10:45:15.885Z INFO 1 --- [nio-8080-exec-9] DefaultService : [Kubernetes] readinessProbe is Failed-> [System] isAppReady: false
2025-06-09 19:45:25 2025-06-09T10:45:25.883Z INFO 1 --- [nio-8080-exec-8] DefaultService : [Kubernetes] readinessProbe is Failed-> [System] isAppReady: false
2025-06-09 19:45:30 2025-06-09T10:45:30.803Z INFO 1 --- [io-8080-exec-10] DefaultService : [Kubernetes] readinessProbe is Failed-> [System] isAppReady: false
2025-06-09 19:45:35 2025-06-09T10:45:35.885Z INFO 1 --- [nio-8080-exec-1] DefaultService : [Kubernetes] readinessProbe is Failed-> [System] isAppReady: false
2025-06-09 19:45:45 2025-06-09T10:45:45.882Z INFO 1 --- [nio-8080-exec-2] DefaultService : [Kubernetes] readinessProbe is Failed-> [System] isAppReady: false
2025-06-09 19:45:55 2025-06-09T10:45:55.883Z INFO 1 --- [nio-8080-exec-3] DefaultService : [Kubernetes] readinessProbe is Failed-> [System] isAppReady: false
# livenessProbe 실패 3회차
2025-06-09 19:46:05 2025-06-09T10:46:05.888Z INFO 1 --- [nio-8080-exec-5] DefaultService : [Kubernetes] livenessProbe is Failed-> [System] isAppLive: false
2025-06-09 19:46:05 2025-06-09T10:46:05.888Z INFO 1 --- [nio-8080-exec-4] DefaultService : [Kubernetes] readinessProbe is Failed-> [System] isAppReady: false
2025-06-09 19:46:05 2025-06-09T10:46:05.984Z INFO 1 --- [nio-8080-exec-7] DefaultService : [Kubernetes] readinessProbe is Failed-> [System] isAppReady: false
2025-06-09 19:46:36
2025-06-09 19:46:36 . ____ _
2025-06-09 19:46:36 /\\ / ___'_ __ (_)_ _ \ \ \ \
2025-06-09 19:46:36 ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
2025-06-09 19:46:36 \\/ ___)| |_)| | | | | || (_| | ) ) ) )
2025-06-09 19:46:36 ' |____| .__|_| |_|_| |_\__, | / / / /
2025-06-09 19:46:36 =========|_|==============|___/=/_/_/_/
2025-06-09 19:46:36 :: Spring Boot :: (v3.1.0)
2025-06-09 19:46:36
2025-06-09 19:46:38 2025-06-09T10:46:38.590Z INFO 1 --- [ main] com.pro.app.AppApplication : Starting AppApplication v0.0.1-SNAPSHOT using Java 17.0.2 with PID 1 (/usr/src/myapp/app.jar started by root in /usr/src/myapp)
2025-06-09 19:46:38
2025-06-09T10:46:38.784Z INFO 1 --- [ main] com.pro.app.AppApplication : The following 1 profile is active: "dev"
4. API 실패 상태 확인
// 외부 API 실패
[root@k8s-master ~]# curl http://192.168.56.30:31231/hello
curl: (7) Failed to connect to 192.168.56.30 port 31231: Connection refused
5. 장애사항 제거
// 부하 감소 API - (App 내부 isAppReady와 isAppLive를 True로 바꿈)
curl http://192.168.56.30:31231/server-load-off
▶ 응용3 : Secret 파일(/usr/src/myapp/datasource/postgresql-info.yaml)이 존재하는지 체크하는 readinessProbe를 만들어 보세요.
사전작업
응용 1. 에서 진행한 인프라 코드들을 재사용합니다.
2. Secret 파일(/usr/src/myapp/datasource/postgresql-info.yaml)이 존재하는지 체크하도록 Deployment YAML 파일 내용을 아래와 같이 수정합니다.
startupProbe:
httpGet:
path: "/startup"
port: 8080
periodSeconds: 5
failureThreshold: 10
readinessProbe:
exec:
command: ["cat", "/usr/src/myapp/datasource/postgresql-info.yaml"]
periodSeconds: 10
failureThreshold: 3
livenessProbe:
httpGet:
path: "/liveness"
port: 8080
periodSeconds: 10
failureThreshold: 3
Readiness Probe 확인
현재는 exec 속성으로 command를 날렸을 때 해당 경로에 파일이 있어 실패를 안하고 있기 때문에 이벤트가 안 찍히는 중입니다.
Deployment YAML 파일 내용 가운데 exec 속성의 command를 존재하지 않는 파일을 찾도록 수정합니다.
수정하고 나면 아래와 같이 Readiness Probe 실패 이벤트 확인 가능합니다.
댓글을 작성해보세요.