내용으로 건너뛰기

Amazon EKS 클러스터에서 Cluster Autoscaler를 설정할 때 발생하는 문제를 해결하려면 어떻게 해야 합니까?

8분 분량
0

Amazon Elastic Kubernetes Service(Amazon EKS) 클러스터에서 Cluster Autoscaler를 시작할 때 발생하는 문제를 해결하고 싶습니다.

해결 방법

참고: AWS Command Line Interface(AWS CLI) 명령을 실행할 때 오류가 발생하면 AWS CLI의 오류 해결을 참조하십시오. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하십시오.

다음 해결 방법의 명령은 기본 AWS 리전을 사용하기 때문에 --region 플래그를 사용하지 않습니다. 기본 리전을 확인하려면 다음 AWS CLI configure 명령을 실행합니다.

aws configure

리전을 변경하려면 --region 플래그를 사용하십시오.

사전 요구 사항: eksctl을 설치하거나 최신 버전으로 업데이트하십시오. 설명은 eksctl 웹 사이트의 Installation을 참조하십시오.

발생한 문제에 따라 다음과 같은 문제 해결 조치를 취하십시오. 프로브 문제를 해결하려면 Amazon EKS 클러스터의 활성 및 준비 상태 프로브 문제를 해결하려면 어떻게 해야 합니까?를 참조하십시오.

Cluster Autoscaler 포드가 "CrashLoopBackOff" 상태임

"CrashLoopBackOff" 상태를 해결하려면 다음 단계를 완료하십시오.

  1. Cluster Autoscaler 포드 상태를 확인하려면 다음 명령을 실행합니다.

    kubectl get pods -n kube-system | grep cluster-autoscaler

    출력 예시:

    NAME                            READY   STATUS             RESTARTS      AGE
    cluster-autoscaler-abcd-abcd   0/1     CrashLoopBackOff   3 (20s ago)   99s
  2. 포드가 "CrashLoopBackOff" 상태에서 멈춘 이유에 대한 세부 정보를 보려면 다음 명령을 실행합니다.

    kubectl describe pod cluster-autoscaler-abcd-abcde -n kube-system

    참고: cluster-autoscaler-abcd-abcde를 Cluster Autoscaler 포드의 이름으로 바꿉니다.
    출력에서 Reason 값을 확인합니다. OOMKilled 문제가 발생하면 kubectl edit 명령을 사용하여 Cluster Autoscaler 배포의 메모리 리소스에 대한 limitsrequests 값을 늘리십시오. kubectl edit에 대한 자세한 내용을 보려면 Kubernetes 웹 사이트에서 kubectl edit을 참조하십시오. Cluster Autoscaler의 기본 메모리 값을 보려면 GitHub 웹 사이트에서 cluster-autoscaler-autodiscover.yaml을 참조하십시오.
    출력 예시:

    Name:               cluster-autoscaler-abcd-abcde
    Namespace:          kube-system
    State:              Waiting
    Reason:             CrashLoopBackOff
    Last State:         Terminated
    Reason:             OOMKilled
    Exit Code:          137
    ...
  3. Cluster Autoscaler 포드 로그에서 문제를 확인하려면 다음 명령을 실행합니다.

    kubectl logs -f -n kube-system -l app=cluster-autoscaler

    로그에 AWS Identity and Access Management(AWS IAM) 권한 문제가 표시되면 Cluster Autoscaler 포드에 IAM 권한 문제가 있음으로 이동하십시오. 출력 예시:

    Failed to create AWS Manager: cannot autodiscover ASGs: AccessDenied: User: abc is not authorized to perform: autoscaling: DescribeTags because no identity-based policy allows the autoscaling:DescribeTags action status code: 403, request id: abcdexyz

    로그에 I/O 제한 시간과 같은 네트워킹 문제가 표시되면 Cluster Autoscaler 포드에 네트워킹 문제가 있음으로 이동하십시오. 출력 예시:

    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

Cluster Autoscaler 포드에 IAM 권한 문제가 있음

OIDC 공급자를 클러스터에 연결했는지 확인

클러스터용 OpenID Connect(OIDC) 공급자를 만들었는지 확인하십시오.

IAM 역할을 하는 Cluster Autoscaler 서비스 계정에 주석을 추가했는지 확인

AWS 서비스 계정 주석을 확인하려면 다음 명령을 실행합니다.

kubectl get serviceaccount cluster-autoscaler -n kube-system -o yaml

annotations를 확인하여 출력에 Cluster Autoscaler 서비스 계정 역할이 나열되는지 확인합니다. 출력 예시:

apiVersion: v1
kind: ServiceAccount
metadata:
  annotations:
    eks.amazonaws.com/role-arn: arn:aws:iam::012345678912:role/cluster_auto_scaler_iam_role
  name: cluster-autoscaler
  namespace: kube-system

서비스 계정 역할과 관련된 문제를 해결하려면 Amazon EKS에서 OIDC 공급자와 IRSA의 문제를 해결하려면 어떻게 해야 합니까?를 참조하십시오.

IAM 정책 확인

Cluster Autoscaler 서비스 계정 역할에 올바른 IAM 정책을 연결했는지 확인하십시오. 정책 예시와 필요한 권한 목록은 GitHub 웹 사이트의 IAM policy를 참조하십시오.

신뢰 관계를 올바르게 구성했는지 확인

신뢰 관계를 올바르게 구성했는지 확인하십시오. 신뢰 관계의 예:

{  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::example_awsaccountid:oidc-provider/oidc.eks.example_region.amazonaws.com/id/example_oidcid"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "oidc.eks.example_region.amazonaws.com/id/example_oidcid:aud": "sts.amazonaws.com",
          "oidc.eks.example_region.amazonaws.com/id/example_oidcid:sub": "system:serviceaccount:kube-system:cluster-autoscaler"
        }
      }
    }
  ]
}

참고: example_awsaccountid를 AWS 계정 ID로 바꾸고, example_region을 리전으로 바꾸고, example_oidcid를 OIDC ID로 바꾸십시오.

서비스 계정 역할 또는 정책을 변경할 때마다 다음 명령을 실행하여 Cluster Autoscaler 포드를 다시 시작합니다.

kubectl rollout restart deployment cluster-autoscaler -n kube-system

Cluster Autoscaler 포드에 네트워킹 문제가 있음

필요한 네트워킹 설정으로 Amazon EKS 클러스터를 구성했는지 확인하십시오. 워커 노드 서브넷에 다음 엔드포인트로 트래픽을 라우팅할 수 있는 라우팅 테이블이 있는지 확인합니다.

Amazon EKS 클러스터가 프라이빗인 경우 이전 엔드포인트에 대한 Amazon Virtual Private Cloud(Amazon VPC) 엔드포인트를 만들어야 합니다.

참고: 각 VPC 엔드포인트의 보안 그룹은 Amazon EKS 워커 노드 보안 그룹을 허용해야 합니다. 또한 보안 그룹은 포트 443에서 Amazon EKS VPC CIDR 블록으로의 인바운드 트래픽을 허용해야 합니다.

서브넷 네트워크 액세스 제어 목록(네트워크 ACL)과 워커 노드 보안 그룹이 이러한 엔드포인트와 통신하는 트래픽을 차단하지 않는지 확인합니다.

Cluster Autoscaler가 노드를 스케일 인하거나 스케일 아웃하지 않음

Cluster Autoscaler 포드 로그에서 예약 규칙 확인

포드의 상태를 확인하려면 다음 명령을 실행합니다.

kubectl logs -f -n kube-system -l app=cluster-autoscaler

보류 중 상태인 포드에 선호도 규칙과 같은 예약 규칙이 포함되어 있는지 확인하려면 다음 명령을 실행합니다.

kubectl describe pod example_podname -n example_namespace

참고: example_podname을 포드 이름으로 바꾸고 example_namespace을 네임스페이스로 바꾸십시오.

출력의 events 섹션에서 포드가 보류 중 상태인 이유에 대한 정보를 확인하십시오. 출력 예시:

$ kubectl describe pod cluster-autoscaler-abcde-abcd -n kube-system
Name: cluster-autoscaler-5b6b675456-npf8p
...
Status: Pending
...
Events:
 Type Reason Age From Message
 ---- ------ ---- ---- -------
 Warning FailedScheduling 12s (x4 over 2m) default-scheduler 0/4 nodes are available: 1 node(s) didn't match node selector, 3 node(s) didn't match pod affinity rules.

참고: Cluster Autoscaler는 nodeAffinity에서 nodeSelectorrequiredDuringSchedulingIgnoredDuringExecution을 따릅니다. 노드 그룹에 이러한 값을 레이블로 지정해야 합니다. 노드 그룹에 레이블을 지정하려면 다음 명령을 실행합니다.

kubectl get nodes --show-labels

Cluster Autoscaler는 nodeSelector 또는 requiredDuringSchedulingIgnoredDuringExecution을 사용하여 포드를 예약할 수 없는 경우 확장 요구 사항을 충족하는 노드 그룹만 사용합니다. 노드에서 포드를 예약하려면 포드 또는 노드에 정의된 예약 규칙을 수정해야 합니다. 자세한 내용은 Kubernetes 웹 사이트의 Affinity and anti-affinity를 참조하십시오.

Cluster Autoscaler의 Amazon EC2 Auto Scaling 그룹 태그 지정 확인

Cluster Autoscaler가 Auto Scaling 그룹을 검색하려면 노드 그룹의 Amazon EC2 Auto Scaling 그룹에 다음 태그를 지정해야 합니다.

tag 1에 다음 값을 구성합니다.

  • keyk8s.io/cluster-autoscaler/example-cluster를 입력합니다.
  • valueowned를 입력합니다.

참고: example-cluster를 클러스터 이름으로 바꾸십시오.

tag 2에 다음 값을 구성합니다.

  • keyk8s.io/cluster-autoscaler/enabled를 입력합니다.
  • valuetrue를 입력합니다.

배포 매니페스트의 구성 확인

배포 매니페스트를 열려면 다음 명령을 실행합니다.

kubectl -n kube-system edit deployment.apps/cluster-autoscaler

출력의 node-group-auto-discover에서 매니페스트가 올바른 클러스터 또는 노드 그룹 이름을 나열하는지 확인합니다. 출력 예시:

containers:- 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/example-cluster
   --balance-similar-node-groups
   --skip-nodes-with-system-pods=false

최대 노드 수를 초과하지 않아야 함

현재 노드 수를 확인하려면 다음 describe-nodegroup 명령을 실행합니다.

aws eks describe-nodegroup --cluster-name example-cluster --nodegroup-name example-nodegroup

참고: example-cluster를 클러스터 이름으로 바꾸고 example-nodegroup을 노드 그룹 이름으로 바꾸십시오.

최소 또는 최대 노드 수에 도달한 경우 다음 update-nodegroup-config 명령을 실행하여 값을 수정합니다.

aws eks update-nodegroup-config \
    --cluster-name cluster-name \
    --nodegroup-name nodegroup-name \
    --scaling-config minSize=minvalue,maxSize=maxvalue,desiredSize=desiredvalue \

참고: cluster-name을 클러스터 이름으로 바꾸고 nodegroup-name을 노드 그룹 이름으로 바꾸십시오. 또한 minvalue를 최소 노드 수로 바꾸고, maxvalue를 최대 노드 수로 바꾸고, desiredvalue를 원하는 노드 값으로 바꾸십시오.

노드가 클러스터에 가입할 수 있는지 확인

Amazon EC2 Auto Scaling 그룹이 시작하는 새 인스턴스가 Amazon EKS 클러스터에 가입할 수 있는지 확인합니다. 그럴 수 없는 경우 워커 노드를 Amazon EKS 클러스터에 연결하려면 어떻게 해야 합니까?를 참조하십시오.

올바른 노드 인스턴스 유형이 사용되는지 확인

Cluster Autoscaler가 현재 노드 인스턴스 유형으로 포드 리소스 요청을 이행할 수 있는지 확인하려면 다음 명령을 실행합니다.

kubectl -n example_namespace get pod example_podname -o yaml | grep resources -A6

참고: example-cluster를 클러스터 이름으로 바꾸고 example-podname을 포드 이름으로 바꾸십시오.

출력 예시:

 containers:
        - image: registry.k8s.io/autoscaling/cluster-autoscaler:v1.32.1
          name: cluster-autoscaler
          resources:
            limits:
              cpu: 100m
              memory: 600Mi
            requests:
              cpu: 100m
              memory: 600Mi

출력에서 limitsrequests 값을 확인합니다. cpumemory 값은 노드가 포드를 유지할 수 있을 만큼 충분히 높아야 합니다. 포드의 요구 사항을 보려면 다음 명령을 실행합니다.

kubectl describe pod podname -n namespace,

참고: podname을 포드 이름으로 바꾸고 namespace를 네임스페이스로 바꿉니다.

포드 요구 사항이 노드의 능력보다 높으면 kubectl edit 명령을 사용하여 Cluster Autoscaler 배포의 메모리 리소스에 대한 limitsrequests 값을 늘리십시오. 또는 포드의 리소스 요구 사항을 충족하는 다른 인스턴스 유형으로 새 노드 그룹을 만드십시오. kubectl edit에 대한 자세한 내용을 보려면 Kubernetes 웹 사이트에서 kubectl edit을 참조하십시오.

노드 그룹의 노드에 대한 테인트 구성 확인

노드에 테인트를 구성했는지, 그리고 포드가 테인트를 허용할 수 있는지 확인하려면 다음 명령을 실행합니다.

kubectl describe node example_nodename | grep taint -A2

참고: example_nodename을 사용자의 노드 이름으로 바꿉니다.

테인트를 구성한 경우 노드에 정의된 테인트를 제거합니다. 단계는 포드가 보류 중 상태임(Amazon EKS에서 포드 상태 문제를 해결하려면 어떻게 해야 합니까?)을 참조하십시오. 포드가 테인트를 허용할 수 없다면 포드에 톨러레이션을 정의하십시오. 자세한 내용은 Kubernetes 웹 사이트의 Taints and toleration을 참조하십시오.

노드에 스케일 다운이 비활성화되어 있지 않은지 확인

노드의 scale-down-disable 상태를 확인하려면 다음 명령을 실행합니다.

kubectl describe node example_nodename | grep scale-down-disable

참고: example_nodename을 사용자의 노드 이름으로 바꿉니다.

출력 예시:

cluster-autoscaler.kubernetes.io/scale-down-disabled: true

scale-down-disabletrue로 설정된 경우 다음 명령을 실행하여 노드의 주석을 제거하고 노드가 스케일 다운되도록 합니다.

kubectl annotate node example_nodename cluster-autoscaler.kubernetes.io/scale-down-disabled-

참고: example_nodename을 사용자의 노드 이름으로 바꿉니다.

Cluster Autoscaler 문제 해결 단계에 대한 자세한 내용은 GitHub 웹 사이트의 Frequently Asked Questions를 참조하십시오.

AWS 공식업데이트됨 4달 전