Monitoring을 위해서 kube-prometheus-stack을 배포해서 사용 중이었다.
성능 테스트를 위해 Pod Memory 그래프를 살펴보니 분명 limit을 300Mi로 설정했는데 600Mi로 나왔다.
Limit을 뚫고 Memory가 올라간다..? 뭔가 이상해서 알아보니 다음과 같은 문제가 있었다.
[버그] kube-prometheus-stack helm uninstall 시 kubelet service 삭제되지 않음.
kube-prometheus-stack을 배포하면 kube-system Namespace에 다음 Service가 생성된다.
<helm release name>-<kube-prometheus-stack>-coredns
<helm release name>-<kube-prometheus-stack>-kube-controller-manager
<helm release name>-<kube-prometheus-stack>-kube-etcd
<helm release name>-<kube-prometheus-stack>-kube-proxy
<helm release name>-<kube-prometheus-stack>-kube-scheduler
<helm release name>-<kube-prometheus-stack>-kubelet
참고로 helm release name 길이에 따라서 뒤에 오는 kube-prometheus-stack 부분이 잘리는 것 같다.
relese name을 my로 생성해보면 잘림 없이 service name에 다 포함되었다.
암튼 총 6개의 Service가 생성된다.
근데 빨간 박스 위에 kube-prometheus-stack-kubelet이 보이는가?
빨간 박스의 서비스와 다른 날짜에 생성된 거다.
history를 설명하자면 19일 전에 kube-prometheus-stack을 배포하고 그 다음날 helm uninstall 후 사용했던 namespace 삭제 후 다시 배포했다. 그래서 당연히 생성된 리소스 다 삭제된 줄 알았는데 kube-system namespace의 kubelet service는 삭제되지 않고 남아있었다. 실제 테스트를 해보니 저것만 계속 남아있었다. 인터넷을 찾아보니 직접 삭제해주라고 하더라.
그래서 직접 kubectl delete service <서비스명> -n kube-system 명령어를 실행해서 삭제해줬다.
삭제 후 Metric은 제대로 쌓였다.
이미 쌓인 Metric은 여전히 2배로 나왔다.
문제 해결 과정
1. Grafana에서 그래프가 이상하게 나옴.
2. Grafana DataSource인 Prometheus에 날리는 쿼리문이 뭔지 살펴봄.
3. Query result를 살펴봄
# 기존 쿼리문: sum(container_memory_working_set_bytes{job="kubelet", metrics_path="/metrics/cadvisor", cluster="", namespace="kubeflow-user-example-com", pod="test-0", container!="", image!=""}) by (container)
# 기존 쿼리분에서 sum과 by 제거
container_memory_working_set_bytes{job="kubelet", metrics_path="/metrics/cadvisor", cluster="", namespace="kubeflow-user-example-com", pod="test-0", container!="", image!=""}
# Result 중 하나 예시
container_memory_working_set_bytes{container="istio-proxy", endpoint="https-metrics", id="/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-pod68786c4c_3413_4157_8dcd_5038f649eead.slice/cri-containerd-d5abb152920a6fd26806dd1fb4834285120e20fa2e1d064b9cd555c86d471458.scope", image="docker.io/istio/proxyv2:1.22.1", instance="10.0.4.183:10250", job="kubelet", metrics_path="/metrics/cadvisor", name="d5abb152920a6fd26806dd1fb4834285120e20fa2e1d064b9cd555c86d471458", namespace="kubeflow-user-example-com", node="ip-10-0-4-183.ap-northeast-2.compute.internal", pod="test-0", service="kube-prometheus-stack-kubelet"}
4. service만 다르고 동일한 metric이 존재함. 중복으로 쌓이는 것을 감지.
5. 원인 파악 완료
'Kubernetes' 카테고리의 다른 글
Kubernetes 관리 툴 K9S 설치 방법 및 사용 방법 (0) | 2025.02.17 |
---|---|
[k8s] NodeSelector, PodNodeSelector, NodeLabel (0) | 2025.02.14 |
Onpremise에 Kubeflow 구축하기 (0) | 2024.12.03 |
kubeadm으로 Kubernetes 구축하기 on AWS EC2 (Containerd, Calico, RHEL8/RHEL9) (1) | 2024.11.23 |
Kubernetes 버전에 따른 kube-system 이미지 버전 찾는 법 (0) | 2024.11.23 |