본문 바로가기

⌛ AWS 인프라 구성하기 (MiniProject)/✅ 장애내용 및 해결방안

finalizers 를 활용한 서비스 강제 제거

pod가 ContainerCreating 상태로 계속 살아나거나, 삭제가 안될때 아래 url로 이동하여 해결한다.

2022.09.07 - [⭐ Kubernetes & EKS/디플로이먼트 (Deployment)] - Deployment 삭제 방법 (ReplicaSet 삭제 안될때, 좀비 pod, pod가 삭제 안될때, pod가 계속 살아날때)

 

Deployment 삭제 방법 (ReplicaSet 삭제 안될때, 좀비 pod, pod가 삭제 안될때, pod가 계속 살아날때)

# 오류내용 - ReplicaSet이 삭제가 되지 않아 pod를 강제로 지워도 좀비처럼 다시 살아나는 문제 발생 # 해결방법 - Deployment 자체를 삭제 해야한다. - Deployment 를 삭제해야한다. 그러면 pod 및 ReplicaSet이

may9noy.tistory.com

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 -

하지만 이렇게 지우면 추후에 같은 이름의 네임스페이스를 만들었을 때, 지우지 못했던 리소스들의 잔재? 가 남아있어 영향을 받을 수도 있으니 주의 하자.