여우발개발

연쇄 pod evict 마 처치하기 본문

Infra & DevOps

연쇄 pod evict 마 처치하기

♬여우 2025. 1. 29. 19:47

배경

평화로운 어느 날 인프라팀으로부터 연락이 왔다. 

➜ 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 된 주된 원인은 아래와 같아

  1. 리소스 부족 (Resource Pressure)
    • 노드의 메모리나 디스크 공간 부족으로 Kubelet이 Pod를 제거했을 가능성.
    • 이벤트 로그에 node(s) had insufficient memory 또는 node(s) had disk pressure 같은 메시지가 있을 수 있어.
  2. 노드 스케줄링 제한
    • 노드가 스케줄링 불가능 상태 (NoSchedule 또는 NoExecute Taint).
  3. Node Drain 작업
    • 관리자가 노드를 유지보수하기 위해 Drain 명령을 실행했다면 해당 Pod가 Evicted됐을 수도 있어.
  4. Preemption (우선순위)
    • 더 높은 우선순위 Pod가 스케줄링되기 위해 낮은 우선순위 Pod가 Evicted됨.
  5. 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 된 것은 처음 겪어봤다.

어렵지 않게 이슈 파악이 돼서 다행이다.

이렇게 모르는 명령어를 하나씩 알아가는 것도 의미가 있는 것 같다.