eksctl을 사용해서 관리형 노드 그룹으로 클러스터를 구성하면 ClusterConfig에서 설정한대로 노드 그룹에 대한 Auto Scaling group이 자동으로 생성된다. 이후에 eksctl 명령어를 이용해서 오토스케일링 그룹의 min, max, desired size 값 등을 수동으로 변경할 수 있다. 하지만… 이 오토스케일링 그룹은 자동으로 pod의 pending을 인식해서 노드를 늘려주지는 않았다.
EKS에는 각 인스턴스의 종류에 따라서 사용 가능한 Pod의 수가 정해져 있는데, 이 pod의 수를 넘어가면 생성되는 pod가 pending 상태로 멈춰있는 현상이 발생한다. 이런 문제 해결을 위해서는 pod의 pending상태를 인식하고 node를 증감시키도록 클러스터 오토스케일링이 필요하다.
아무래도 자동으로 설정되는 Auto Scaling 그룹은 AWS의 EC2 인스턴스 차원에서 관리해주는 듯 하고, pod의 pending상태를 인식해서클러스터의 노드 수를 조정하기 위해서는 추가적인 쿠버네티스 설정이 필요한 듯 하다.
1. IAM 정책 및 역할 생성
인스턴스 오토스케일링을 위한 권한 설정을 해주어야 한다.
먼저, 역할에 연결해줄 정책을 생성한다.
#정책 생성 명령
$ aws iam create-policy \
--policy-name AmazonEKSClusterAutoscalerPolicy \
--policy-document file://iam_policies/cluster-autoscaler-policy.json
#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/<cluster-name>": "owned"
}
}
},
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": [
"autoscaling:DescribeAutoScalingInstances",
"autoscaling:DescribeAutoScalingGroups",
"ec2:DescribeLaunchTemplateVersions",
"autoscaling:DescribeTags",
"autoscaling:DescribeLaunchConfigurations"
],
"Resource": "*"
}
]
}
생성한 정책을 새로 생성하는 service account 역할에 연결해준다.
$ eksctl create iamserviceaccount \
--cluster=<cluster-name> \
--namespace=kube-system \
--name=cluster-autoscaler \
--attach-policy-arn=arn:aws:iam::<account id>:policy/AmazonEKSClusterAutoscalerPolicy \
--override-existing-serviceaccounts \
--approve
2. Cluster Autoscaler 배포
Cluster Autoscaler에 대한 yaml 설정파일을 다운 받고 수정한다.
#YAML 파일 다운로드
$ curl -o cluster-autoscaler-autodiscover.yaml https://raw.githubusercontent.com/kubernetes/autoscaler/master/cluster-autoscaler/cloudprovider/aws/examples/cluster-autoscaler-autodiscover.yaml
#YAML 파일 수정 (163번 줄)
#- --node-group-auto-discovery=asg:tag=k8s.io/cluster-autoscaler/enabled,k8s.io/cluster-autoscaler/<YOUR CLUSTER NAME>
- --node-group-auto-discovery=asg:tag=k8s.io/cluster-autoscaler/enabled,k8s.io/cluster-autoscaler/demo-eks
1에서 생성한 cluster-autoscaler service account에 annotation을 지정한다.
서비스 어카운트 확인 후 어노테이션이 이미 잘 지정이 되어 있다면 skip해도 된다.
#annotation 확인
kubectl describe sa cluster-autoscaler -n kube-system
#어노테이션 지정
kubectl annotate serviceaccount cluster-autoscaler \
-n kube-system \
[eks.amazonaws.com/role-arn=arn:aws:iam::](<http://eks.amazonaws.com/role-arn=arn:aws:iam::>):role/
이제 yaml 파일을 배포하고 배포된 deployment를 편집한다.
#yaml 배포
$ kubectl apply -f cluster-autoscaler-autodiscover.yaml
#safe-to-evict 주석추가
$ kubectl patch deployment cluster-autoscaler \
-n kube-system \
-p '{"spec":{"template":{"metadata":{"annotations":{"cluster-autoscaler.kubernetes.io/safe-to-evict": "false"}}}}}'
#deployment에 컨테이너 command를 추가한다.
#deployment 편집 명령어
$ kubectl -n kube-system edit deployment.apps/cluster-autoscaler
#가장 아래 두개의 command 추가(주석설명 부분) 및 클러스터 이름 설정
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
#0으로 스케일링 하는데 문제가 없는지 확인
- --skip-nodes-with-system-pods=false
Cluster Autoscaler의 버전을 쿠버네티스의 버전과 맞게 설정하고, 아래 깃에서 확인 후 해당 버전의 최신 릴리즈로 교체해준다.
(버전 확인: https://github.com/kubernetes/autoscaler/releases)
$ kubectl set image deployment cluster-autoscaler \
-n kube-system \
cluster-autoscaler=k8s.gcr.io/autoscaling/cluster-autoscaler:v1.22.3
3. 동작 확인
오토스케일러의 로그를 확인 하면서 오토스케일링 기능이 잘 도작하는지 확인한다.
#로그 확인
$ kubectl -n kube-system logs -f deployment.apps/cluster-autoscaler
이제 파드의 개수를 급격하게 증가시켜 일부러 pending 상태에 빠지게 함으로 오토스케일링 작동을 테스트 해보자.
#현재 사용중인 노드에 사용가능한 pod 개수를 확인한다.
$ kubectl describe node | grep -E "(^Name:|^Non-terminated)"
Name: ip-10-10-21-15.us-east-2.compute.internal
Non-terminated Pods: (11 in total)
Name: ip-10-10-22-181.us-east-2.compute.internal
Non-terminated Pods: (11 in total)
결과를 보면, 현재 사용중인 t3.small 인스턴스는 각 11개의 파드를 사용할 수 있다.
#pod수를 node 제한 이상으로 배치되도록 증가시킨다.
$ kubectl scale --replicas=10 deployment/<deployment name> -n <namespace>
이후 파드의 상태를 확인 해보면, pending 상태에서 노드가 증가하면서 running으로 정상동작되는 것을 확인 할 수 있다.
$ kubectl get po -n <namespace>
NAME READY STATUS RESTARTS AGE
demo-eks-release-5cc5b9d5bc-54css 1/1 Running 0 7m54s
demo-eks-release-5cc5b9d5bc-qnvpx 1/1 Running 0 7m34s
demo-eks-release-5cc5b9d5bc-xwctx 1/1 Running 0 7m57s
(생략)
참고:
https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/autoscaling.html
'Amazon AWS > EKS' 카테고리의 다른 글
IAM 역할을 수임하도록 Kubernetes 서비스 계정 구성 후 Pod에 권한 적용 (0) | 2023.04.29 |
---|---|
Helm 명령어 (0) | 2023.01.22 |
Configmap, Secret 사용하기 (0) | 2022.10.16 |
Ingress 사용을 위한 AWS Loadbalancer Controller 설치 (0) | 2022.09.04 |
EKS Managed node group 구성 (0) | 2022.08.28 |