일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- readiness probe
- properties
- pod
- Heap
- 티스토리챌린지
- k8s
- java
- 오블완
- startup probe
- Probe
- spring boot
- Java Virtual Machine
- evicted
- configmap
- property
- logback
- liveness probe
- OOM
- xms
- application properties
- diskpressure
- Kubernetes
- Xmx
- jpa
- ORM
- JVM
- Today
- Total
여우발개발
연쇄 pod evict 마 처치하기 본문
배경
평화로운 어느 날 인프라팀으로부터 연락이 왔다.
➜ k get po
NAME READY STATUS RESTARTS AGE
service-84b696cf44-29nkp 1/1 Running 0 49d
service-84b696cf44-2z2j9 0/1 Evicted 0 7d1h
service-84b696cf44-48vtm 1/1 Running 0 49d
service-84b696cf44-4p78z 1/1 Running 0 25d
service-84b696cf44-4swht 0/1 Evicted 0 39d
service-84b696cf44-5qzlq 0/1 Evicted 0 7d1h
service-84b696cf44-65w7f 0/1 Evicted 0 24d
service-84b696cf44-79xs9 0/1 Evicted 0 39d
service-84b696cf44-7jchf 0/1 Evicted 0 39d
service-84b696cf44-7p2qf 0/1 Error 0 162d
service-84b696cf44-86k6v 0/1 Evicted 0 39d
service-84b696cf44-8fpmz 0/1 Evicted 0 24d
service-84b696cf44-8pzk7 0/1 ContainerStatusUnknown 1 162d
service-84b696cf44-94vqb 0/1 Evicted 0 7d1h
service-84b696cf44-96dzg 1/1 Running 0 39d
service-84b696cf44-999lc 0/1 Evicted 0 24d
service-84b696cf44-9fqbp 1/1 Running 0 7d1h
service-84b696cf44-9kkd5 1/1 Running 0 40d
service-84b696cf44-b2msj 1/1 Running 0 8d
service-84b696cf44-b4sm9 0/1 Evicted 0 24d
service-84b696cf44-bcmdn 0/1 Error 0 162d
service-84b696cf44-bnrgq 0/1 Evicted 0 24d
service-84b696cf44-bq5wk 0/1 Evicted 0 24d
service-84b696cf44-c2s2g 0/1 Evicted 0 8d
service-84b696cf44-cvsr7 0/1 Evicted 0 7d1h
service-84b696cf44-dgjl4 1/1 Running 0 162d
service-84b696cf44-dlz4l 0/1 ContainerStatusUnknown 1 162d
service-84b696cf44-dw72x 1/1 Running 0 49d
service-84b696cf44-f7mvt 0/1 Evicted 0 24d
service-84b696cf44-fjllg 1/1 Running 0 49d
service-84b696cf44-fl5ck 0/1 Evicted 0 24d
service-84b696cf44-g4pml 1/1 Running 0 162d
service-84b696cf44-h2bwf 0/1 Evicted 0 39d
service-84b696cf44-hmfvr 1/1 Running 0 24d
service-84b696cf44-jkphn 0/1 Evicted 0 39d
service-84b696cf44-k4vfl 0/1 Evicted 0 7d1h
service-84b696cf44-k5rxl 0/1 Evicted 0 8d
service-84b696cf44-l4fhf 1/1 Running 0 162d
service-84b696cf44-lmjws 0/1 Evicted 0 39d
service-84b696cf44-p8rlh 0/1 Evicted 0 8d
service-84b696cf44-pbcbg 1/1 Running 0 49d
service-84b696cf44-pj2bm 0/1 Evicted 0 24d
service-84b696cf44-pl7fj 0/1 Evicted 0 39d
service-84b696cf44-pxtbn 0/1 Evicted 0 7d1h
service-84b696cf44-qdl97 0/1 Evicted 0 39d
service-84b696cf44-qg64k 0/1 Evicted 0 24d
service-84b696cf44-r2bks 0/1 Error 0 162d
service-84b696cf44-rjxc9 0/1 Evicted 0 8d
service-84b696cf44-sc2s4 0/1 Error 0 162d
service-84b696cf44-smvw6 0/1 Evicted 0 24d
service-84b696cf44-t4cw9 0/1 Evicted 0 24d
service-84b696cf44-t5t7z 1/1 Running 0 162d
service-84b696cf44-t6bxh 0/1 Evicted 0 39d
service-84b696cf44-vk67k 0/1 Evicted 0 8d
service-84b696cf44-vrc7k 1/1 Running 0 162d
service-84b696cf44-w59n2 0/1 Evicted 0 24d
service-84b696cf44-w6h8w 0/1 Evicted 0 39d
service-84b696cf44-wt4cd 1/1 Running 0 162d
service-84b696cf44-wv89d 0/1 Evicted 0 7d1h
service-84b696cf44-xdcw7 0/1 Evicted 0 7d1h
service-84b696cf44-xlb64 1/1 Running 0 49d
service-84b696cf44-zr2rm 0/1 Evicted 0 7d1h
service-84b696cf44-zvflt 0/1 Evicted 0 24d
특정 클러스터의 pod가 계속 evict 된다고 한다. 확인해 보니 전부 같은 서비스 pod이다.
헉 이게 무슨일이람! 당장 원인을 찾고 해결해 보자.
목표
- evicted 원인 파악
- evicted 원인 제거
Log
서비스하던 클러스터에 다수의 pod들이 evicted 됐다.
일단 서비스에 이슈가 있는지 확인해 본다. API 호출은 잘 된다. 떠있던 pod가 evicted 되고 다시 새로 뜨면서 큰 문제없이 돌아간다.
evicted 되었다는 것은 알게 되었지만, 왜 evicted 상태가 되는지는 모른다. 일단 코드 상 문제가 있었나 생각해 본다.
근래의 배포는 없었다. 가장 최근의 배포건도 특이할만한 변경사항은 없다. 비즈니스 로직 상의 문제는 아니어 보인다.
💬 pod가 evicted 됐는데 원인이 뭘까?
Pod가 Evicted 된 주된 원인은 아래와 같아
- 리소스 부족 (Resource Pressure)
- 노드의 메모리나 디스크 공간 부족으로 Kubelet이 Pod를 제거했을 가능성.
- 이벤트 로그에 node(s) had insufficient memory 또는 node(s) had disk pressure 같은 메시지가 있을 수 있어.
- 노드 스케줄링 제한
- 노드가 스케줄링 불가능 상태 (NoSchedule 또는 NoExecute Taint).
- Node Drain 작업
- 관리자가 노드를 유지보수하기 위해 Drain 명령을 실행했다면 해당 Pod가 Evicted됐을 수도 있어.
- Preemption (우선순위)
- 더 높은 우선순위 Pod가 스케줄링되기 위해 낮은 우선순위 Pod가 Evicted됨.
- PV(Persistent Volume) 연결 문제
- Pod가 사용하는 스토리지 리소스가 노드에서 사용 불가능했을 때 발생.
kubectl describe pod [POD_NAME]로 자세한 원인을 확인해 봐! Logs와 Events를 보면 구체적인 이유가 나올 거야.
gpt가 알려준 대로 log 조회를 해보려고 했으나 evicted 된 pod에서는 log 조회가 안된다
C:\Users\devfoxbox>kubectl logs service-84b696cf44-w6h8w
Error from server (NotFound): pods "service-84b696cf44-w6h8w" not found
describe 명령어를 쓰니 확인된다.
C:\Users\devfoxbox>kubectl describe pod service-84b696cf44-w6h8w -n service
Name: service-84b696cf44-w6h8w
Namespace: service
Priority: 0
Service Account: default
Node: w-59dtn/
Start Time: Sat, 30 Nov 2024 05:17:24 +0900
Labels: app=service
pod-template-hash=84b696cf44
zone=prod
Annotations: prometheus.io/path: /actuator/prometheus
prometheus.io/port: 8080
prometheus.io/scrape: true
Status: Failed
Reason: Evicted
Message: Pod The node had condition: [DiskPressure].
...
Status: Failed
Reason: Evicted
Message: Pod The node had condition: [DiskPressure].
아. disk가 찼구나. 가장 유력한 부분은 application file logging 하는 부분
maxhistory 설정이 안 돼있다.
<appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender" additivity="false">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/server-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- 최대 로그 보관 기간 설정 -->
<maxHistory>5</maxHistory>
</rollingPolicy>
<encoder>
<Pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n</Pattern>
</encoder>
</appender>
kubectl pod 상태 확인 명령어
1. kubectl logs
kubectl logs [-f] [-p] (POD | TYPE/NAME) [-c CONTAINER]
- 목적: Pod 내 컨테이너의 로그를 확인할 때 사용.
- 출력 내용: Pod 내 컨테이너에서 발생한 로그 메시지(애플리케이션 로그 등)를 출력.
- 주요 용도: 컨테이너가 무엇을 하고 있는지, 에러가 발생했는지 등을 확인할 때 사용.
- 사용 예시:
- kubectl logs [POD_NAME] -n [NAMESPACE]
- 여러 컨테이너에서 -> kubectl logs [POD_NAME] -n [NAMESPACE] -c [CONTAINER_NAME]
- 재시작된 경우 이전 컨테이너 로그 확인 -> kubectl logs [POD_NAME] -n [NAMESPACE] -p
2. kubectl describe
kubectl describe (-f FILENAME | TYPE [NAME_PREFIX | -l label] | TYPE/NAME)
- 목적: Pod나 다른 리소스의 상세 상태, 메타데이터, 이벤트, 설정 등을 확인할 때 사용.
- 출력 내용: Pod의 상태, 리소스 요청/제공, Node와의 연관, Pod 이벤트, 최근 상태 변화 등을 포함.
- 주요 용도: Pod의 상태를 종합적으로 파악하고, 문제가 발생한 이유(예: CrashLoopBackOff, Evicted 등)를 확인할 때 사용.
- 사용 예시: kubectl describe pod [POD_NAME] -n [NAMESPACE]
- 출력 내용 예시:
-
- Containers: 각 컨테이너의 상태, 이미지, 리소스 요청 등.
- Events: Pod가 발생한 이벤트 (예: Eviction, Crash 등).
- Conditions: Pod의 상태 변화(예:
Ready
,Scheduling
등).
회고
최초 pod를 띄울 때 가용 cpu, memory가 모자라서 pod가 못 뜨는 건 많이 겪어봤는데 pod가 뜨고 나서 리소스가 모자라서 evict 된 것은 처음 겪어봤다.
어렵지 않게 이슈 파악이 돼서 다행이다.
이렇게 모르는 명령어를 하나씩 알아가는 것도 의미가 있는 것 같다.
'Infra & DevOps' 카테고리의 다른 글
[삽질로그] window에서 docker로 mysql 띄우기 (0) | 2025.01.19 |
---|---|
K8S의 Probe (Startup Probe, Readiness probe, Liveness probe) (2) | 2024.12.07 |