Quarkus - Deploying Knative Application to Kubernetes or OpenShift
This guide covers:
The deployment of a serverless application to Kubernetes using Knative.
This guide takes as input the application developed in the native application guide. So, you should have been able to package your application as a binary executable, copied it in a Docker image and run this image.
Depending on whether you are a bare Kubernetes user or an OpenShift user, pick the section you need. The OpenShift section leverages OpenShift build and route features which are not available in bare Kubernetes.
Solution
We recommend to follow the instructions in the next sections and build the application step by step. However, you can go right to the completed example.
Clone the Git repository: git clone https://github.com/quarkusio/quarkus-quickstarts.git
, or download an archive.
The solution is located in the getting-started-knative
directory.
Set up Kubernetes Cluster
The following script will start minikube and deploy Knative.
./bin/start-minikube.sh
eval $(minikube docker-env) (1)
1 | Make the current Docker context to be that of minikube |
Set up Nexus(Optional)
Nexus is used for caching maven artifacts so that Apache Maven builds are faster.
kubectl apply -f k8s/nexus.yaml
Wait for some time to have Nexus initialize and run. You can watch the status via kubectl get pods -w
, use Ctrl+c to terminate the watch.
Why Skaffold ?
As vanilla Kubernetes does not have an easy and developer friendly way to build and deploy application to a local cluster like minikube, without the need to push the image to external container registry. We will be using Skaffold to help us build and deploy the Quarkus application onto Kubernetes.
Build and deploy application
The container image will not be pushed to a remote container registry, and hence the container image url has to be |
To run Knative Quarkus applications, we need to use the multi stage docker build; to build the Quarkus application container image and use it in Kubernetes application deployment.
The following command start a one time deployment of Quarkus application and runs starts the Knative service after successful container image build.
If you want to deploy a Quarkus JVM image (using HotSpot), then run the following command before running Skaffold:
If you want to deploy a Quarkus Native executable image (using GraalVM), then run the following command before running Skaffold:
It is very important to note that the Dockerfile in |
skaffold run
As it will take a few minutes for the build and deployment to be completed you can watch the status using:
watch kubectl get pods
A successful Knative service deployment will show the following pods in the current namespace:
NAME READY STATUS AGE
greeter-deployment-5749cc98fc-gs6zr 2/2 Running 10s
The deployment name could differ in your environment. |
Once the Knative service is successfully running, you can call it using the script ./bin/call.sh
, which should return a response like hello
. Allowing it to idle for approximately 60-65 seconds - that is without any further requests -, you will see it automatically scales down to zero pods.
Going further
This guide covered the deployment of a Quarkus application as Knative application on Kubernetes However, there is much more, and the integration with these environments has been tailored to make Quarkus applications execution very smooth. For instance, the health extension can be used for health check; the configuration support allows mounting the application configuration using config map, the metric extension produces data scrapable by Prometheus and so on.