포드가 종료 상태로 멈춤


244

ReplicationController12 개의 포드로 a를 삭제하려고했는데 일부 포드가 Terminating상태에 고정되어 있음을 알 수 있습니다.

My Kubernetes 클러스터는 Ubuntu 가상 머신에 설치된 하나의 제어 평면 노드와 3 개의 작업자 노드로 구성됩니다.

이 문제의 원인은 무엇입니까?

NAME        READY     STATUS        RESTARTS   AGE
pod-186o2   1/1       Terminating   0          2h
pod-4b6qc   1/1       Terminating   0          2h
pod-8xl86   1/1       Terminating   0          1h
pod-d6htc   1/1       Terminating   0          1h
pod-vlzov   1/1       Terminating   0          1h

스케줄러 및 컨트롤러 관리자가 실행 중입니까?
Antoine Cotten

답변:


471

다음 명령을 사용하여 POD를 강제로 삭제할 수 있습니다.

kubectl delete pod <PODNAME> --grace-period=0 --force --namespace <NAMESPACE>

3
이것은 하나의 1.2.4에 대한 해결책이었습니다. 포드는 밤새 종료되었다
tback

6
필자의 경우 --force포드를 종료하려면 옵션을 하나 더 추가해야합니다 .
BMW

17
클러스터 에서이 작업을 수행했으며 포드가 제거 된 것처럼 보였지만 노드를 확인했을 때 컨테이너가 계속 실행 중입니다. 노드 자체에서 Docker를 다시 시작했습니다. github.com/kubernetes/kubernetes/issues/25456 이 명령으로 시스템 문제를 숨기지 않도록주의하십시오.
mqsoh

4
@mqsoh : 강제 삭제는 API 서버 저장소 (etcd)에서 제거하면 실제 삭제 된 실제 리소스는 무기한으로 실행될 수 있습니다.
비트

8
"경고 : 즉시 삭제는 실행중인 자원이 종료되었다는 확인을 기다리지 않습니다. 자원이 클러스터에서 무한정 계속 실행될 수 있습니다."What resources?
Akshay

57

포드를 강제로 삭제합니다.

kubectl delete pod --grace-period=0 --force --namespace <NAMESPACE> <PODNAME>

--force플래그는 필수입니다.


41
그러나 나에게 진짜 질문은 "왜 우리가 처음에 이것에 의지해야 하는가?"입니다. 일반적인 작동 조건에서 포드가이 멈춤 상태에있게되는 것은 무엇입니까?
neverfox

2
글쎄, 한 가지 예를 들자면, 우리는 정상적으로 종료 된 자바 컨테이너를 가졌지 만 가비지 수집 자체는 죽어 신호에 반응하지 않았다.
Aurelia

1
네임 스페이스를 제공하는 것이 좋습니다. 그렇지 않으면 다중 네임 스페이스 환경에서 포드를 찾을 수 없으며 기본적으로 kube-system네임 스페이스를 찾습니다 .
Daniel Andrei Mincă

네임 스페이스의 모든 포드를 한 번에 강제로 삭제하려면ktl get pods -o custom-columns=:metadata.name | xargs kubectl delete pod --force --grace-period=0
심층 분석

21

리소스 (포드, 배포, ds 등) yaml에서 finalizers 블록을 삭제합니다.

"finalizers": [
  "foregroundDeletion"
]

1
이 후에 영구 볼륨이 삭제되었습니다. 실제로 무엇을합니까?
raiyan

종료 상태에 걸린 내 포드가 즉시 제거되었습니다.
Kuberchaun

이것이 나에게 붙어있는 포드를 고정시킨 유일한 방법이었습니다 delete -grace-period=0 --force. 그러나 그것이 정확히 무엇을하는지에 대해 약간의 설명을 부탁드립니다.
valorl

이 페이지는 foregroundDeletion에 대해 설명합니다. 오브젝트가 삭제 중임을 나타내는 메타 데이터 값입니다. kubernetes.io/docs/concepts/workloads/controllers/…
Sean Keane

14

실용 답변-다음을 실행하여 언제든지 종료 포드를 삭제할 수 있습니다.

kubectl delete pod NAME --grace-period=0

과거 답변-버전 1.1에는 노드가 클러스터에서 깨끗하게 제거되지 않은 경우 포드가 종료 상태에서 꼬이는 문제가있었습니다.


1
나는 그것이 문제라고 생각한다. 노드에서 제거하지 않고 하나의 minion vm의 전원을 끕니다. 이것이 허용되는 행동입니까? 아니면 kubernetes에서 해당 포드를 제거하는 수정이 있습니까?
Dimuthu

예, 버전 1.2가 나올 때까지 해결 방법은 포드를 삭제하는 것입니다.
Alex Robinson

36
다음을 사용하여 항상 종료 포드를 강제로 삭제할 수 있습니다.kubectl delete pod NAME --grace-period=0
Clayton

3
상무부 실행할 때 말한다 요청하는 것은 컨테이너로 전송됩니다. 그러나 유예 기간이 지난 후에도 컨테이너가 여전히 실행 중이면 어떻게해야합니까? 나는 포드 에 묶여 있고, 일부는 이동하고, 일부는 nodejs에 붙어 있습니다. replicationController가 제거되었고 컨테이너가 여전히 실행 중입니다.kubectl delete ...SIG_TERMTerminating
Quyen Nguyen Tuan

4
kubectl delete pod PODNAME --grace-period=0Clayton이 제안한대로 나를 위해 일했습니다.
Yogesh Jilhawar

13

이 명령이 더 간단하다는 것을 알았습니다.

for p in $(kubectl get pods | grep Terminating | awk '{print $1}'); do kubectl delete pod $p --grace-period=0 --force;done

기본 네임 스페이스에서 종료 상태의 모든 포드를 삭제합니다.


1
다음과 같이 다른 네임 스페이스에서 실행 kube-system하려면 :for p in $(kubectl get pods -n kube-system| grep Terminating | awk '{print $1}'); do kubectl delete pod $p --grace-period=0 --force -n kube-system;done
acrogenesis

8

제 경우에는 --force옵션이 제대로 작동하지 않았습니다. 나는 여전히 포드를 볼 수 있었다! 종료 / 알 수 없음 모드에서 멈췄습니다. 그래서 실행 후

kubectl delete pods <pod> -n redis --grace-period=0 --force

나는 달렸다

kubectl patch pod <pod> -p '{"metadata":{"finalizers":null}}'

2
이 작업을 수행하기 전에 kubernetes.io/docs/concepts/workloads/controllers/… 를 읽고 종료자가 무엇인지 이해할 가치가 있습니다. 또한, 막힌 특정 파이널 라이저를 보면 그것이 붙어있는 이유 와 우회하는 것이 안전한지에 대한 힌트를 줄 수 있습니다 .
Beni Cherniavsky-Paskin

5

경우 --grace-period=0다음 작동하지 않는 당신은 할 수 있습니다 :

kubectl delete pods <pod> --grace-period=0 --force

이것이 작동하는 것처럼 보이지만 실제로는 삭제되지 않는 상황이 있습니다. kubelet이 포드의 상태를 잃어 버려 상태를 얻을 수없는 문제와 관련이있을 수 있습니다 (예 : github.com/kubernetes/kubernetes/issues/51835 ). 아직 그것을 제거하는 방법을 찾지 못했습니다.
cgseller

3

루크 ceph 네임 스페이스를 제거 할 때 최근에 우연히 발견되었습니다-종료 상태에 빠졌습니다.

여기에 제안 된대로 컬을 사용하여 k8s API를 직접 호출하여 kubernetes finalizer를 제거하는 데 도움이 된 유일한 방법입니다 .

  • kubectl get namespace rook-ceph -o json > tmp.json
  • kubernetes finalizer를 삭제하십시오 tmp.json(빈 배열 그대로 두십시오 "finalizers": []).
  • 실행 kubectl proxy인증 목적을 위해 다른 터미널에 반환 포트에 다음과 같은 컬 요청을 실행
  • curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json 127.0.0.1:8001/k8s/clusters/c-mzplp/api/v1/namespaces/rook-ceph/finalize
  • 네임 스페이스가 사라졌습니다

자세한 루크 ceph 분해는 여기 .


3

원래 질문은 " 이 문제의 이유는 무엇입니까? "이며 이에 대한 답변은 https://github.com/kubernetes/kubernetes/issues/51835 & https://github.com/kubernetes/kubernetes/issues 에서 설명합니다. / 65569https://www.bountysource.com/issues/33241128-unable-to-remove-a-stopped-container-device-or-resource-busy 참조

도커 마운트가 다른 네임 스페이스로 누출되어 발생합니다.

포드 호스트에 로그온하여 조사 할 수 있습니다.

minikube ssh
docker container ps | grep <id>
docker container stop <id> 

나는 이것이 가장 덜 찬성 한 답변이라고 믿을 수 없으며 단일 의견이 없었습니다. 다른 모든 답변은 문제를 해결하거나 문제를 해결하는 방법을 다루지 만 OP는 조건이 먼저 발생하는 이유를 명확하게 요구했습니다.
MisterStrickland

0

나는 최근에 이것을 사용하여 클러스터의 리소스를 확보했습니다. 다음은 모두 삭제하는 명령입니다.

kubectl get pods --all-namespaces | grep Terminating | while read line; do 
pod_name=$(echo $line | awk '{print $2}' ) name_space=$(echo $line | awk 
'{print $1}' ); kubectl delete pods $pod_name -n $name_space --grace-period=0 --force; 
done

이것이 이것을 읽는 누군가를 돕기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.