K3s Knative Ubuntu Raspberry Pi
Knative is a super exciting solution for serverless and event driven applications.
Personally, I have been using it as a part of my inner loop
development.
I can deploy dozens of workloads.
All scaled down to zero when they aren't being used.
All responding and starting up quickly when they are needed.
I ran into a couple of problems with Envoy on Raspberry Pi OS.
After investigating, it is a known issue in the Raspberry Pi OS kernel.
In order to keep going forward with my project I had to choose between fixing the kernel or trying Ubuntu.
This is an overview of how to get Knative Serving working on a Raspberry Pi device with K3s and Ubuntu.
Install Ubuntu Server
Use RPI Imager.
Select Ubuntu Server 22.10 64-bit
from the list of other distributions.
Boot the new image.
I was happy to see that SSH and the default user were configured as expected by using the advanced settings options.
Upgrade the stuff
# Grab the latest repository info sudo apt update # Install one prerequisite package that isn't installed by default sudo apt install linux-modules-extra-raspi -y # Upgrade everything that can be upgraded sudo apt dist-upgrade -y
Fix cgroup
# Add this to the beginning of /boot/firmware/cmdline.txt # cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory sudo nano -w /boot/firmware/cmdline.txt
Reboot after making this change.
sudo shutdown -r now
Install k3s via k3sup
From my laptop, not one of the Raspberry Pi nodes, run k3sup, it's super easy.
If you haven't figured it out by now, I'm a big fan of k3sup.
export CONTROL_NODE_IP=10.0.0.10 # Disable Traefik because we will use kourier for knative k3sup install --ip $CONTROL_NODE_IP --user pi --k3s-extra-args '--disable traefik' --merge --local-path ~/.kube/config --context cluster00 # Knative-Serving with Kourier works on a single Raspberry Pi 4 with 8GB # Optionally add other nodes k3sup join --ip 10.0.0.11 --server-ip $CONTROL_NODE_IP --user pi k3sup join --ip 10.0.0.12 --server-ip $CONTROL_NODE_IP --user pi
Deep breath
This is where I struggled with how to deliver this example.
The Knative install documentation is awesome.
I've been through it dozens of times!
I tried to simplify this for you.
I want to give you the 'easy button' experience.
I created a repository with all the YAML you need to deploy Knative Serving to this K3s cluster.
Knative Serving with Kourier
git clone https://github.com/dashaun/knative-serving-raspberry-pi cd knative-serving-raspberry-pi/operator-serving-kourier # Use the `default` namespace in the Kubernetes cluster kubectl config set-context --current --namespace=default # Deploy the Knative operator kubectl apply -f operator.yaml # Check the deployment status kubectl get deployment knative-operator
Continue when
Ready
status is1/1
NAME READY UP-TO-DATE AVAILABLE AGE knative-operator 1/1 1 1 19h
# Install Knative Serving custom resource and Kourier kubectl apply -f knative-serving.yaml # Check the custom resource status kubectl get KnativeServing knative-serving -n knative-serving
Continue when
READY
isTrue
NAME VERSION READY REASON knative-serving 1.8.0 True
# Check the deployment status kubectl get deployment -n knative-serving
Continue when
READY
are all1/1
NAME READY UP-TO-DATE AVAILABLE AGE activator 1/1 1 1 23m autoscaler 1/1 1 1 23m controller 1/1 1 1 23m domain-mapping 1/1 1 1 23m domainmapping-webhook 1/1 1 1 23m autoscaler-hpa 1/1 1 1 23m 3scale-kourier-gateway 1/1 1 1 23m webhook 1/1 1 1 23m net-kourier-controller 1/1 1 1 23m
SSLIP.IO and a Spring Boot 3 native
application
# Install default domain kubectl apply -f serving-default-domain.yaml # Deploy a Spring Boot 3 `native` application kubectl apply -f spring-boot-native-pi-service.yaml # Get the address kubectl get ksvc spring-boot-native-pi --output=custom-columns=NAME:.metadata.name,URL:.status.url
NAME URL spring-boot-native-pi http://spring-boot-native-pi.default.10.0.0.10.sslip.io
# Curl the address provided by knative with `/actuator/health` at the end curl http://spring-boot-native-pi.default.default.10.0.0.10.sslip.io/actuator/health
Expected output:
{"status":"UP"}
Summary
With the recent release of Spring Boot 3.0.0, my Raspberry Pi collection has become significantly more interesting.
Knative Serving allows me to deploy dozens of Spring Boot / Spring Cloud workloads to a tiny, low power device, with very exciting capabilities.
Top comments (0)