From 97eb6c8835c6cb3467736a0e4fceb36683d45618 Mon Sep 17 00:00:00 2001 From: Youn Chan Hyeok Date: Fri, 8 May 2026 19:43:02 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20K8s=20client=20=EB=B2=84=EC=A0=84=20?= =?UTF-8?q?=EC=97=85=EA=B7=B8=EB=A0=88=EC=9D=B4=EB=93=9C=20=EB=B0=8F=20?= =?UTF-8?q?=EC=8A=A4=EC=BC=80=EC=A4=84=EB=9F=AC=20=EB=A7=88=EB=B9=84=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20(closes=20#48)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - build.gradle: client-java 21.0.1 → 24.0.0 (K8s 1.34 지원, observedGeneration 호환) - KubernetesService: catch ApiException → Exception으로 확대 (방어 코드) - MetricsCollectionScheduler: getAllPods() 호출을 outer try/catch로 보호 - AnomalyDetectionService: getAllPods() 호출을 outer try/catch로 보호 Co-Authored-By: Claude Sonnet 4.6 --- build.gradle | 2 +- .../dgu/cap/ai/MetricsCollectionScheduler.java | 16 ++++++++++------ .../dgu/cap/anomaly/AnomalyDetectionService.java | 16 ++++++++++------ .../dgu/cap/kubernetes/KubernetesService.java | 6 +++--- 4 files changed, 24 insertions(+), 16 deletions(-) diff --git a/build.gradle b/build.gradle index 0213d6c..d1c14a9 100644 --- a/build.gradle +++ b/build.gradle @@ -22,7 +22,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-redis' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-mail' - implementation 'io.kubernetes:client-java:21.0.1' + implementation 'io.kubernetes:client-java:24.0.0' compileOnly 'org.projectlombok:lombok' developmentOnly 'org.springframework.boot:spring-boot-devtools' runtimeOnly 'org.postgresql:postgresql' diff --git a/src/main/java/com/dgu/cap/ai/MetricsCollectionScheduler.java b/src/main/java/com/dgu/cap/ai/MetricsCollectionScheduler.java index 3fe8b4c..ee46943 100644 --- a/src/main/java/com/dgu/cap/ai/MetricsCollectionScheduler.java +++ b/src/main/java/com/dgu/cap/ai/MetricsCollectionScheduler.java @@ -27,13 +27,17 @@ public class MetricsCollectionScheduler { @Scheduled(fixedDelay = 60000) public void collectAndSendMetrics() { - List pods = kubernetesService.getAllPods(); - for (PodInfo pod : pods) { - try { - sendMetrics(pod); - } catch (Exception e) { - log.warn("메트릭 수집/전송 실패 - pod: {}, error: {}", pod.getPodName(), e.getMessage()); + try { + List pods = kubernetesService.getAllPods(); + for (PodInfo pod : pods) { + try { + sendMetrics(pod); + } catch (Exception e) { + log.warn("메트릭 수집/전송 실패 - pod: {}, error: {}", pod.getPodName(), e.getMessage()); + } } + } catch (Exception e) { + log.error("메트릭 수집 스케줄러 전체 실패: {}", e.getMessage()); } } diff --git a/src/main/java/com/dgu/cap/anomaly/AnomalyDetectionService.java b/src/main/java/com/dgu/cap/anomaly/AnomalyDetectionService.java index 951b49d..84b3393 100644 --- a/src/main/java/com/dgu/cap/anomaly/AnomalyDetectionService.java +++ b/src/main/java/com/dgu/cap/anomaly/AnomalyDetectionService.java @@ -40,13 +40,17 @@ public class AnomalyDetectionService { @Scheduled(fixedDelay = 30000) public void detectAnomalies() { - List pods = kubernetesService.getAllPods(); - for (PodInfo pod : pods) { - try { - checkPod(pod); - } catch (Exception e) { - log.warn("Pod 이상 탐지 중 오류 - pod: {}, error: {}", pod.getPodName(), e.getMessage()); + try { + List pods = kubernetesService.getAllPods(); + for (PodInfo pod : pods) { + try { + checkPod(pod); + } catch (Exception e) { + log.warn("Pod 이상 탐지 중 오류 - pod: {}, error: {}", pod.getPodName(), e.getMessage()); + } } + } catch (Exception e) { + log.error("이상 탐지 스케줄러 전체 실패: {}", e.getMessage()); } } diff --git a/src/main/java/com/dgu/cap/kubernetes/KubernetesService.java b/src/main/java/com/dgu/cap/kubernetes/KubernetesService.java index 61e9432..dcc466e 100644 --- a/src/main/java/com/dgu/cap/kubernetes/KubernetesService.java +++ b/src/main/java/com/dgu/cap/kubernetes/KubernetesService.java @@ -48,7 +48,7 @@ public List getPods(String namespace) { return podList.getItems().stream() .map(this::toPodInfo) .collect(Collectors.toList()); - } catch (ApiException e) { + } catch (Exception e) { log.warn("Pod 목록 조회 실패 - namespace: {}, error: {}", namespace, e.getMessage()); return Collections.emptyList(); } @@ -61,7 +61,7 @@ public List getAllPods() { return podList.getItems().stream() .map(this::toPodInfo) .collect(Collectors.toList()); - } catch (ApiException e) { + } catch (Exception e) { log.warn("전체 Pod 목록 조회 실패: {}", e.getMessage()); return Collections.emptyList(); } @@ -77,7 +77,7 @@ public List getPodEvents(String podName, String namespace) { return eventList.getItems().stream() .map(this::toPodEvent) .collect(Collectors.toList()); - } catch (ApiException e) { + } catch (Exception e) { log.warn("Pod 이벤트 조회 실패 - pod: {}, error: {}", podName, e.getMessage()); return Collections.emptyList(); }