AWS EKS Node AutoScale
Tags: aws, k8s, devops
Published: 2023-10-10 11:27:09

Bu yazıda AWS'te Node Auto Scale için yapılması gereken tanımlamalar ve işlemlere değineceğiz.

Node Auto Scale özelliğinin çalışabilmesi için AWS’te bir takım izinlerin tanımlanması gerekiyor aksi takdirde node autoscale işlemi gerçekleşmeyecektir.

İlk olarak autoscale için aşağıdaki gibi bir Policy oluşturulması gerek. **NodeAutoScalerPolicy** adını verebiliriz.

```
{
    "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"
        }
    ]
}
```

> Burada verilen permissionlar kullandığınız Kubernetes versiyonuna göre değişiklik gösterebilir, uyumsuzluk durumu autoscaler podunun loglarından incelenebilir birkaç adım ilerde değineceğiz.


İkinci olarak bir Role oluşturmak gerek. Trusted entity olarak Web identity seçip identity provider'ı k8s clusterın OIDC’sini, audience’ı da sts.amazonaws.com olarak seçip devam ediyoruz. Devamındaki sayfada ilk adımda oluşturduğumuz NodeAutoScalerPolicy’i attach ettikten sonra son olarak adını verip Role'ümüzü oluşturuyoruz.
 **AWSServiceRoleForAutoScaling** adını verebiliriz.

Yine Role içinde değiştirmemiz gereken bir yer daha var. AWSServiceRoleForAutoScaling Role'e girip sonrasında aşağıdaki yolu takip ediyoruz.

_Trust relationships > Edit Trust Relationship > json_

`oidc.eks.<AWS-REGION>.amazonaws.com/id/<OIDC-ID>:aud": "sys.amazonaws.com"
`
json içinde bu kısmı aynen aşağıdakiyle değişmemiz gerek.

`oidc.eks.<AWS-REGION>.amazonaws.com/id/<OIDC-ID>:sub": "system:serviceaccount:kube-system:cluster-autoscaler`


Üçüncü olarak [github linkindeki](https://github.com/hybrone/devops/blob/main/nodeAutoScale/autoscaler.yaml) autoscale.yaml dosyasını, istediğimiz cluster’a geçerek apply edeceğiz ama etmeden önce dosyada değiştirmemiz gereken yerler var bunlar:

`<YOUR CLUSTER NAME>` kısmına ilgili cluster adını yazmak ve ServiceAccount objesinin annotations altındaki eks.amazonaws.com/role-arn tanımındaki <YOUR ROLE ARN> kısmına ikinci adımdaki AWSServiceRoleForAutoScaling rolünün arn'ını vermek.

Son olarak da kubernetes versiyonu ile autoscaler versiyonunun aynı majör versiyonda olması önerilmiş yani bizim clusterımız 1.24 ise autoscaler'ın da 1.24.* olması gerekiyor. Versiyon yine linkteki autoscale.yaml dosyasında mevcut oradan değiştirilmesi gerek.

Bu işlemlerden sonra,

`kubectl apply -f autoscale.yaml
`
yapıyoruz ve ne durumdayız kontrol ediyoruz.

`kubectl get pods -n kube-system -l=app=cluster-autoscaler
`
podumuz oluşmuş ya da oluşmamışsa aksiyon alıyoruz.

`kubectl logs -l app=cluster-autoscaler -n kube-system -f
`
Eğer bir sıkıntı varsa yukarıdaki gibi loglara bakıp ne olduğunu görebiliriz ya da sıkıntı yoksa scale up/down durumlarının loglarını izleyebiliriz.


> Kaynakları 1 tane node'un üstünde kullanacak kadar replicalı bir deployment dosyası apply ederseniz, hemen scale up olacaktır. Scale down durumunda cluster'ın node'lara artık ihtiyacı olmadığına ikna olması 10-15 dakika kadar sürüyor siz replicaları azaltsanız da bu sürenin geçmesini beklemelisiniz.

**Kaynaklar**

> [EKS Cluster Auto Scaling (Kubernetes Autoscaler | EKS Cluster Autoscaler | EKS Autoscale Nodes) ](https://www.youtube.com/watch?v=gwmdboC-BtE)
> [EKS Cluster Autoscaler: 6 Best Practices For Effective Autoscaling ](https://cast.ai/blog/eks-cluster-autoscaler-6-best-practices-for-effective-autoscaling/)
> [Cluster-Autoscaler - EKS Best Practices Guides ](https://aws.github.io/aws-eks-best-practices/cluster-autoscaling/)
> https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/aws/README.md 
https://katharharshal1.medium.com/kubernetes-cluster-autoscaling-ca-using-aws-eks-4aab8c89f9a1