Ssoon

[5주차] EKS Autoscaling - Cluster Autoscaler (CA) 본문

AWS EKS Workshop Study

[5주차] EKS Autoscaling - Cluster Autoscaler (CA)

구구달스 2023. 5. 21. 22:17
CloudNet@ 팀의 AWS EKS Workshop Study 5주차 정리입니다.
# EKS Immersion Workshop 의 내용입니다.

Cluster Autoscaler (CA)

Kubernetes 클러스터에서 자동으로 노드의 크기를 조정하는 기능을 제공

클러스터에 할당된 노드의 리소스 사용량을 모니터링하고, 필요에 따라 자동으로 노드를 추가하거나 삭제하여 클러스터의 용량을 조정

  => 이를 통해 클러스터의 성능을 최적화하고, 리소스를 효율적으로 활용할 수 있습니다.

  • 리소스 모니터링: 클러스터 내에서 실행 중인 파드의 리소스 사용량을 지속적으로 모니터링합니다. 이는 CPU, 메모리, GPU 등과 같은 리소스에 대한 사용량을 포함합니다.
  • 스케일링 결정: 클러스터의 리소스 사용량을 기반으로 스케일링 결정을 내립니다. 예를 들어, 파드의 수요가 현재 노드의 가용 리소스를 초과하는 경우, 노드를 추가하여 추가 요청을 수용할 수 있도록 합니다. 반대로, 파드의 사용량이 낮아진 경우 비어있는 노드를 제거하여 리소스를 절약합니다.
  • 노드 조정: 클러스터에 새로운 노드를 추가하거나, 더 이상 필요하지 않은 노드를 제거함으로써 클러스터의 크기를 조정합니다. 이 과정은 클러스터의 자원 요구사항에 따라 유연하게 이루어집니다.

 

Observability setup 삭제

export CLUSTER_NAME=$(eksctl get clusters -o json | jq -r '.[0].Name')
kubectl -n amazon-cloudwatch delete daemonsets cloudwatch-agent fluent-bit
eksctl delete iamserviceaccount --cluster ${CLUSTER_NAME}  --name cloudwatch-agent  --namespace amazon-cloudwatch
eksctl delete iamserviceaccount --cluster ${CLUSTER_NAME}  --name fluent-bit  --namespace amazon-cloudwatch

cd ~/environment/eks-app-mesh-polyglot-demo/workshop/
kubectl delete -f prometheus-eks.yaml
eksctl delete iamserviceaccount --cluster ${CLUSTER_NAME} --name cwagent-prometheus  --namespace amazon-cloudwatch

 

[ ASG 구성 ]

먼저 클러스터에 몇 개의 노드가 있는지 확인합니다.

최소, 최대 및 원하는 용량을 설정하여 Auto Scaling 그룹의 크기를 구성합니다.

aws autoscaling \
    describe-auto-scaling-groups \
    --query "AutoScalingGroups[? Tags[? (Key=='eks:cluster-name') && Value=='myeks']].[AutoScalingGroupName, MinSize, MaxSize,DesiredCapacity]" \
    --output table

최대 용량을 인스턴스 4개로 늘립니다.

export ASG_NAME=$(aws autoscaling describe-auto-scaling-groups --query "AutoScalingGroups[? Tags[? (Key=='eks:cluster-name') && Value=='myeks']].AutoScalingGroupName" --output text)

aws autoscaling \
    update-auto-scaling-group \
    --auto-scaling-group-name ${ASG_NAME} \
    --min-size 3 \
    --desired-capacity 3 \
    --max-size 4

 

[ 서비스 계정의 IAM 역할 ]

EKS 클러스터의 서비스 계정에 대한 IAM 역할을 사용하여 IAM 역할을 Kubernetes 서비스 계정과 연결할 수 있습니다. 그런 다음 이 서비스 계정은 해당 서비스 계정을 사용하는 포드의 컨테이너에 AWS 권한을 제공할 수 있습니다. 이 기능을 사용하면 더 이상 해당 노드의 포드가 AWS API를 호출할 수 있도록 노드 IAM 역할에 확장 권한을 제공할 필요가 없습니다.

 

  • CA Pod 가 Auto Scaling 그룹과 상호 작용할 수 있도록 서비스 계정에 대한 IAM 정책을 생성합니다.
mkdir cluster-autoscaler

cat <<EoF > k8s-asg-policy.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "autoscaling:DescribeAutoScalingGroups",
                "autoscaling:DescribeAutoScalingInstances",
                "autoscaling:DescribeLaunchConfigurations",
                "autoscaling:DescribeTags",
                "autoscaling:SetDesiredCapacity",
                "autoscaling:TerminateInstanceInAutoScalingGroup",
                "ec2:DescribeLaunchTemplateVersions",
                "ec2:DescribeInstanceTypes"
            ],
            "Resource": "*",
            "Effect": "Allow"
        }
    ]
}
EoF

aws iam create-policy   \
  --policy-name k8s-asg-policy \
  --policy-document file://k8s-asg-policy.json

  • kube-system 네임스페이스에서 cluster-autoscaler 서비스 계정에 대한 IAM 역할을 생성합니다.
CLUSTER_NAME=myeks
ACCOUNT_ID=251054188804

eksctl create iamserviceaccount \
    --name cluster-autoscaler \
    --namespace kube-system \
    --cluster ${CLUSTER_NAME} \
    --attach-policy-arn "arn:aws:iam::${ACCOUNT_ID}:policy/k8s-asg-policy" \
    --approve \
    --override-existing-serviceaccounts

IAM 역할의 ARN이 있는 서비스 계정에 주석이 달려 있는지(annotated) 확인합니다.

 

[ Cluster Autoscaler (CA) 배포 ]

  • Cluster Autoscaler를 클러스터에 배포합니다.

https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler/cloudprovider/aws/examples

 

GitHub - kubernetes/autoscaler: Autoscaling components for Kubernetes

Autoscaling components for Kubernetes. Contribute to kubernetes/autoscaler development by creating an account on GitHub.

github.com

curl -s -O https://raw.githubusercontent.com/kubernetes/autoscaler/master/cluster-autoscaler/cloudprovider/aws/examples/cluster-autoscaler-autodiscover.yaml
sed -i "s/<YOUR CLUSTER NAME>/$CLUSTER_NAME/g" cluster-autoscaler-autodiscover.yaml
kubectl apply -f cluster-autoscaler-autodiscover.yaml
  • CA가 자체 포드가 실행 중인 노드를 제거하지 못하도록 다음 명령을 사용하여 배포에 cluster-autoscaler.kubernetes.io/safe-to-evict 주석을 추가합니다.
kubectl patch deployment cluster-autoscaler \
  -n kube-system \
  -p '{"spec":{"template":{"metadata":{"annotations":{"cluster-autoscaler.kubernetes.io/safe-to-evict": "false"}}}}}'

  • Cluster-autoscaler가 EKS 클러스터에서 노드를 검색하려면 Auto Scaling 그룹에 특정 태그가 할당되어 있어야 합니다.
  • ASG에 할당된 태그를 확인하려면 AWS 콘솔에서 EC2 -> Auto Scaling -> Auto Scaling Groups로 이동하여 Auto Scaling Group을 클릭합니다. 아래와 같이 ASG에 할당된 태그가 표시되어야 합니다.
  • Cluster Autoscaler 가 노드를 검색하는 데 필요합니다.

 

[ ReplicaSet 확장 ]

proddetail 서비스에는 지금까지 단 하나의 복제본만 있습니다.

proddetail 복제본을 수동으로 15개로 확장합니다.

kubectl scale --replicas=15 deployment/proddetail -n workshop

일부 Pod은 Pending 상태가 되어 cluster-autoscaler가 EC2 플릿을 확장하도록 트리거합니다.

kubectl get pods -l app=proddetail -n workshop -o wide --watch

 

클러스터에 4개의 노드로 확장된 것을 확인할 수 있습니다.

 

[ 정리를 위해 ReplicaSet 스케일 축소 ]

  • proddetail 복제본을 다시 1로 축소합니다.
kubectl scale --replicas=1 deployment/proddetail -n workshop

  • cluster autoscaler가 클러스터에서 추가 노드를 제거할 때까지 몇 분 동안 기다려야 합니다.

 

[ Clean up ]

kubectl delete -f cluster-autoscaler.yaml

eksctl delete iamserviceaccount \
  --name cluster-autoscaler \
  --namespace kube-system \
  --cluster myeks \
  --wait

aws iam delete-policy \
  --policy-arn arn:aws:iam::${ACCOUNT_ID}:policy/k8s-asg-policy

export ASG_NAME=$(aws autoscaling describe-auto-scaling-groups --query "AutoScalingGroups[? Tags[? (Key=='eks:cluster-name') && Value=='myeks']].AutoScalingGroupName" --output text)

aws autoscaling \
    update-auto-scaling-group \
    --auto-scaling-group-name ${ASG_NAME} \
    --min-size 3 \
    --desired-capacity 3 \
    --max-size 3

 

 

 

 

 

 

Comments