Keda on EKS allows for unparalleled scaling flexibility, where its easy configuration and strengths regarding infrastructure architecture will be demonstrated in this article
When to use Keda ?
- Your AutoScalling cant handle event driven cenarios
- Need to handle varying levels of traffic
- Need to cara about costs in the EKS cluster
What problem Keda will solve in this case cenario ?
- Event Driven requests to start new pods in eks
- Manage to save costs in stand by pods
How to install keda in eks:
We can download it from here and apply it with:
kubectl apply -f keda-2.13.0-core.yaml
or just execute it like this
kubectl apply --server-side -f https://github.com/kedacore/keda/releases/download/v2.13.0/keda-2.13.0-core.yaml
Making it work in EKS:
Then when it is installed we can go and make an sample Python App
import json
from fastapi import FastAPI
import boto3
#Sample Python App for getting queue messages
app = FastAPI()
def getQueue(queue: str):
sqs = boto3.resource('sqs', region_name='')
# Get the queue
print(queue)
queue = sqs.get_queue_by_name(QueueName='')
QMessage = []
for message in queue.receive_messages():
QMessage.append(message.body)
message.delete()
return QMessage
@app.get("/getQueue")
def root(queue: str):
returnList = getQueue(queue)
return {"queue Message list": returnList}
@app.get("/ping")
def ping():
return {"status": "ok"}
Now lets make an Deployment file for it:
apiVersion: apps/v1
kind: Deployment
metadata:
name: python-app
namespace: keda
spec:
selector:
matchLabels:
app: python-app
replicas: 1
template:
metadata:
labels:
app: python-app
spec:
serviceAccount: keda-operator
containers:
- name: python-app
image: ecr_url
command: ["uvicorn"]
args : ["app.main:app", "--host", "0.0.0.0", "--port", "80"]
resources:
limits:
cpu: "1"
memory: "2Gi"
requests:
cpu: "1"
memory: "2Gi"
ports:
- containerPort: 80
Then add the Service Account for permissions:
apiVersion: v1
kind: ServiceAccount
automountServiceAccountToken: true
metadata:
labels:
app.kubernetes.io/name: keda-operator
app.kubernetes.io/part-of: keda-operator
app.kubernetes.io/version: main
name: keda-operator
namespace: keda
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::accountId:role/KedaSqsExecutionRole
And then add the scaled object for the SQS Queue and the Auth Trigger:
apiVersion: keda.sh/v1alpha1
kind: TriggerAuthentication
metadata:
name: keda-trigger-auth-aws-credentials
namespace: keda
spec:
podIdentity:
provider: aws-eks
---
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: aws-sqs-queue-scaledobject
namespace: keda
spec:
minReplicaCount: 0 #-> min pods that will be when there is smt in queue
maxReplicaCount: 5 #-> max pods
pollingInterval: 10
cooldownPeriod: 25
scaleTargetRef:
name: python-app
triggers:
- type: aws-sqs-queue
authenticationRef:
name: keda-trigger-auth-aws-credentials
metadata:
queueURL: sqs_queue_url
queueLength: "1"
awsRegion: "aws_regiion"
identityOwner: operator
Conclusion
Keda gives a lot of flexibility when event driven is needed, because of it various built in scalers, like in this article with AWS SQS, and could scale in various other cenarios, as example, with AWS DynamoDB, granting a cost friendly way to handle EKS needs to scale with your business.
Top comments (0)