Cluster Autoscaler - Amazon EKS

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Cluster Autoscaler

Kubernetes Cluster Autoscaler는 리소스 부족으로 인해 포드가 시작하는 데 실패하거나 클러스터에 있는 노드의 사용률이 낮아 클러스터 내 다른 노드로 포드를 다시 예약할 수 있는 경우 클러스터 내 노드의 수를 자동으로 조정합니다.

이 주제에서는 Cluster Autoscaler를 Amazon EKS 클러스터로 배포하고 Cluster Autoscaler를 구성하여 Amazon EC2 Auto Scaling 그룹을 수정하는 방법에 관해 살펴봅니다. Cluster Autoscaler는 더 많은 리소스가 필요할 때 확장되고 사용률이 낮은 리소스가 있을 때 축소되도록 노드 그룹을 수정합니다.

Amazon EKS 클러스터 생성

이 단원에서는 클러스터와 노드 그룹 또는 그룹을 생성할 수 있습니다. 이미 클러스터가 있는 경우 Cluster Autoscaler 노드 그룹 고려 사항 단계로 건너뛸 수 있습니다.

Amazon EBS 볼륨에 의해 백업되고 Kubernetes Cluster Autoscaler를 사용하는 상태 기반 애플리케이션을 여러 가용 영역에서 실행하는 경우, 각 단일 가용 영역으로 범위가 지정된 여러 노드 그룹을 구성해야 합니다. 또한 --balance-similar-node-groups 기능을 활성화해야 합니다. 그렇지 않으면 여러 가용 영역에 걸쳐 있는 단일 노드 그룹을 생성할 수 있습니다.

다음 클러스터 생성 절차 중 하나의 단계를 완료합니다.

[여러 가용 영역에 걸쳐 있는 단일 관리형 그룹으로 클러스터를 생성하려면 ]

  • 다음 eksctl 명령을 사용하여 단일 관리형 노드 그룹으로 Amazon EKS 클러스터를 생성합니다. 자세한 정보는 Amazon EKS 클러스터 생성 단원을 참조하십시오. 를 원하는 값으로 교체합니다.<variable text>

    eksctl create cluster --name <my-cluster> --version <1.18> --managed --asg-access

    가용 영역을 보여 주는 출력 부분:

    ... [ℹ] using region <region-code> [ℹ] setting availability zones to [<region-code>a <region-code>b <region-code>c] [ℹ] subnets for <region-code>a - public:192.168.0.0/19 private:192.168.96.0/19 [ℹ] subnets for <region-code>b - public:192.168.32.0/19 private:192.168.128.0/19 [ℹ] subnets for <region-code>c - public:192.168.64.0/19 private:192.168.160.0/19 ... [ℹ] nodegroup "ng-6bcca56a" has 2 node(s) [ℹ] node "ip-192-168-28-68.<region-code>.compute.internal" is ready [ℹ] node "ip-192-168-61-153.<region-code>.compute.internal" is ready [ℹ] waiting for at least 2 node(s) to become ready in "ng-6bcca56a" [ℹ] nodegroup "ng-6bcca56a" has 2 node(s) [ℹ] node "ip-192-168-28-68.<region-code>.compute.internal" is ready [ℹ] node "ip-192-168-61-153.<region-code>.compute.internal" is ready ... [✔] EKS cluster "my-cluster" in "<region-code>" region-code is ready

[각 가용 영역에 대한 전용 관리형 노드 그룹이 있는 클러스터를 생성하려면 ]

  1. 다음과 같이 eksctl 명령을 사용하여 노드 그룹이 없는 Amazon EKS 클러스터를 생성하십시오. 자세한 정보는 Amazon EKS 클러스터 생성 단원을 참조하십시오. 클러스터가 생성되는 가용 영역에 주의하십시오. 노드 그룹을 생성할 때 이 가용 영역을 사용합니다. 빨간색 변수 텍스트를 원하는 값으로 교체합니다.

    eksctl create cluster --name <my-cluster> --version <1.18> --without-nodegroup

    가용 영역을 보여 주는 출력 부분:

    ... [ℹ] using region <region-code> [ℹ] setting availability zones to [<region-code>a <region-code>c <region-code>b] [ℹ] subnets for <region-code>a - public:192.168.0.0/19 private:192.168.96.0/19 [ℹ] subnets for <region-code>c - public:192.168.32.0/19 private:192.168.128.0/19 [ℹ] subnets for <region-code>b - public:192.168.64.0/19 private:192.168.160.0/19 ... [✔] EKS cluster "my-cluster" in "<region-code>" region is ready

    이 클러스터는 가용 영역a, <region-code>c 및 <region-code>b에서 생성되었습니다.<region-code>

  2. 클러스터의 각 가용 영역에 대해 다음 eksctl 명령을 사용하여 노드 그룹을 생성합니다. 를 원하는 값으로 교체합니다.<variable text> 이 명령을 통해 최소 1개에서 최대 10개의 Auto Scaling 그룹이 생성됩니다.

    eksctl create nodegroup --cluster <my-cluster> --node-zones <<region-code>a> --name <<region-code>a> --asg-access --nodes-min <1> --nodes <5> --nodes-max <10> --managed

Cluster Autoscaler 노드 그룹 고려 사항

Cluster Autoscaler에는 이 단원에서 설명하는 추가 IAM 및 리소스 태그 지정 고려 사항이 필요합니다.

노드 그룹 IAM 정책

Cluster Autoscaler에는 사용자를 대신하여 IAM AWS를 호출할 수 있는 다음 APIs 권한이 필요합니다.

이전의 eksctl 명령을 사용하여 노드 그룹을 생성한 경우 이러한 권한은 노드 IAM 역할에 자동으로 제공 및 연결됩니다. 를 사용하지 않은 경우 다음 문서가 포함된 eksctl 정책을 생성하여 노드 IAM 역할에 연결해야 합니다.IAM 자세한 내용은 https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_manage_modify.html역할 수정IAM 사용 설명서을 참조하십시오.

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

Auto Scaling 그룹 태그

Cluster Autoscaler에서는 노드 그룹인 Auto Scaling 그룹에 다음과 같은 태그가 있어야 자동 검색됩니다.

이전의 eksctl 명령을 사용하여 노드 그룹을 생성한 경우 이 태그는 자동으로 적용됩니다. 그러지 않았다면 다음 태그로 Auto Scaling 그룹에 수동으로 태그를 지정해야 합니다. 자세한 내용은 https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.htmlAmazon EC2 리소스 태그 지정Linux 인스턴스용 Amazon EC2 사용 설명서을 참조하십시오.

Key Value

k8s.io/cluster-autoscaler/<cluster-name>

owned

k8s.io/cluster-autoscaler/enabled

true

Cluster Autoscaler 배포

Cluster Autoscaler를 배포하려면

  1. 클러스터가 속한 리전에 해당하는 옵션을 완료하여 클러스터에 매니페스트를 적용합니다.

    • 또는 중국(닝샤) 이외의 모든 리전중국(베이징)

      kubectl apply -f https://raw.githubusercontent.com/kubernetes/autoscaler/master/cluster-autoscaler/cloudprovider/aws/examples/cluster-autoscaler-autodiscover.yaml
    • 중국(닝샤) 또는 중국(베이징)

      1. 다음 명령을 사용하여 매니페스트를 다운로드합니다.

        curl -o cluster-autoscaler-autodiscover.yaml https://raw.githubusercontent.com/kubernetes/autoscaler/master/cluster-autoscaler/cloudprovider/aws/examples/cluster-autoscaler-autodiscover.yaml
      2. 매니페스트를 수정합니다.

        1. 다운로드한 매니페스트 파일을 확인하고 이미지 이름을 기록해 둡니다. 다음 명령을 사용하여 이미지를 로컬에 다운로드합니다.

          docker pull image:<tag>
        2. 다음 명령을 사용하여 이미지를 중국의 Amazon Elastic Container Registry 리포지토리에 푸시하도록 이미지에 태그를 지정합니다.

          docker tag image:<tag> <aws_account_id>.dkr.ecr.<cn-north-1>.amazonaws.com/image:<tag>
        3. 다음 명령을 사용하여 중국 Amazon ECR 리포지토리에 이미지를 푸시합니다.

          docker push image:<tag> <aws_account_id>.dkr.ecr.<cn-north-1>.amazonaws.com/image:<tag>
        4. 해당 리전의 Amazon ECR 이미지 URL을 참조하도록 Kubernetes 매니페스트 파일을 업데이트합니다.

      3. 매니페스트를 적용합니다.

        kubectl apply -f cluster-autoscaler-autodiscover.yaml
  2. 다음 명령을 사용하여 배포에 cluster-autoscaler.kubernetes.io/safe-to-evict 주석을 추가합니다.

    kubectl -n kube-system annotate deployment.apps/cluster-autoscaler cluster-autoscaler.kubernetes.io/safe-to-evict="false"
  3. 다음 명령을 사용하여 Cluster Autoscaler 배포를 편집합니다.

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

    cluster-autoscaler 컨테이너 명령을 편집하여 <YOUR CLUSTER NAME>을 클러스터의 이름으로 교체하고 다음 옵션을 추가합니다.

    • <--balance-similar-node-groups>

    • <--skip-nodes-with-system-pods=false>

    spec: 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/<<YOUR CLUSTER NAME>> - <--balance-similar-node-groups> - <--skip-nodes-with-system-pods=false>

    파일을 저장한 다음 종료하여 변경 사항을 적용합니다.

  4. 웹 브라우저에서 Cluster Autoscaler 릴리스 페이지를 열고 클러스터의 Kubernetes 메이저 및 마이너 버전과 일치하는 최신 Cluster Autoscaler 버전을 검색합니다. 예를 들어 클러스터의 Kubernetes 버전이 1.18이라면 1.18으로 시작하는 Cluster Autoscaler 릴리스를 검색합니다. 다음 단계에서 사용할 수 있도록 해당 릴리스의 의미 체계 버전 번호(1.18.<n>)를 기록합니다.

  5. 다음 명령을 사용하여 Cluster Autoscaler 이미지 태그를 이전 단계에서 적어 둔 버전으로 설정합니다. 를 사용자의 값으로 바꿉니다.1.15.n usasia 또는 eu으로 바꿀 수 있습니다.

    kubectl -n kube-system set image deployment.apps/cluster-autoscaler cluster-autoscaler=<us>.gcr.io/k8s-artifacts-prod/autoscaling/cluster-autoscaler:v<1.15.n>
    참고

    필요한 버전에 따라 이전 주소를 gcr.io/google-containers/cluster-autoscaler:v1.<n.n>으로 변경해야 할 수도 있습니다. 이미지 주소는 릴리스 페이지에 나와 있습니다.

Cluster Autoscaler 로그 보기

Cluster Autoscaler를 배포한 후에는 로그를 보고 Cluster Autoscaler가 클러스터 로드를 모니터링하고 있는지 확인할 수 있습니다.

다음 명령을 사용하여 Cluster Autoscaler 로그를 봅니다.

kubectl -n kube-system logs -f deployment.apps/cluster-autoscaler

결과:

I0926 23:15:55.165842 1 static_autoscaler.go:138] Starting main loop I0926 23:15:55.166279 1 utils.go:595] No pod using affinity / antiaffinity found in cluster, disabling affinity predicate for this loop I0926 23:15:55.166293 1 static_autoscaler.go:294] Filtering out schedulables I0926 23:15:55.166330 1 static_autoscaler.go:311] No schedulable pods I0926 23:15:55.166338 1 static_autoscaler.go:319] No unschedulable pods I0926 23:15:55.166345 1 static_autoscaler.go:366] Calculating unneeded nodes I0926 23:15:55.166357 1 utils.go:552] Skipping ip-192-168-3-111.<region-code>.compute.internal - node group min size reached I0926 23:15:55.166365 1 utils.go:552] Skipping ip-192-168-71-83.<region-code>.compute.internal - node group min size reached I0926 23:15:55.166373 1 utils.go:552] Skipping ip-192-168-60-191.<region-code>.compute.internal - node group min size reached I0926 23:15:55.166435 1 static_autoscaler.go:393] Scale down status: unneededOnly=false lastScaleUpTime=2019-09-26 21:42:40.908059094 ... I0926 23:15:55.166458 1 static_autoscaler.go:403] Starting scale down I0926 23:15:55.166488 1 scale_down.go:706] No candidates for scale down