Kubernetes에서 제거 된 포드는 어떻게 되나요?


82

방금 내 포드 중 일부가 kubernetes에 의해 제거되는 것을 봤습니다. 그들에게 무슨 일이 일어날까요? 그냥 그렇게 어슬렁 거리거나 수동으로 삭제해야하나요?


3
똑같은 행동을 목격 한 나는 Evicted현재 13 일 동안 상태에 있는 꼬투리를 가지고 있습니다. 제거 된 포드가 제거되지 않는 것 같습니다 (또는 버그 일 수 있음).
Elouan Keryell-Even

podgc 컨트롤러는 구성 가능한 임계 값에 도달하면 실패 / 성공 포드를 회수합니다.
zhb

2
내 포드가 제거되고 총 40 개가 있습니다. 따라서 제거 된 포드에 대해서도 매월 요금이 부과됩니까?
아난

컨테이너 무리가 제거되었지만 예상대로 2 개의 컨테이너가 실행 중입니다. 실패한 것은 리소스 부족 ( DiskPressure) 때문이었습니다. 다음을 사용하여 찾을 수 있습니다.kubectl describe pods my-pod-name --namespace prod
prayagupd

답변:


79

내가 사용하는 빠른 해결 방법은 사건 후 제거 된 모든 포드를 수동으로 삭제하는 것입니다. 다음 명령을 사용할 수 있습니다.

kubectl get pods --all-namespaces -o json | jq '.items[] | select(.status.reason!=null) | select(.status.reason | contains("Evicted")) | "kubectl delete pods \(.metadata.name) -n \(.metadata.namespace)"' | xargs -n 1 bash -c


오타가 있어야합니다 -a. 인수가 잘못되었습니다.
Ilya Suzdalnitski

5
이 (및 유사한 답변) "[아무것도하지 않으면] 그들에게 무슨 일이 일어날까요?"라는 OP 질문에 대답하지 않습니다.
Oliver

56

네임 스페이스에서 실패 상태의 포드를 삭제하려면 default

kubectl -n default delete pods --field-selector=status.phase=Failed

1
이상하게도 status.phase=Evicted. 나는 이것을 할 수 있었다 kubectl -n default delete pods --field-selector=status.phase!=Running. 그러나 조심하십시오. 이것은 모든 것을 삭제합니다
n3o

3
kubectl -n default get pods --field-selector=status.phase=Failed처음 에는 실행하는 것이 유용 할 것 같습니다 .
사용자 이름

그것은 Evicted나를 위해 포드를 제거 합니다.
robertodecurnex

19

제거 된 포드는 수동으로 삭제해야합니다. 다음 명령을 사용하여 Error상태의 모든 포드를 삭제할 수 있습니다 .

kubectl get pods --all-namespaces --field-selector 'status.phase==Failed' -o json | kubectl delete -f -

15

소프트 또는 하드 제거 임계 값 이 충족되었는지 여부에 따라 Pod의 컨테이너가 유예 기간 유무에 관계없이 종료되고 PodPhase으로 표시되고 FailedPod가 삭제됩니다. 애플리케이션이 배포의 일부로 실행되는 경우 Kubernetes에 의해 생성되고 예약 된 다른 포드가있을 것입니다. 아마도 제거 임계 값을 초과하지 않는 다른 노드에있을 것입니다.

제거가 반드시 임계 값으로 인해 발생할 필요는 없지만 노드kubectl drain비우기 위해 또는 Kubernetes API 를 통해 수동으로 호출 할 수도 있습니다 .


3
예, 제 포드는 배포에서
가져 왔고

그들이 "또한 거기에"있는지 어떻게 결정합니까? 정확히 어떤 명령이 당신에게 그것을 보여줍니까?
사이먼 Tesar

단지kubectl get pods -n mynamespace
reachlin

어느 주? 무엇합니까 kubectl describe pod <pod>말은?
Simon Tesar의

1
OP는 아니지만이 문제가 있습니다. kubectl describe "상태 : 실패 이유 : 제거됨 메시지 : 포드 리소스가 부족합니다 : [MemoryPressure]."
Bryan

5

Completed유지하려는 상태의 포드가있는 경우 :

kubectl get pods --all-namespaces --field-selector 'status.phase==Failed' -o json | kubectl delete -f -

5

Kube-controller-manager기본적으로 작동하는 K8 설치와 함께 존재합니다. 기본값은 GC가 시작되기 전에 최대 12500 개의 종료 된 포드입니다.

K8s 문서에서 직접 : https://kubernetes.io/docs/reference/command-line-tools-reference/kube-controller-manager/#kube-controller-manager

--terminated-pod-gc-threshold int32 기본값 : 12500
종료 된 포드 가비지 수집기가 종료 된 포드 삭제를 시작하기 전에 존재할 수있는 종료 된 포드의 수입니다. <= 0이면 종료 된 포드 가비지 수집기가 비활성화됩니다.


내 마스터 노드에 kube-controller-manager 포드가 있습니다. 하지만이 플래그를 어떻게 수정해야합니까? 내가 사용하고자한다면 kubectl edit pod kube-controller-manager-<master_name> -n kube-system그것은 나에게주는 pod is invalid설정 파일을 저장 한 후 오류가 발생했습니다.
Ali Tou

4

누군가가 모든 네임 스페이스에 대해 제거 된 모든 포드를 자동으로 삭제하려는 경우 :

  • Powershell
    Foreach( $x in (kubectl get po --all-namespaces --field-selector=status.phase=Failed --no-headers -o custom-columns=:metadata.name)) {kubectl delete po $x --all-namespaces }
  • 세게 때리다
kubectl get po --all-namespaces --field-selector=status.phase=Failed --no-headers -o custom-columns=:metadata.name | xargs kubectl delete po --all-namespaces

3

모든 '제거 된'포드를 삭제하는 Kalvin의 명령에 해당하는 OpenShift :

eval "$(oc get pods --all-namespaces -o json | jq -r '.items[] | select(.status.phase == "Failed" and .status.reason == "Evicted") | "oc delete pod --namespace " + .metadata.namespace + " " + .metadata.name')"

3

제거 된 포드를 삭제하는 bash 명령이 하나 더 있습니다.

kubectl get pods | grep Evicted | awk '{print $1}' | xargs kubectl delete pod

2

Evicted강제로 모든 포드 를 삭제하려면 다음 한 줄 명령을 시도 할 수 있습니다.

$ kubectl get pod -A | sed -nr '/Evicted/s/(^\S+)\s+(\S+).*/kubectl -n \1 delete pod \2 --force --grace-period=0/e'

팁 : 대신 명령의 p수정자를 사용 하면 삭제 작업을 수행하기 위해 실제 명령이 인쇄됩니다.ssede

$ kubectl get pod -A | sed -nr '/Evicted/s/(^\S+)\s+(\S+).*/kubectl -n \1 delete pod \2 --force --grace-period=0/p'

1

다음은 임계 값을 하드 코딩하는 방법에 대한 '공식'가이드입니다 (너무 많은 제거 된 포드를보고 싶지 않은 경우) : kube-controll-manager

그러나 알려진 문제는 kube-controll-manager를 설치하는 방법입니다.


성가신 경우 언급 한 설치 방법을 알려주십시오.
MandyShaw

나는 그것이 내가 그것을 언급 한 이유이기도하다. 그리고 OP는 그가 사용하는 시스템에 대해 언급하지 않았고 그가 동일한 문제를 겪을 지 모르겠습니다. BTW, downvote는 SUPER NICE입니다.
tikael jul

질문에 완전히 답하지 않았기 때문에 귀하의 아이디어를 댓글로 추가하는 것이 더 낫다고 생각할 것입니다.
MandyShaw

위의 다른 모든 답변을 확인하고 OP는 무슨 일이 있었는지 물었고 그들 중 몇 명이 그 대답을했는지 그리고 얼마나 많은 사람들이 퇴거 포드를 삭제하는 방법을 제공합니까?
tikael

1

여전히 awk.

나를 미치게 만들 수있는 인적 오류 (바람직한 포드 삭제)를 방지하기 위해 get pods명령 결과 전에 확인합니다 .

kubectl -n my-ns get pods --no-headers --field-selector=status.phase=Failed     

괜찮아 보이면 여기에 있습니다.

kubectl -n my-ns get pods --no-headers --field-selector=status.phase=Failed | \
awk '{system("kubectl -n my-ns delete pods " $1)}'

1

다음 명령은 모든 네임 스페이스에서 실패한 모든 포드를 삭제합니다.

kubectl get pods -A | grep Evicted | awk '{print $2 " -n " $1}' | xargs -n 3 kubectl delete pod

-1

아래 명령은 기본 네임 스페이스에서 제거 된 모든 포드를 가져 와서 삭제합니다.

kubectl get pods | grep Evicted | awk '{print$1}' | xargs -I {} kubectl delete pods/{}


1
코드 전용 답변은 장기적으로 커뮤니티에 도움이되는 설명 된 컨텍스트가있는 답변처럼 도움이되지 않으므로 권장되지 않습니다.
Arun Vinoth
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.