This project helps you create a cluster with idle nodes ready to deploy new workloads.
You need to create a Linode token to access the API:
linode-cli profile token-create
export LINODE_TOKEN=<insert the token here># Create the cluster
terraform -chdir=01-clusters init
terraform -chdir=01-clusters apply -auto-approve
# Label the node, install KEDA + Prometheus
terraform -chdir=02-setup init
terraform -chdir=02-setup apply -auto-approve
# Scale to 2 nodes
linode-cli lke pool-update <cluster id> <pool id> --count 2 # cluster 1
# # Disable scaling down (you can't label nodes in LKE)
# kubectl annotate node <node1> cluster-autoscaler.kubernetes.io/scale-down-disabled=true
# kubectl annotate node <node1> cluster-autoscaler.kubernetes.io/scale-down-disabled=true
# Cleanup
terraform -chdir=02-setup destroy -auto-approve
terraform -chdir=01-clusters destroy -auto-approveWhy scale to 3 nodes after the first step?
This is to ensure that all LKE's controllers end up in the same node, and you can uniquely tag that node.
Make sure that your kubectl is configured with the current kubeconfig file:
export KUBECONFIG="${PWD}/kubeconfig"The execute:
kubectl apply -f 03-demo-cron/01-podinfo.yamlAmend the time to be 1 minute in the future.
Submit the ScaledObject:
kubectl apply -f 03-demo-cron/02-scaled-object.yamlkubectl proxy --www=./dashboardMake sure that your kubectl is configured with the current kubeconfig file:
export KUBECONFIG="${PWD}/kubeconfig"Then execute:
kubectl apply -f 04-demo-proactive/01-podinfo.yamlWhen ready, observe the node scaling up with:
kubectl scale deployment/podinfo --replicas=5The total scaling time for the 5th pod should take ~2m.
Scale back to 1 and submit the placeholder pod with:
kubectl scale deployment/podinfo --replicas=1
kubectl apply -f 04-demo-proactive/02-placeholder.yamlClick on the scale button to scale up to 5. Then show the new node is being provisioned.
kubectl proxy --www=./dashboard --www-prefix=/static &
open http://localhost:8001/staticRepeat the experiment. The total scaling time should go down to ~10s.
Make sure that your kubectl is configured with the current kubeconfig file:
export KUBECONFIG="${PWD}/kubeconfig-hpa"Then execute:
kubectl apply -f 05-demo-hpa/01-rate-limiter.yaml
kubectl apply -f 05-demo-hpa/03-scaled-object.yamlAt this point, you should have at least two nodes. One has four podinfo pods.
Scale your workers to three instances so that you have an empty node.
Retrieve the IP address of the load balancer for Locust with:
kubectl get service locust -o jsonpath='{.status.loadBalancer.ingress[0].ip}'Drive traffic to the instance:
- Number of users: 300
- Concurrent users: 0.4
- Url:
http://podinfo
Repeat the experiment.
kubectl delete -f 05-demo-hpa/03-scaled-object.yaml
kubectl scale deployment/podinfo --replicas=1Wait for the Cluster autoscaler to drain the nodes. By the end, you should have only 2.
Submit the placeholder pod:
kubectl apply -f 05-demo-hpa/placeholder.yamlThe pod stays Pending until the cluster autoscaler creates the third node.
Open Locust and drive the traffic to the deployment with:
- Number of users: 300
- Concurrent users: 0.4
- Url:
http://podinfo
cd app
docker build -t learnk8s/rate-limiter:1.0.0 .
docker push learnk8s/rate-limiter:1.0.0