Amazon EKS의 Cluster Autoscaler와 관련된 포드 예약 문제를 해결하려면 어떻게 해야 합니까?
Amazon Elastic Kubernetes Service(Amazon EKS)에서 Cluster Autoscaler를 사용할 때 포드 예약 문제가 발생합니다. 포드가 보류 중 상태로 멈췄거나 예약 이벤트 실패에 대한 알림을 받습니다.
해결 방법
Cluster Autoscaler를 활성화했는데 포드가 보류 중 상태로 멈춘 경우, Cluster Autoscaler는 예약되지 않은 포드에 새 노드를 추가하지 않을 수 있습니다.
포드 상태 확인
포드 상태를 확인하려면 다음 kubectl get pods 명령을 실행합니다.
kubectl get pods -n kube-system -l app=cluster-autoscaler
포드가 보류 중 상태이거나 포드 컨테이너가 대기 중 상태인 경우, 포드의 상태 문제를 해결하십시오.
포드가 CrashLoopBackOff 상태인 경우 다음 kubectl describe pod 명령을 실행합니다.
kubectl describe pod cluster-autoscaler-####-#### -n kube-system
참고: **cluster-autoscaler-####-####**을 Cluster Autoscaler 포드로 바꾸십시오.
명령 출력에 137 종료 코드와 함께 ‘OOMKilled’가 표시되면 클러스터 오토스케일러 배포에 대한 메모리 리소스 제한 및 요청을 늘리십시오. 자세한 내용은 Kubernetes 웹 사이트에서 메모리 요청 및 메모리 제한 지정을 참조하십시오.
포드 로그를 확인하려면 다음 kubectl logs 명령을 실행합니다.
kubectl logs -f -n kube-system -l app=cluster-autoscaler
로그에서 문제 해결 정보를 확인할 수 있습니다. 예를 들어, 포드 로그에 다음과 같은 ‘AccessDenied’ 오류 메시지가 표시될 수 있습니다.
"Failed to create AWS Manager: AccessDenied: User: arn:aws:sts::444455556666:assumed-role/your-role is not authorized to perform: your-action because no identity-based policy allows the your-action action"
AWS Identity and Access Management(IAM) 권한 문제를 해결하려면 올바른 IAM 정책을 포드에 연결합니다. 자세한 내용은 GitHub 웹 사이트의 IAM 정책을 참조하십시오.
또는 로그에 다음과 같은 오류 메시지가 표시될 수 있습니다.
"Failed to create AWS Manager: cannot autodiscover ASGs: WebIdentityErr: failed to retrieve credentials caused by: RequestError: send request failed caused by: Post https://sts.region.amazonaws.com/: : dial tcp: i/o timeout"
네트워크 연결 문제가 발생하는 경우 워커 노드 서브넷에 다음 AWS 서비스 엔드포인트에 대한 경로가 있는지 확인하십시오.
- ec2.region.amazonaws.com
- autoscaling.region.amazonaws.com
- sts.region.amazonaws.com
또한 서브넷의 네트워크 액세스 제어 목록(네트워크 ACL) 또는 워커 노드 보안 그룹이 위 엔드포인트에 대한 트래픽을 차단하지 않는지 확인하십시오.
클러스터가 프라이빗인 경우 다음 작업을 수행하십시오.
- 위 엔드포인트를 가상 프라이빗 클라우드(VPC)에 추가합니다.
- 워커 노드 보안 그룹의 포트 443에서 트래픽을 허용하도록 엔드포인트의 보안 그룹을 구성합니다.
Cluster Autoscaler가 Auto Scaling 그룹을 스케일 아웃할 수 없는 이유 파악
포드에 선호도 또는 비선호도와 같은 예약 규칙이 포함되어 있는지 확인하려면 다음 kubectl describe pod 명령을 실행합니다.
kubectl describe pod pending-pod-name -n pending-pod-namespace
참고: pending-pod-name을 보류 중인 포드의 이름으로, pending-pod-namespace을 보류 중인 포드의 네임스페이스로 바꾸십시오. 자세한 내용은 Kubernetes 웹 사이트의 선호도 및 비선호도를 참조하십시오.
명령 출력에서 이벤트 섹션을 확인하여 포드가 보류 중 상태로 멈춘 이유를 파악합니다. 예를 들어, 노드 그룹 레이블에서 문제를 식별할 수 있습니다.
노드 그룹이 작동하는지 확인하려면 다음 작업을 수행하십시오.
- 포드의 nodeAffinity 사양에 있는 nodeSelector 및 requiredDuringSchedulingIgnoredDuringExecution 설정과 일치하는 레이블로 노드 그룹을 구성합니다. 자세한 내용은 Kubernetes 웹 사이트에서 노드 레이블을 참조하십시오. 올바른 레이블을 사용하면 Cluster Autoscaler가 스케일링 작업에 적합한 노드를 식별할 수 있습니다.
- 포드 예약 규칙을 올바르게 정의했는지 확인합니다. 자세한 내용은 Kubernetes 웹 사이트에서 노드에 포드 할당을 참조하십시오. 포드가 nodeSelector 또는 requiredDuringSchedulingIgnoredDuringExecution을 사용하는 경우, Cluster Autoscaler는 이러한 설정의 예약 요구 사항에 맞는 스케일링 노드 그룹만 고려합니다.
Cluster Autoscaler 구성을 확인하려면 다음 kubectl get deployment 명령을 실행합니다.
kubectl get deployment cluster-autoscaler -n kube-system -o yaml
Cluster Autoscaler에 올바른 node-group-auto-discovery 인수가 있는 경우 명령 출력에 다음과 같은 구성이 표시됩니다.
command: - ./cluster-autoscaler - --v=4 - --stderrthreshold=info - --cloud-provider=aws - --skip-nodes-with-local-storage=false - --expander=least-waste - --node-group-auto-discovery=asg:tag=k8s.io/cluster-autoscaler/enabled,k8s.io/cluster-autoscaler/your-cluster-name
Auto Scaling 그룹에 올바른 태그가 있는지 확인합니다.
Cluster Autoscaler에서 노드 그룹과 연결된 Auto Scaling 그룹을 검색하려면 다음 태그가 필요합니다.
Tag 1: key: k8s.io/cluster-autoscaler/your-cluster-name value: owned Tag 2: key: k8s.io/cluster-autoscaler/enabled value: true
노드 그룹이 최대 노드 수에 도달했는지 확인하려면 다음 describe-nodegroup 명령을 실행합니다.
aws eks describe-nodegroup --cluster-name your-cluster-name --nodegroup-name your-nodegroup-name
참고: your-cluster-name을 클러스터 이름으로 바꾸고, your-nodegroup-name을 노드 그룹 이름으로 바꾸십시오.
노드 그룹이 최대 노드 수에 도달한 경우 노드 그룹을 업데이트하여 최대 노드 수를 늘리십시오. 그러면 새 노드가 새 포드를 예약할 수 있습니다.
Auto Scaling 그룹에서 시작한 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스가 클러스터에 연결할 수 있는지 확인합니다. 인스턴스가 클러스터에 연결할 수 없는 경우 워커 노드 문제를 해결하십시오.
포드 리소스 요청을 확인하려면 다음 kubectl get pod 명령을 실행합니다.
kubectl get pod pending-pod-name -n pending-pod-namespace -o yaml | grep resources -A6
참고: pending-pod-name을 보류 중인 포드의 이름으로 바꾸고, pending-pod-namespace를 보류 중인 포드의 네임스페이스 이름으로 바꾸십시오.
현재 노드 인스턴스 유형이 포드 리소스 요청을 충족하는지 확인하고 필요한 경우 포드 리소스 요청을 수정합니다. 또는 수정된 인스턴스 유형으로 새 노드 그룹을 만듭니다. 포드 리소스 요청에 대한 자세한 내용은 Kubernetes 웹 사이트에서 포드 및 컨테이너의 리소스 관리를 참조하십시오.
노드의 테인트를 보려면 다음 kubectl describe node 명령을 실행합니다.
kubectl describe node your-node-name
참고: your-node-name을 노드 이름으로 바꾸십시오.
포드가 노드에 추가한 테인트를 허용하는지 확인합니다. 노드에 테인트가 필요하지 않은 경우 노드에서 테인트를 제거하십시오. 자세한 내용은 Kubernetes 웹 사이트의 테인트 및 톨러레이션을 참조하십시오.
관련 정보
GitHub 웹 사이트의 자주 묻는 질문
- 언어
- 한국어

관련 콘텐츠
- 질문됨 8달 전
- 질문됨 일 년 전