Global outage event
If you're experiencing issues with your AWS services, then please refer to the AWS Health Dashboard. You can find the overall status of ongoing outages, the health of AWS services, and the latest updates from AWS engineers.
Amazon EKS 클러스터에서 멈춘 포드와 네임스페이스 문제를 해결하려면 어떻게 해야 합니까?
Amazon Elastic Kubernetes Service(Amazon EKS) 클러스터에서 포드나 네임스페이스를 삭제할 수 없습니다. 포드나 네임스페이스가 종료 중 상태로 멈췄습니다.
간략한 설명
Amazon EKS에서 포드 또는 네임스페이스를 삭제하면 리소스가 종료 중 상태로 전환됩니다. 이 프로세스가 완료되지 않으면 수동으로 문제를 해결해야 합니다.
다음과 같은 이유로 포드 종료 문제가 발생할 수 있습니다.
- 파이널라이저가 삭제를 방해함
- 포드가 종료 신호에 응답하지 않음
- PreStop 후크가 실패하거나 terminationGracePeriodSeconds 서비스가 너무 오래 연장됨
- 네트워크 장애로 인해 워커 노드 및 컨트롤 플레인 통신이 차단됨
- 리소스 사용량이 많아 워커 노드에 영향을 미침
다음과 같은 이유로 네임스페이스 종료 문제가 발생할 수 있습니다.
- Kubernetes에서 특정 리소스를 삭제할 수 없음
- API 서버가 False 상태를 보고함
- 파이널라이저가 삭제를 방해함
해결 방법
다음 섹션을 사용하여 멈춘 포드 또는 네임스페이스 문제를 해결하십시오.
멈춘 포드 문제 해결
멈춘 포드 문제를 해결하려면 다음 작업을 완료하십시오.
포드 상태 확인
다음 단계를 완료하십시오.
-
영향을 받는 노드에서 kubelet 로그를 확인하려면 다음 명령을 실행하십시오.
kubectl get pods -A --field-selector=status.phase==Terminating -o wide -
출력의 NODE 열을 검토하여 영향을 받는 노드를 파악합니다. 멈춘 모든 포드가 동일한 노드에 있는 경우, 다음 ** journalctl** 명령을 실행하여 영향을 받는 노드에서 kubelet 로그를 확인합니다.
journalctl -u kubelet -
kubelet를 다시 시작합니다.
포드 파이널라이저 확인
파이널라이저를 확인하려면 다음 명령을 실행합니다.
kubectl get pod POD_NAME -n NAMESPACE -o yaml
참고: POD_NAME을 포드 이름으로 바꾸십시오. NAMESPACE를 포드가 위치한 네임스페이스의 이름으로 바꾸십시오.
파이널라이저가 있는 경우 다음 명령 중 하나를 실행합니다.
간단한 제거를 위해 다음 명령을 사용하십시오.
kubectl patch pod POD_NAME -n NAMESPACE -p '{"metadata":{"finalizers":null}}'
또는 환경에 JSON 패치 작업이 필요하거나 더 자세한 구문을 선호하는 경우 다음 명령을 사용하십시오.
kubectl patch pod POD_NAME -n NAMESPACE --type=json -p '[{"op": "remove", "path": "/metadata/finalizers" }]'
참고: POD_NAME을 포드 이름으로 바꾸십시오. NAMESPACE를 포드가 위치한 네임스페이스의 이름으로 바꾸십시오.
포드 강제 삭제
중요: 다른 방법으로 데이터 손실이나 손상을 방지할 수 없는 경우에만 이 옵션을 사용하는 것이 좋습니다.
다음 명령을 실행하여 포드를 강제 삭제합니다.
kubectl delete pod POD_NAME -n NAMESPACE --grace-period=0 --force
참고: POD_NAME을 포드의 이름으로 바꾸고, NAMESPACE를 포드가 위치한 네임스페이스로 바꾸십시오.
멈춘 네임스페이스 문제 해결
멈춘 네임스페이스 문제를 해결하려면 다음 작업을 완료하십시오.
네임스페이스 상태 확인
네임스페이스가 종료 중 상태에서 멈춘 경우, 해당 네임스페이스에 Kubernetes가 삭제할 수 없는 리소스가 포함되어 있을 수 있습니다. 또는 API 서비스가 False 상태일 수 있습니다.
네임스페이스의 상태를 확인하려면 다음 명령을 실행합니다.
kubectl describe namespace NAMESPACE
참고: NAMESPACE를 멈춘 네임스페이스의 이름으로 바꾸십시오.
남은 리소스 찾기 및 제거
리소스가 네임스페이스에 남아 있으면 다음과 같은 오류 메시지가 나타납니다.
"NamespaceContentRemaining: Some resources are remaining: serviceaccounts has 2 resource instances"
나머지 리소스를 나열하려면 다음 명령을 실행합니다.
kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get --show-kind --ignore-not-found -n NAMESPACE
참고: NAMESPACE를 네임스페이스의 이름으로 바꾸십시오.
그 후 다음 명령을 실행하여 파악된 리소스를 제거합니다.
kubectl delete RESOURCE_TYPE RESOURCE_NAME -n NAMESPACE
참고: RESOURCE_TYPE을 리소스 유형으로 바꾸고, RESOURCE_NAME을 리소스 이름으로 바꾸고, NAMESPACE를 네임스페이스로 바꾸십시오.
네임스페이스 파이널라이저 제거
파이널라이저가 아직 연결되어 있는 경우 다음과 같은 오류 메시지가 나타납니다.
"NamespaceFinalizersRemaining: Some content in the namespace has finalizers remaining: kubernetes.io/persistent-volume-provisioner in 1 resource instance"
네임스페이스 파이널라이저를 제거하려면 patch 명령을 실행하거나 JSON 파일을 사용하거나 네임스페이스를 강제 삭제하면 됩니다.
patch 작업으로 파이널라이저를 제거하려면 다음 명령을 실행합니다.
kubectl patch namespace NAMESPACE --type=json -p '[{"op": "remove", "path": "/metadata/finalizers" }]'
참고: NAMESPACE를 멈춘 네임스페이스의 이름으로 바꾸십시오.
JSON 파일을 사용하려면 다음 단계를 완료합니다.
- 다음 명령을 실행하여 네임스페이스 구성 파일을 만듭니다.
참고: TERMINATING_NAMESPACE를 멈춘 네임스페이스의 이름으로 바꾸십시오.kubectl get namespace TERMINATING_NAMESPACE -o json > tempfile.json - JSON 파일의 사양 섹션에서 파이널라이저 배열을 제거합니다.
- 변경 사항을 적용하려면 다음 명령을 실행합니다.
참고: TERMINATING_NAMESPACE를 멈춘 네임스페이스의 이름으로 바꾸십시오.kubectl replace --raw "/api/v1/namespaces/TERMINATING_NAMESPACE/finalize" -f ./tempfile.json - 네임스페이스가 제거되었는지 확인합니다. 다음 명령을 실행합니다.
kubectl get namespaces
네임스페이스를 강제 삭제하려면 다음 명령을 실행합니다.
kubectl delete namespace NAMESPACE --grace-period=0 --force
참고: NAMESPACE를 멈춘 네임스페이스의 이름으로 바꾸십시오. 다른 방법으로 데이터 손실이나 손상을 방지할 수 없는 경우에만 이 옵션을 사용하는 것이 좋습니다.
사용자 지정 리소스 정리
리소스가 네임스페이스에 남아 있는 경우 다음 명령을 실행합니다.
kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get --show-kind --ignore-not-found -n NAMESPACE
참고: NAMESPACE를 네임스페이스의 이름으로 바꾸십시오.
사용자 지정 리소스를 파악했으면 다음 명령을 실행하여 제거합니다.
kubectl delete RESOURCE_TYPE RESOURCE_NAME -n NAMESPACE
참고: RESOURCE_TYPE을 리소스 유형으로 바꾸고, RESOURCE_NAME을 리소스 이름으로 바꾸고, NAMESPACE를 네임스페이스로 바꾸십시오.
다음 명령을 실행하여 사용자 지정 리소스 파이널라이저를 제거합니다.
kubectl patch RESOURCE_TYPE RESOURCE_NAME -n NAMESPACE -p '{"metadata":{"finalizers":null}}' --type=merge
참고: RESOURCE_TYPE을 리소스 유형으로 바꾸십시오. RESOURCE_NAME을 리소스 이름으로 바꾸십시오. NAMESPACE를 네임스페이스로 바꾸십시오.
그 후 다음 명령을 실행하여 CustomResourceDefinitions를 제거합니다.
kubectl delete crd CRD_NAME
참고: CRD_NAME을 CustomResourceDefinition의 이름으로 바꾸십시오. 더 이상 필요하지 않은 CustomResourceDefinitions만 제거합니다.
- 언어
- 한국어
