방금 내 포드 중 일부가 kubernetes에 의해 제거되는 것을 봤습니다. 그들에게 무슨 일이 일어날까요? 그냥 그렇게 어슬렁 거리거나 수동으로 삭제해야하나요?
방금 내 포드 중 일부가 kubernetes에 의해 제거되는 것을 봤습니다. 그들에게 무슨 일이 일어날까요? 그냥 그렇게 어슬렁 거리거나 수동으로 삭제해야하나요?
DiskPressure
) 때문이었습니다. 다음을 사용하여 찾을 수 있습니다.kubectl describe pods my-pod-name --namespace prod
답변:
내가 사용하는 빠른 해결 방법은 사건 후 제거 된 모든 포드를 수동으로 삭제하는 것입니다. 다음 명령을 사용할 수 있습니다.
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
. 인수가 잘못되었습니다.
네임 스페이스에서 실패 상태의 포드를 삭제하려면 default
kubectl -n default delete pods --field-selector=status.phase=Failed
status.phase=Evicted
. 나는 이것을 할 수 있었다 kubectl -n default delete pods --field-selector=status.phase!=Running
. 그러나 조심하십시오. 이것은 모든 것을 삭제합니다
kubectl -n default get pods --field-selector=status.phase=Failed
처음 에는 실행하는 것이 유용 할 것 같습니다 .
Evicted
나를 위해 포드를 제거 합니다.
제거 된 포드는 수동으로 삭제해야합니다. 다음 명령을 사용하여 Error
상태의 모든 포드를 삭제할 수 있습니다 .
kubectl get pods --all-namespaces --field-selector 'status.phase==Failed' -o json | kubectl delete -f -
소프트 또는 하드 제거 임계 값 이 충족되었는지 여부에 따라 Pod의 컨테이너가 유예 기간 유무에 관계없이 종료되고 PodPhase
으로 표시되고 Failed
Pod가 삭제됩니다. 애플리케이션이 배포의 일부로 실행되는 경우 Kubernetes에 의해 생성되고 예약 된 다른 포드가있을 것입니다. 아마도 제거 임계 값을 초과하지 않는 다른 노드에있을 것입니다.
제거가 반드시 임계 값으로 인해 발생할 필요는 없지만 노드kubectl drain
를 비우기 위해 또는 Kubernetes API 를 통해 수동으로 호출 할 수도 있습니다 .
kubectl get pods -n mynamespace
kubectl describe pod <pod>
말은?
kubectl describe
"상태 : 실패 이유 : 제거됨 메시지 : 포드 리소스가 부족합니다 : [MemoryPressure]."
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이면 종료 된 포드 가비지 수집기가 비활성화됩니다.
kubectl edit pod kube-controller-manager-<master_name> -n kube-system
그것은 나에게주는 pod is invalid
설정 파일을 저장 한 후 오류가 발생했습니다.
누군가가 모든 네임 스페이스에 대해 제거 된 모든 포드를 자동으로 삭제하려는 경우 :
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
Evicted
강제로 모든 포드 를 삭제하려면 다음 한 줄 명령을 시도 할 수 있습니다.
$ kubectl get pod -A | sed -nr '/Evicted/s/(^\S+)\s+(\S+).*/kubectl -n \1 delete pod \2 --force --grace-period=0/e'
팁 : 대신 명령의 p
수정자를 사용 하면 삭제 작업을 수행하기 위해 실제 명령이 인쇄됩니다.s
sed
e
$ kubectl get pod -A | sed -nr '/Evicted/s/(^\S+)\s+(\S+).*/kubectl -n \1 delete pod \2 --force --grace-period=0/p'
다음은 임계 값을 하드 코딩하는 방법에 대한 '공식'가이드입니다 (너무 많은 제거 된 포드를보고 싶지 않은 경우) : kube-controll-manager
그러나 알려진 문제는 kube-controll-manager를 설치하는 방법입니다.
여전히 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)}'
다음 명령은 모든 네임 스페이스에서 실패한 모든 포드를 삭제합니다.
kubectl get pods -A | grep Evicted | awk '{print $2 " -n " $1}' | xargs -n 3 kubectl delete pod
아래 명령은 기본 네임 스페이스에서 제거 된 모든 포드를 가져 와서 삭제합니다.
kubectl get pods | grep Evicted | awk '{print$1}' | xargs -I {} kubectl delete pods/{}
Evicted
현재 13 일 동안 상태에 있는 꼬투리를 가지고 있습니다. 제거 된 포드가 제거되지 않는 것 같습니다 (또는 버그 일 수 있음).