Hi gengz, di artikel kali ini kita akan belajar bagaimana cara membuat Autoscaling EKS dengan menggunakan Pulumi
Berikut adalah source dari code yang akan kita pakai
https://github.com/ludesdeveloper/pulumi-managed-nodes-autoscale-eks
Note : Untuk requirement tools, bisa dibaca langsung di githubnya ya gengz
Membuat EKS dengan Pulumi
Mari kita clone dulu reponya

git clone https://github.com/ludesdeveloper/pulumi-managed-nodes-autoscale-eks.git
Change directory

cd pulumi-managed-nodes-autoscale-eks
Mari install dependency yang kita butuhkan

npm install
Mari kita inisiasi stack untuk puluminya ya gengz

pulumi stack init
Mari kita config dulu region yang akan kita pakai, kebetulan saya memakai ap-southeast-1

pulumi config set aws:region ap-southeast-1
Yuk kita provision EKS nya

pulumi up --yes
Saat cluster sudah ready, mari kita copy kubeconfig ke directory milik kita, silahkan sesuaikan ya gengz

pulumi stack output kubeConfig > ~/.kube/config
Mari kita check dulu gengz, nodes yang sudah kita buat

kubectl get nodes
Node sudah ready, mari kita lakukan inisisasi untuk autoscaling (Anda dapat melihat script apa saja yang di eksekusi, dan melakukan copy paste manual untuk bisa memahaminya)

./init-autoscale-cluster.sh
Testing Autoscaling
Mari kita apply dulu, deployment yang sudah disediakan

kubectl apply -f nginx-deployment.yaml
kubectl get pods
Kita bisa lihat, 3 pod nginx sudah dibuat, dan kondisi nodes kita saat ini adalah hanya 1 node. Mari kita lakukan scaling terhadap pod

kubectl scale deployment/nginx-deployment --replicas=20
Disini kita bisa lihat, pod di scale sampai 20, dan ada pending pod, mari kita check yuk yang pending

Bisa kita lihat bahwa node memiliki pod yang terlalu banyak, mari kita lihat proses yang terjadi dibawah ini


Bisa kita lihat bahwa EKS secara otomatis request untuk penambahan nodes, kita tunggu sebentar ya gengz, sampai ready.

Mantap, nodes sudah ready, dan scale up sudah berhasil
Sekarang mari kita lakukan scale down

kubectl scale deployment/nginx-deployment --replicas=3
Proses scale down membutuhkan waktu, mari kita tunggu sejenak ya gengz, ngopi dulu
Kita bisa menggunakan command berikut, untuk melihat log
kubectl -n kube-system logs -f deployment.apps/cluster-autoscaler
Bila kita perhatikan terus menerus log, kita akan mendapat kan info seperti dibawah

Bisa kita lihat, bahwa cluster kubernetes melakukan evaluasi, dan berniat untuk memindahkan pod, juga kita lihat cluster kubernetes memberikan kemungkinan untuk menghapus node

Saat ini kita bisa melihat, bahwa semua pod masih di ip 178.213, mari kita tunggu dulu ya gengz pergerakannya, seharusnya membutuhkan waktu kurang lebih 10 menit. Temen temen bisa coba mencari log berikut, untuk bisa melihat waktunya
I0131 07:06:21.428797 1 scale_down.go:828] ip-10-0-178-213.ap-southeast-1.compute.internal was unneeded for 6m32.140767961s
Setelah 10 menit, kita akan melihat perubahan terhadap nodes

Dan bila kita perhatikan instances di EC2, kondisi instance juga sudah terminated

Wow, selamat ya gengz, autoscaling kita sudah berhasil, baik yang scale up, ataupun scale down
Bedah Code
Code utama ada di dalam index.ts, mari kita check apa yang kita bisa bahas
const cluster = new eks.Cluster("my-cluster", {
skipDefaultNodeGroup: true,
vpcId: vpc.id,
publicSubnetIds: vpc.publicSubnetIds,
privateSubnetIds: vpc.privateSubnetIds,
instanceRoles: [role],
createOidcProvider: true
});
Saya menggunakan pulumi crosswalk untuk tutorial ini, mempermudah kita untuk membuat cluster eks, 1 hal yang saya ingin tekankan adalah createOidcProvider, property tersebut sangat mempermudah pada saat nanti akan menggunakan autoscaling, cluster secara otomatis membuat Oidc, dan kita tinggal mengambil nilai outputnya
const managedNodeGroup = eks.createManagedNodeGroup("my-cluster-ng", {
cluster: cluster,
nodeGroupName: "aws-managed-ng1",
nodeRoleArn: role.arn,
labels: { "preemptible": "true" },
tags: { "org": "pulumi" },
capacityType: "SPOT",
instanceTypes: ["t2.medium"],
scalingConfig: {
desiredSize: 1,
maxSize: 3,
minSize: 1,
},
}, cluster);
Di tutorial ini saya juga menggunakan “managed” node group, dengan capacityType “SPOT”, yang berarti kita menggunakan spot instance untuk node group. scalingConfig juga bisa kita sesuaikan dengan kebutuhan
Bersih Bersih
Mari kita hapus semua service yang sudah kita buat

pulumi destroy --yes
Setelah service di destroy, mari kita hapus stack yang kita buat

pulumi stack rm dev
Semoga bermanfaat ya gengz 🙂
Tinggalkan Balasan