Load To Technical Architect

[AWS] EKS Cluster AutoScaler 구성 본문

Cloud/AWS

[AWS] EKS Cluster AutoScaler 구성

고지식한청춘 2022. 8. 9. 14:00
728x90

AWS EKS Document : https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/autoscaling.html

 

 

[ 사전 준비 ]

- 노드 그룹 생성 (eksctl or AWS Console)

- eksctl 설치

 

 

[ CLI 작업 ]

1. cluster autoscaler IAM policy 생성 및 EKS SA 생성

$ vi cluster-autoscaler-policy.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "autoscaling:SetDesiredCapacity",
                "autoscaling:TerminateInstanceInAutoScalingGroup"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/k8s.io/cluster-autoscaler/<my-cluster>": "owned"
                }
            }
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "autoscaling:DescribeAutoScalingInstances",
                "autoscaling:DescribeAutoScalingGroups",
                "ec2:DescribeLaunchTemplateVersions",
                "autoscaling:DescribeTags",
                "autoscaling:DescribeLaunchConfigurations"
            ],
            "Resource": "*"
        }
    ]
}


$ aws iam create-policy \
    --policy-name AmazonEKSClusterAutoscalerPolicy \
    --policy-document file://cluster-autoscaler-policy.json
    
    
$ eksctl create iamserviceaccount \
  --cluster=<my-cluster> \
  --namespace=kube-system \
  --name=cluster-autoscaler \
  --attach-policy-arn=arn:aws:iam::<111122223333>:policy/<AmazonEKSClusterAutoscalerPolicy> \
  --override-existing-serviceaccounts \
  --approve

- <my-cluster>, IAM Policy arn은 환경에 맞게 수정

 

 

2. CA 배포

$ curl -o cluster-autoscaler-autodiscover.yaml https://raw.githubusercontent.com/kubernetes/autoscaler/master/cluster-autoscaler/cloudprovider/aws/examples/cluster-autoscaler-autodiscover.yaml
  
  
$ kubectl apply -f cluster-autoscaler-autodiscover.yaml
  
  
$ kubectl patch deployment cluster-autoscaler \
-n kube-system \
-p '{"spec":{"template":{"metadata":{"annotations":{"cluster-autoscaler.kubernetes.io/safe-to-evict": "false"}}}}}'



$ kubectl -n kube-system edit deployment.apps/cluster-autoscaler
    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> // Cluster명 수정
        - --balance-similar-node-groups // 추가
        - --skip-nodes-with-system-pods=false // 추가
  
  
$ kubectl set image deployment cluster-autoscaler \
-n kube-system \
cluster-autoscaler=k8s.gcr.io/autoscaling/cluster-autoscaler:v<1.22.n> // 버전 확인 후 지정
// 버전 확인 https://github.com/kubernetes/autoscaler/releases

 

 

3. 로그 확인

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

 

 

ps 1 : CA는 NodeGroup에서 지정한 인스턴스  타입, 최대/최소 노드 수를 기준으로 Auto Scaling 함

ps 2 : 만약 AutoScaling에 문제가 있다면 로그를 꼭 확인(보통 CA 시작하자마자 에러가 발생함)

# 필자의 경우 SA 구성이 이상했는지 Node Instance Role에 AutoScaling 권한이 없다는 에러가 계속 발생하여 Node Instance Role에 cluster autoscaler policy를 추가함..

728x90
Comments