Sling Academy
Home/DevOps/How to Run Serverless Functions on Kubernetes with KNative

How to Run Serverless Functions on Kubernetes with KNative

Last updated: January 30, 2024

Introduction

Serverless architecture has emerged as a powerful way to deploy applications without worrying about managing servers. Kubernetes has become the go-to solution for container orchestration but traditionally does not provide native serverless capabilities. Enter KNative, a Kubernetes-based platform that provides a set of components to build, deploy, and manage modern serverless workloads. In this tutorial, we’ll walk through setting up KNative on Kubernetes and deploying serverless functions.

Setting Up Your Kubernetes Cluster

Before installing KNative, make sure you have a Kubernetes cluster running. You can set up a cluster on a cloud provider or run a local cluster using tools like Minikube or Kind. Once your Kubernetes cluster is ready, check that it’s operational with:

kubectl get nodes

This should return a list of the available nodes in your cluster.

Installing KNative

To install KNative, you will need to install the Serving and Eventing components that KNative provides. First, install Istio, which is a service mesh that KNative uses for routing and managing traffic:

istioctl install --set profile=demo

Monitor the installation progress with:

kubectl get pods --namespace istio-system

Once Istio is up and running, apply the KNative Serving and Eventing CRDs, and the core YAML files from the KNative release:

kubectl apply -f https://github.com/knative/serving/releases/download/v0.26.0/serving-crds.yaml
kubectl apply -f https://github.com/knative/serving/releases/download/v0.26.0/serving-core.yaml
kubectl apply -f https://github.com/knative/eventing/releases/download/v0.26.0/eventing-crds.yaml
kubectl apply -f https://github.com/knative/eventing/releases/download/v0.26.0/eventing-core.yaml

Check that KNative components are running with:

kubectl get pods --namespace knative-serving
kubectl get pods --namespace knative-eventing

Writing Your First Serverless Function

With KNative installed, you’re ready to deploy serverless functions. Here’s a simple Hello World example in Python:

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello World!'

if __name__ == '__main__':
    app.run(debug=True)

Save this file as helloworld.py. Create a Dockerfile to containerize this application:

FROM python:3.7-slim
COPY . /app
WORKDIR /app
RUN pip install Flask==1.1.2
CMD ["python", "helloworld.py"]

Build and push the image to a registry that your Kubernetes cluster can access.

Deploying the Function with KNative

Next, create a KNative service definition in YAML:

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: helloworld-python
  namespace: default
spec:
  template:
     spec:
       containers:
         - image: /helloworld-python:v1

Replace <image-registry> with the location of your docker image. Use kubectl to deploy this service:

kubectl apply -f helloworld-service.yaml

In a few moments, KNative will create a route, a configuration, and a new revision for your service. You can check the status with:

kubectl get ksvc

Scaling and Managing Workloads

One of the key features of KNative is its ability to automatically scale workloads. Explore the auto-scaling capabilities by simulating traffic to your service:

for i in {1..100}; do curl http://helloworld-python.default.example.com; done

Observe how KNative scales the number of pods up and down based on demand thanks to its built-in autoscaler. Use the following command to see the number of replicas:

kubectl get pods

Advanced Usage: Event-Driven Architecture

KNative Eventing enables you to build an event-driven architecture. Here’s how you can set up a simple event source that emits events to your service:

Create an event source sending periodic events:

apiVersion: sources.knative.dev/v1beta2
kind: PingSource
metadata:
  name: hello-events
spec:
  schedule: "*/1 * * * *"
  jsonData: '{"message": "Hello world!"}'
  sink:
    ref:
      apiVersion: serving.knative.dev/v1
      kind: Service
      name: helloworld-python

Apply with kubectl to create the PingSource:

kubectl apply -f ping-source.yaml

Debugging and Monitoring

Monitor and troubleshoot your KNative services by checking logs with:

kubectl logs --selector=serving.knative.dev/service=helloworld-python --tail=50

Conclusion

This tutorial has outlined the basic steps to get started with KNative on Kubernetes. We’ve demonstrated how to deploy and manage serverless functions, from a simple

Next Article: How to Use Kubernetes with Elastic Stack for Logging and Analysis

Previous Article: How to Use Kubernetes with Istio for Service Mesh

Series: Kubernetes Tutorials

DevOps

You May Also Like

  • How to reset Ubuntu to factory settings (4 approaches)
  • Making GET requests with cURL: A practical guide (with examples)
  • Git: What is .DS_Store and should you ignore it?
  • NGINX underscores_in_headers: Explained with examples
  • How to use Jenkins CI with private GitHub repositories
  • Terraform: Understanding State and State Files (with Examples)
  • SHA1, SHA256, and SHA512 in Terraform: A Practical Guide
  • CSRF Protection in Jenkins: An In-depth Guide (with examples)
  • Terraform: How to Merge 2 Maps
  • Terraform: How to extract filename/extension from a path
  • JSON encoding/decoding in Terraform: Explained with examples
  • Sorting Lists in Terraform: A Practical Guide
  • Terraform: How to trigger a Lambda function on resource creation
  • How to use Terraform templates
  • Understanding terraform_remote_state data source: Explained with examples
  • Jenkins Authorization: A Practical Guide (with examples)
  • Solving Jenkins Pipeline NotSerializableException: groovy.json.internal.LazyMap
  • Understanding Artifacts in Jenkins: A Practical Guide (with examples)
  • Using Jenkins with AWS EC2 and S3: A Practical Guide