pod가 ContainerCreating 상태로 계속 살아나거나, 삭제가 안될때 아래 url로 이동하여 해결한다.
Deployment 삭제 방법 (ReplicaSet 삭제 안될때, 좀비 pod, pod가 삭제 안될때, pod가 계속 살아날때)
증상
팟(Pod) 삭제 시도 후 팟(Pod)이 Terminating 상태에 머물러 있습니다.
문제점 해결
팟(Pod)을 수동으로 삭제해야 합니다. 다음 명령을 실행하십시오.
kubectl -n <namespace> delete pods --grace-period=0 --force <pod_name>
EKS 에서 ingress 와 loadbalancer 를 생성했는데 pending 상태라 살펴보니 자격증명 실패 에러가 발생했다.
$ kubectl describe ingress my-ingress
Warning FailedBuildModel 32m (x9 over 47m) ingress (combined from similar events): Failed build model due to WebIdentityErr: failed to retrieve credentials
caused by: InvalidIdentityToken: Incorrect token audience
status code: 400, request id: 4599a6da-7a29-4d82-baf7-d546e7811234
확인하고 삭제하려는데 삭제가 안된다.ㅋ 강제 삭제(--force --grace-period=0)도 안된다; 시간이 한참 지나도 프롬프트가 멈춰버림.
$ kubectl describe svc my-nlb
...
Normal DeletedLoadBalancer 40m service-controller Deleted load balancer
Warning FailedDeployModel 38m service Failed deploy model due to WebIdentityErr: failed to retrieve credentials
Warning ClusterIPNotAllocated 75s (x5 over 37m) ipallocator-repair-controller Cluster IP [IPv4]:172.20.23.140 is not allocated; repairing
Warning PortNotAllocated 75s (x5 over 37m) portallocator-repair-controller Port 32083 is not allocated; repairing
권한은 없는데 복구 의지가 강해서 그런건지, 안죽고 계속 살아나려고 발버둥 치는 느낌. 다른 서비스들과 결합이 되어 있는건지... 클러스터를 거의 초기화 수준으로 다른 모든 리소스를 다 지웠는데도 삭제가 안되는 생명줄 긴 로드 밸런서들. 구글님 덕에 겨우 찾아 삭제했다.
$ kubectl patch service/<your_service> --type json --patch='[ { "op": "remove", "path": "/metadata/finalizers" } ]'
$ kubectl patch ingress <your_ingress> -n <your_ns> -p '{"metadata":{"finalizers":[]}}' --type=merge
finalizers 는 리소스를 완전히 삭제하기 전에 특정 조건이 충족될 때까지 대기하게 한다. 삭제가 완료되면 대상에서 관련 finalizers 를 삭제하는데, 위처럼 metadata.finalizers 필드를 비워주면 Kubernetes 는 삭제가 완료된 것으로 인식하게 된다.
해결함... 식검했다...
kubectl patch service/api-nlb --type json --patch='[ { "op": "remove", "path": "/metadata/finalizers" } ]' -n namespace
tail -f 를 활용한 로그 실행 보기
kubectl logs --tail 10 -f api-nlb -n namespace
# Namespace Terminating 상태에서 멈춰 있을때 finalizers 를 사용하여 삭제를 해보자.
finalizers 는 모든 방법을 썼는데도 삭제가 되지 않을경우에 사용한다.
사용법은 아래와 같다.
$ kubectl get namespace {stucked_namespace} -o json \
| tr -d "\n" | sed "s/\"finalizers\": \[[^]]\+\]/\"finalizers\": []/" \
| kubectl replace --raw /api/v1/namespaces/{stucked_namespace}/finalize -f -
- 실제 사용 사례 예시는 아래와 같다. (namespace를 my-apps라고 가정하고 작업을 진행한다.)
kubectl get namespace my-apps -o json \
| tr -d "\n" | sed "s/\"finalizers\": \[[^]]\+\]/\"finalizers\": []/" \
| kubectl replace --raw /api/v1/namespaces/my-apps/finalize -f -
하지만 이렇게 지우면 추후에 같은 이름의 네임스페이스를 만들었을 때, 지우지 못했던 리소스들의 잔재? 가 남아있어 영향을 받을 수도 있으니 주의 하자.