Resource Adaptive Proxy (RAP) enhances load balancing by periodically monitoring the resource and network status of each pod and worker node in a K8s cluster. It prioritizes local handling of requests and, if the local node is overloaded, intelligently forwards requests to the best-performing node in the cluster, considering resource availability. Experimental results demonstrate that RAP significantly improves throughput and reduces request latency compared to K8s' default load-balancing mechanism.
For knowing more about RAP, refer to https://www.mdpi.com/1424-8220/22/8/2869.
There are some prerequisites for adding RAP to your cluster. For RAP to work, you need to enable the userspace
mode. Now, the userspace
mode is deprecated in Kubernetes v1.23, therefore, we are using Kubernetes 1.21.10. Also, install Golang in your workstation.
- Create 3 nodes with 1 master node and 2 worker nodes
- We have used GCP for creating the instances at different locations and used the provided terraform code for launching the instances. To use the terraform commands:
cd infra/ cp tfvars.example terraform.tfvars
- You need to download a service account key from GCP and set its path in the
gcp_svc_key
variable in theterraform.tfvars
file. Also, you need to set the thegcp_project
andgcp_svc_email
variables in theterraform.tfvars
file. Then run the following commands:terraform init terraform plan terraform apply
- Launch the K8s cluster with kubeadm.
- We have used GCP for creating the instances at different locations and used the provided terraform code for launching the instances. To use the terraform commands:
- Now build the
kube-proxy
with the RAP code- Go ahead and clone the
release-1.21
being checked out.git clone --branch release-1.21 https://github.com/kubernetes/kubernetes.git
- change the code at
pkg/proxy/userspace/roundrobin.go
with the code provided atrap.go
- Now build the
kube-proxy
with the command at the root of the repositorymake kube-proxy
- Now build the docker image with the new kube-proxy.
- Now let's go ahead and build the new docker image with the command using the provided
Dockerfile
docker build -t <your-docker-hub-username>/kube-proxy-rap:v1.21.10 .
You need to run this command at the location where both
Dockerfile
and builtkube-proxy
are present. Take a look at the Dockerfile for better understanding. - push the new docker image to the hub so that later it can be pulled by our k8s cluster
docker push <your-docker-hub-username>/kube-proxy-rap:v1.21.10
- Now let's go ahead and build the new docker image with the command using the provided
- Now replace the image of
kube-proxy
that is being used by the daemon sets created by kubeadmkubectl edit daemonset kube-proxy -n kube-system kubectl rollout restart daemonset kube-proxy -n kube-system
- Now this will spin up our new kube-proxy with rap enabled, and make sure that
userspace
mode is enabled. Refer to this to know how to change it.
- Go ahead and clone the