Ssoon
[5주차] EKS Autoscaling - Cluster Autoscaler (CA) 본문
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
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
'AWS EKS Workshop Study' 카테고리의 다른 글
[5주차] EKS Autoscaling - KARPENTER - INSTALL KARPENTER (0) | 2023.05.25 |
---|---|
[5주차] EKS Autoscaling - KARPENTER - SET UP THE ENVIRONMENT (0) | 2023.05.25 |
[5주차] EKS Autoscaling - Horizontal Pod AutoScaler (HPA) (0) | 2023.05.21 |
[4주차] EKS Observability - ADOT, AMP 및 AMG를 사용한 모니터링 (0) | 2023.05.20 |
[4주차] EKS Observability - Logs, Traces and Metrics (0) | 2023.05.20 |