- Published on
Run Kubernetes (k3s) as a Service Container on Drone CI
- Authors
- Name
- Ruan Bekker
- @ruanbekker
Drone services allow you to run a service container and will be available for the duration of your build, which is great if you want a ephemeral service to test your applications against.
Today we will experiment with services on drone and will deploy a k3s (a kubernetes distribution built by rancher) cluster as a drone service and interact with our cluster using kubectl.
I will be using multiple pipelines, where we will first deploy our "dev cluster", when it's up, we will use kubectl to interact with the cluster, once that is done, we will deploy our "staging cluster" and do the same.
This is very basic and we are not doing anything special, but this is a starting point and you can do pretty much whatever you want.
What is Drone
If you are not aware of Drone, Drone is a container-native continious deliver platform built on Go and you can check them out here: github.com/drone
Setup Gitea and Drone
If you don't have the stack setup, have a look at this post where I go into detail on how to get that setup.
Create your Git Repo
Go ahead and create a git repo, you can name it anything, then it should look something like this:
Create a drone configuration, .drone.yml
my pipeline will look like this:
---
kind: pipeline
type: docker
name: dev
platform:
os: linux
arch: amd64
steps:
- name: wait-for-k3s
image: ruanbekker/build-tools
commands:
- sleep 30
- name: prepare-k3s-kubeconfig
image: alpine
volumes:
- name: k3s-kubeconfig
path: /k3s-kubeconfig
detach: false
commands:
- sed -i -e "s/127.0.0.1/k3s/g" /k3s-kubeconfig/kubeconfig.yaml
- name: test-kubernetes
image: ruanbekker/kubectl
volumes:
- name: k3s-kubeconfig
path: /tmp
environment:
KUBECONFIG: /tmp/kubeconfig.yaml
commands:
- kubectl get nodes -o wide
services:
- name: k3s
image: rancher/k3s:v0.9.1
privileged: true
command:
- server
environment:
K3S_KUBECONFIG_OUTPUT: /k3s-kubeconfig/kubeconfig.yaml
K3S_KUBECONFIG_MODE: 777
volumes:
- name: k3s-kubeconfig
path: /k3s-kubeconfig
ports:
- 6443
volumes:
- name: k3s-kubeconfig
temp: {}
---
kind: pipeline
type: docker
name: staging
platform:
os: linux
arch: amd64
steps:
- name: wait-for-k3s
image: ruanbekker/build-tools
commands:
- sleep 30
- name: prepare-k3s-kubeconfig
image: alpine
volumes:
- name: k3s-kubeconfig
path: /k3s-kubeconfig
detach: false
commands:
- sed -i -e "s/127.0.0.1/k3s/g" /k3s-kubeconfig/kubeconfig.yaml
- name: test-kubernetes
image: ruanbekker/kubectl
volumes:
- name: k3s-kubeconfig
path: /tmp
environment:
KUBECONFIG: /tmp/kubeconfig.yaml
commands:
- kubectl get nodes -o wide
services:
- name: k3s
image: rancher/k3s:v0.9.1
privileged: true
command:
- server
environment:
K3S_KUBECONFIG_OUTPUT: /k3s-kubeconfig/kubeconfig.yaml
K3S_KUBECONFIG_MODE: 777
volumes:
- name: k3s-kubeconfig
path: /k3s-kubeconfig
ports:
- 6443
volumes:
- name: k3s-kubeconfig
temp: {}
depends_on:
- dev
In this pipeline you can see that the staging pipeline depends on dev, so dev pipeline will start by creating the k3s service container, once its up I am using a step just to sleep for 30 seconds to allow it to boot.
Then I have defined a volume that will be persistent during the build time, which we will use to dump our kubeconfig file and update the hostname of our kubernetes endpoint. Once that is done our last step will set that file to the environment and use kubectl to interact with kubernetes.
Once our dev pipeline has finished, our staging pipeline will start.
Activate the Repo in Drone
Head over to drone on port 80
and activate the newly created git repo (and make sure that you select "Trusted") and you will see the activity feed being empty:
Commit a dummy file to git and you should see your pipeline being triggered:
Once your pipeline has finished and everything succeeded, you should see the output of your nodes in your kubernetes service container:
As I mentioned earlier, we are not doing anything special but service containers allows us to do some awesome things.
Thank You
Thanks for reading, if you like my content, feel free to check out my website, and subscribe to my newsletter or follow me at @ruanbekker on Twitter.
- Linktree: https://go.ruan.dev/links
- Patreon: https://go.ruan.dev/patreon