AWS Fargate의 Amazon EKS 포드가 보류 중 상태로 멈춘 문제를 해결하려면 어떻게 해야 하나요?

4분 분량
0

AWS Fargate 인스턴스에서 실행 중인 Amazon Elastic Kubernetes Service(Amazon EKS) 포드가 보류 중 상태로 멈춥니다. 이러한 포드가 실행되게 하려면 어떻게 해야 하나요?

간략한 설명

다음은 AWS Fargate를 사용하는 Amazon Elastic Kubernetes Service(Amazon EKS)에서 포드가 보류 상태로 유지되는 몇 가지 일반적인 시나리오입니다.

  • 특정 vCPU/메모리 조합을 사용할 수 없기 때문에 용량 오류가 발생했습니다.
  • CoreDNS 포드가 Amazon Elastic Compute Cloud(Amazon EC2) 컴퓨팅 유형에 매핑하는 기본 주석과 함께 생성되었습니다. Fargate 노드에서 스케줄을 지정하려면 EC2를 제거해야 합니다.
  • 이 포드는 생성되었을 때 Fargate 프로필과 일치하지 않았으므로 fargate-scheduler에 할당되지 않습니다. 포드가 생성 시 일치하지 않으면 일치하는 프로필이 나중에 생성되더라도 자동으로 Fargate 노드에 다시 예약되지 않습니다. 이 경우 포드는 default-scheduler에 할당됩니다.
  • 포드가 fargate-scheduler에 할당되었지만 보류 중(Pending) 상태로 남아 있는 경우 추가 문제 해결이 필요할 수 있습니다.

문제를 해결하기 전에 Fargate는 포드 규칙을 따른다는 점에 유의하세요.

  • 포드 선택기에 대해 네임스페이스와 일치 레이블을 구성해야 합니다. Fargate 워크플로는 두 조건이 모두 포드 사양과 일치하는 경우에만 포드를 Fargate 프로필과 일치시킵니다.
  • 단일 Fargate 프로필 내에서 여러 포드 선택기를 지정한다면 포드가 선택기 중 하나와 일치하는 경우 fargate-schedule에 의해 포드가 예약됩니다.
  • 포드 사양이 여러 Fargate 프로필과 일치하면 포드는 임의의 Fargate 프로필에 따라 예약됩니다. 이를 방지하기 위해 포드 사양 내에 eks.amazonaws.com/fargate-profile:  주석을 사용할 수 있습니다.

해결 방법

중요: 다음 단계는 AWS Fargate로 시작된 포드에만 적용됩니다. Amazon EC2 인스턴스에서 시작된 포드에 대한 자세한 내용은 Amazon EKS에서 포드 상태 문제를 해결하려면 어떻게 해야 합니까?를 참조하세요.

포드의 상태 확인

1.    다음 명령을 실행하여 포드 상태를 확인합니다.

kubectl get pods -n <namespace>

2.    포드에 대한 자세한 오류 정보를 얻으려면 다음 describe 명령을 실행합니다.

kubectl describe pod YOUR_POD_NAME -n <namespace>

describe 명령의 출력을 참조하여 다음 해결 방법 중 어떤 것이 문제 해결에 도움이 되는지 평가합니다.

용량 오류 해결

포드에 용량 문제가 있는 경우 다음과 유사한 describe 출력이 표시됩니다.

Fargate capacity is unavailable at this time. Please try again later or in a different availability zone

즉, Fargate는 선택한 vCPU/메모리 조합을 기반으로 컴퓨팅 용량을 프로비저닝할 수 없습니다.

오류를 해결하려면 다음을 수행합니다.

  • 15~20분 후에 포드 생성을 다시 시도합니다. 오류는 용량을 기준으로 하므로 정확한 시간은 달라질 수 있습니다.
  • 포드 사양 내에서 요청(CPU/메모리)을 변경합니다. 그러면 Fargate 워크플로에 의해 새로운 vCPU/메모리 조합이 프로비저닝됩니다.
    참고: 조합 중 하나를 기준으로 요금이 청구됩니다. 포드 사양에 따라 조합이 확정되는 방식에 대한 자세한 내용은 포드 CPU 및 메모리를 참조하세요. 터미널/IDE에서 kubectl describe node 명령을 수행하면 훨씬 더 높은 vCPU/메모리 조합 값을 얻을 수 있습니다. Fargate에서 사용자의 요청에 따라 얼마든지 용량을 사용할 수 있는 것은 아니며 사용 가능한 수준에서 용량 풀로부터 리소스가 프로비저닝됩니다. 하지만 포드 사용량 및 이에 상응하는 vCPU/메모리 조합에 대해서만 요금이 청구됩니다.

보류 상태의 CoreDNS 포드 해결

CoreDNS 포드가 보류 상태인 경우

kubectl get pods -n kube-system<br>NAME                                     READY   STATUS     RESTARTS      AGE
coredns-6548845887-qk9vf                 0/1     Pending    0             157m

이는 CoreDNS 배포에 eks.amazonaws.com/compute-type : ec2라는 기본 주석이 있기 때문일 수 있습니다.

이 문제를 해결하고 Fargate 스케줄러에 포드를 재할당하려면 CoreDNS 업데이트를 참조하세요.

fargate-scheduler에 할당된 포드 문제 해결

fargate-scheduler에 할당된 포드가 보류 상태에서 멈춘 데에는 포드 주석의 잘못된 구성부터 네트워킹 문제에 이르기까지 여러 가지 이유가 있습니다. 포드가 보류 상태로 남아 있는 경우 describe 출력은 다음과 유사합니다.

Events:
Type       Reason              Age                     From     
----       ------              ----                    ----     
Warning    FailedScheduling    2m25s (x301 over 5h3m)  fargate-scheduler

이 오류를 해결하려면 다음을 수행합니다.

  • 포드를 삭제하고 다시 생성합니다.
  • 포드 사양 YAML에서 다음 사항이 설정되지 않았는지 확인합니다.
    node selector
    <>node name
    schedulerName
    이러한 사양으로 인해 fargate-scheduler가 포드를 건너뛰게 됩니다.
  • Fargate 프로필에서 선택된 서브넷에, 새 포드 생성에 충분한 여유 IP 주소가 있는지 확인합니다. 각 Fargate 노드는 서브넷에서 하나의 IP 주소를 사용합니다.
  • NAT 게이트웨이가 퍼블릭 서브넷으로 설정되어 있고 탄력적 IP가 연결되어 있는지 확인합니다.
  • VPC와 연결된 DHCP 옵션 세트에서 AmazonProvidedDNS 또는 domain-name-servers에 유효한 DNS 서버 호스트 이름이 있는지 확인합니다.
  • 사용자의 VPC에 대해 DNS 호스트 이름 및 DNS 확인이 활성화되어 있는지 확인합니다.
  • Fargate 포드가 서비스 통신을 위해 구성된 VPC 엔드포인트만 있는 프라이빗 서브넷을 사용하는 경우 DNS 이름을 가진 다음 엔드포인트를 허용해야 합니다.
    ECR - API
    ECR - DKR
    S3 게이트웨이 엔드포인트
  • VPC 엔드포인트에 연결된 보안 그룹이 Fargate와 API 서버 간의 통신을 허용하는지 확인합니다. VPC 엔드포인트 보안 그룹은 클러스터 VPC CIDR에서 포트 443 수신을 허용해야 합니다. 클러스터에 대해 프라이빗 엔드포인트 액세스도 활성화되어 있어야 합니다.

default-scheduler에 할당된 포드 확인

포드가 할당된 스케줄러를 확인하려면 다음 명령을 실행합니다.

kubectl get pods -o yaml -n <namespace> <pod-name> | grep schedulerName.

출력에서 schedulerNamedefault-scheduler인지 확인합니다. default-scheduler로 나열되어 있으면 fargate-scheduler가 이 포드를 건너뛰었음을 의미합니다. 이 문제를 해결하려면 포드 구성에서 컴퓨팅 유형 주석을 확인하고 AWS Fargate 고려 사항을 참조하세요.


AWS 공식
AWS 공식업데이트됨 4달 전