포드가 종료 상태로 멈춤


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 에서 설명합니다. / 65569 및 https://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.