boi Tutorial
Overview
This article references boi which was rebranded to be ibuilder in May of 2022.
This tutorial will show how to take an existing application (the dradux.com website itself) and deploy it to a kubernetes cluster using boi, a lightweight tool for building and pushing docker images. Deploying an application to k8s can be a daunting task depending on the complexity of your application and the needs therein; however, as this post shows, it can be quick (~30 minutes) and relatively easy if you have the needed components in place.
Key Components
- an application (ready to go)
- a k8s cluster
- an image repository
The Application
For this tutorial I am using the dradux.com website itself as an example. Its source is on gitlab. The app is a nikola based static site. To 'generate' the site you would simply run nikola build
, the built site is located in the output/
directory. This part was easy as it already existed!
The k8s Cluster
Easy, I already had one. If you don't, I suggest looking at Rancher as you can get a k8s cluster set up in minutes.
The Image Repository
I have spent countless hours setting up internal registries, registries inside of k8s, and integrating with external/public registries. If your app is close-sourced this task will take more time and be more difficult. As of late I have started using the registry which comes with a gitlab project as it is free and I do not need to manage the registry. If you want to see one, check our the dradux-site registry.
Dockerizing Your App (if needed)
This is an art in itself and can take on a life of its own. I suggest a little planning before doing this and keep things simple. Your application/code should do the heavy work and docker should be a light wrapper to bundle it all up but some things (old java apps) just wont stay light in my experience. If you need help in dockerizing feel free to contact us!
Dockerizing dradux-site was simple as the site is a static site - just html/javascript/css. No server-side scripting, database, etc. All we need is an --nginx-- lighttpd instance, add the app code and we are ready to go!
Feel free to take a look at the Dockerfile along with its entrypoint.sh (used to run rsyslogd which sends my web logs into a graylog server) and the lighttpd.conf.
That's all it took to dockerize the app!
Add boi Integration
As mentioned before boi is lightweight. To add boi to the project I created the .boi.toml configuration file. That is pretty much it, now you can build your image and push to your image registry.
Build & Push Your First Image
Use boi to build and push an image of the application: boi build --version=1.0.0
. If all goes well you will have version 1.0.0 of your application in the container registry specified.
Deploy to k8s
Before you can deploy to k8s you need to setup your deployment. This can be done in several different ways in k8s, we will use a standard namespaced deployment as an example.
First, create your namespace and then create the deployment:
1apiVersion: v1
2kind: List
3items:
4- apiVersion: apps/v1beta1
5 kind: Deployment
6 metadata:
7 name: dradux-site
8 namespace: dradux-site
9 spec:
10 template:
11 metadata:
12 labels:
13 run: dradux-site
14 spec:
15 containers:
16 - name: dradux-site
17 image: registry.gitlab.com/drad/dradux-site:latest
18 resources:
19 limits:
20 memory: 128Mi
21 cpu: 100m
22 ports:
23 - containerPort: 80
24- apiVersion: v1
25 kind: Service
26 metadata:
27 name: dradux-site
28 namespace: dradux-site
29 labels:
30 run: dradux-site
31 spec:
32 ports:
33 - port: 80
34 selector:
35 run: dradux-site
Notice that the image for the container is set to where we push to with boi - also note we are pulling the 'latest' tag and in boi we have it set to apply the 'latest' tag on build.
Next, create an ingress to route traffic into the service:
1apiVersion: extensions/v1beta1
2kind: Ingress
3metadata:
4 name: default
5 namespace: dradux-site
6spec:
7 rules:
8 - host: dradux.com
9 http:
10 paths:
11 - path: /
12 backend:
13 serviceName: dradux-site
14 servicePort: 80
A standard ingress, we will SSL terminate at a LoadBalancer in front of k8s.
Summary
You should now have the service up and an ingress to catch the traffic inside of k8s. You still have the task of managing the DNS to route dradux.com to the k8s cluster (and SSL termination at a LB if needed) but other than that you should be able to hit your URL and see your site!