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

6분 분량
0

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

간략한 설명

시작하기 전에 다음을 확인하세요.

  • eksctl의 최신 버전을 설치하거나 최신 버전으로 업데이트했는지 여부.
  • 코드 조각의 자리 표시자 값을 사용자 고유의 값으로 바꾸었는지 여부

Note: 사용자 AWS 리전의 기본값이 사용되므로, --region 변수가 명령에 항상 사용되는 것은 아닙니다. AWS Command Line Interface(AWS CLI) configure 명령을 실행하여 기본값을 확인합니다. AWS 리전을 변경해야 하는 경우 --region 플래그를 사용합니다.

참고: AWS CLI 명령을 실행할 때 오류가 발생하는 경우 최신 버전의 AWS CLI를 사용하고 있는지 확인하세요.

해결 방법

Cluster Autoscaler 포드가 CrashLoopBackOff 상태임

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

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

다음은 CrashLoopBackOff 상태인 Cluster Autoscaler 포드의 예입니다.

NAME                            READY   STATUS             RESTARTS      AGE
cluster-autoscaler-xxxx-xxxxx   0/1     CrashLoopBackOff   3 (20s ago)   99s

다음 명령을 실행하여 Cluster Autoscaler 포드 로그를 확인합니다.

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

로그에 AWS Identity and Access Management(IAM) 권한 문제가 있는 것으로 표시되어 있으면 다음을 수행합니다.

  • OIDC 공급자가 Amazon EKS 클러스터와 연결되어 있는지 확인합니다.
  • Cluster Autoscaler 서비스 계정에 IAM 역할이 할당되어 있는지 확인합니다.
  • 앞서 언급한 IAM 역할에 올바른 IAM 정책이 연결되어 있는지 확인합니다.
  • 신뢰 관계가 올바르게 구성되었는지 확인합니다.

참고: 다음은 IAM 권한 문제를 나타내는 로그의 예입니다.

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

중요: 해당 AWS CLI 명령을 모두 확인하고 예제 문자열의 모든 인스턴스를 사용자의 실제 값으로 바꾸어야 합니다. 예를 들어 example-cluster를 실제 클러스터로 바꿉니다.

OIDC 공급자가 EKS 클러스터와 연결되어 있는지 확인

1.    다음 명령을 실행하여 클러스터의 기존 IAM OpenID Connect(OIDC) 공급자가 있는지 확인합니다.

oidc_id=$(aws eks describe-cluster --name example-cluster --query "cluster.identity.oidc.issuer" --output text | cut -d '/' -f 5)

2.    다음 명령을 실행하여 해당 클러스터 ID의 IAM OIDC 공급자가 이미 계정에 있는지 확인합니다.

aws iam list-open-id-connect-providers | grep $oidc_id | cut -d "/" -f4

참고: 출력이 반환되면 클러스터의 IAM OIDC 공급자가 이미 있는 것이므로 다음 단계를 건너뛰어도 됩니다. 출력이 반환되지 않으면 다음 단계에서 클러스터의 IAM OIDC 공급자를 생성해야 합니다.

3.    다음 명령을 실행하여 클러스터의 IAM OIDC ID 공급자를 생성합니다.

eksctl utils associate-iam-oidc-provider --cluster example-cluster --approve

Cluster Autoscaler 서비스 계정에 IAM 역할이 할당되어 있는지 확인

다음 명령을 실행하여 서비스 계정에 IAM 역할이 할당되어 있는지 확인합니다.

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

예상 결과는 다음과 같습니다.

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

앞서 언급한 IAM 역할에 올바른 IAM 정책이 연결되어 있는지 확인

예를 보려면 다음을 참조하세요.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": [
        "autoscaling:DescribeAutoScalingInstances",
        "autoscaling:SetDesiredCapacity",
        "autoscaling:DescribeAutoScalingGroups",
        "autoscaling:DescribeTags",
        "autoscaling:DescribeLaunchConfigurations",
        "ec2:DescribeLaunchTemplateVersions",
        "ec2:DescribeInstanceTypes",
        "autoscaling:TerminateInstanceInAutoScalingGroup"
      ],
      "Resource": "*"
    }
  ]
}

신뢰 관계가 올바르게 구성되었는지 확인

예를 보려면 다음을 참조하세요.

{
  "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"
        }
      }
    }
  ]
}

서비스 계정 역할 또는 IAM 정책이 변경된 경우 Cluster Autoscaler 포드를 다시 시작합니다.

로그에 네트워킹 문제(예: I/O 시간 초과)가 표시되면 다음을 수행합니다.

참고: 다음은 네트워킹 문제를 나타내는 로그의 예입니다.

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

1.    Amazon EKS 클러스터가 필요한 네트워킹 설정으로 구성되어 있는지 확인합니다. 워커 노드 서브넷에 글로벌 또는 리전별 엔드포인트에서 다음 엔드포인트로 트래픽을 라우팅할 수 있는 라우팅 테이블이 있는지 확인합니다.

  • Amazon Elastic Compute Cloud(Amazon EC2)
  • AWS Auto Scaling
  • AWS Security Token Service(AWS STS)

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

3.    Amazon EKS 클러스터가 프라이빗 클러스터인 경우 관련 Amazon Virtual Private Cloud(VPC) 엔드포인트의 설정을 확인합니다. 이러한 엔드포인트의 예로는 Amazon EC2, AWS Auto Scaling, AWS STS 등이 있습니다.

참고: Amazon EKS 워커 노드 보안 그룹을 허용하려면 각 VPC 엔드포인트의 보안 그룹이 필요합니다. 또한 443 포트의 수신 트래픽에서 Amazon EKS VPC CIDR 블록을 허용해야 합니다.

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

Cluster Autoscaler가 노드를 스케일 인하거나 스케일 아웃하지 않는 경우 다음을 확인합니다.

  • Cluster Autoscaler 포드 로그를 확인합니다.
  • Cluster Autoscaler의 오토 스케일링 그룹 태깅을 확인합니다.
  • 배포 매니페스트의 구성을 확인합니다.
  • 현재 노드 수를 확인합니다.
  • 포드 리소스 요청을 확인합니다.
  • 노드 그룹의 노드에 대한 테인트 구성을 확인합니다.
  • 노드에 scale-down-disable이라는 주석이 추가되어 있는지 확인합니다.

Cluster Autoscaler 포드 로그 확인

포드 로그를 보고 Cluster Autoscaler가 노드를 스케일 인 또는 스케일 아웃하지 않는 이유를 확인하려면 다음 명령어를 실행합니다.

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

다음 describe pod 명령을 실행하여 Pending 상태인 포드에 선호도 규칙과 같은 스케줄링 규칙이 포함되어 있는지 확인합니다.

kubectl describe pod <example_podname> -n <example_namespace>

출력에서 events 섹션을 확인합니다. 이 섹션에서 포드가 보류 상태인 이유와 관련한 정보를 확인할 수 있습니다.

참고: Cluster Autoscaler는 사용자가 그에 따라 노드를 레이블링했다고 간주하여 nodeSelectornodeAffinityrequiredDuringSchedulingIgnoredDuringExecution을 따릅니다. nodeSelector 또는 requiredDuringSchedulingIgnoredDuringExecution을 사용하여 포드를 스케줄링할 수 없는 경우, Cluster Autoscaler는 해당 요구 사항을 충족하는 노드 그룹만 확장 대상으로 간주합니다. 노드에서 포드가 스케줄링되도록 포드 또는 노드에 정의된 스케줄링 규칙을 적절히 수정ㅏㅎ세요.

Cluster Autoscaler의 오토 스케일링 그룹 태깅 확인

Cluster Autoscaler가 오토 스케일링 그룹을 검색하려면 노드 그룹의 해당 오토 스케일링 그룹에 다음과 같이 태깅해야 합니다.

태그 1:

  • 키: k8s.io/cluster-autoscaler/example-cluster
  • 값: owned

태그 2:

  • 키: k8s.io/cluster-autoscaler/enabled
  • 값: true

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

클러스터 Autoscaler 배포 매니페스트의 구성을 확인하려면 다음 명령을 실행합니다.

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

다음과 같이 매니페스트가 올바른 node-group-auto-discovery 인수로 구성되어 있는지 확인합니다.

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

현재 노드 수 확인

현재 노드 수가 관리 노드 그룹의 최소값 또는 최대값에 도달했는지 확인하려면 다음 명령을 실행합니다.

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

최소값 또는 최대값에 도달한 경우 새 워크로드 요구 사항에 맞게 값을 수정합니다.

포드 리소스 요청 확인

현재 노드 인스턴스 유형에서 포드 리소스 요청을 이행할 수 없는지 확인하려면 다음 명령을 실행합니다.

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

리소스 요청이 이행되도록 하려면 포드 리소스 요청을 수정하거나 새 노드 그룹을 생성합니다. 새 노드 그룹을 생성하는 경우 노드의 인스턴스 유형이 포드의 리소스 요구 사항을 충족할 수 있는지 확인합니다.

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

다음 명령을 실행하여 노드에 테인트가 구성되어 있는지 여부와 포드가 테인트를 허용할 수 있는지 여부를 확인합니다.

kubectl describe node <example_nodename> | grep taint -A2

테인트가 구성되어 있는 경우 노드에서 정의된 테인트를 제거합니다. 포드가 테인트를 허용할 수 없는 경우, 포드에 허용을 정의하여 테인트가 구성된 노드에서 포드를 스케줄링할 수 있도록 합니다.

노드에 scale-down-disable이라는 주석이 추가되어 있는지 확인

노드에 scale-down-disable이라는 주석이 추가되어 있는지 확인하려면 다음 명령을 실행합니다.

kubectl describe node <example_nodename> | grep scale-down-disable

예상 결과는 다음과 같습니다.

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

scale-down-disable이 true로 설정되어 있는 경우 다음 명령을 실행하여, 노드를 스케일 다운할 수 있도록 주석을 제거합니다.

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

문제 해결에 대한 자세한 내용은 GitHub 웹 사이트에서 Cluster Autoscaler FAQ를 참조하세요.


AWS 공식
AWS 공식업데이트됨 일 년 전