During the development of the Pipeline Platform all of its key building blocks such as Pipeline, Hollowtrees and Bank-Vaults have relied on making extensive Kubernetes API calls. Often, we tried a quick K8s API call or ran a small PoC inside a cluster, while also wanting to avoid the usual deployment process. We quickly realized that we needed a shortcut.
There are tools like telepresence that support slightly more complex scenarios. However, for simple hacks they tend toward overkill - require osxfuse, use VPN + ssh to make the network available, etc - whereas, when making a quick and dirty API call, this 21 lines of bash script does the job.
kurun
is like go run
π︎
The go run
command is a very convenient CLI subcommand for executing Golang
code during the development phase. Many of our applications make calls to the Kubernetes API and for a long time we were in need of a utility that could very quickly execute the Go code inside Kubernetes. That’s why we wrote kurun
, a dirty little bash utility, to execute Go code inside Kubernetes with a oneliner:
kurun main.go
It’s that easy.
To see how you can leverage kurun
, letβs try, just as an example, using it to list all the nodes in a Kubernetes cluster:
1package main
2
3import (
4 "fmt"
5 "os"
6
7 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
8 "k8s.io/client-go/kubernetes"
9 "k8s.io/client-go/rest"
10)
11
12func main() {
13 fmt.Println(os.Args)
14
15 config, err := rest.InClusterConfig()
16 if err != nil {
17 panic(err)
18 }
19
20 client, err := kubernetes.NewForConfig(config)
21 if err != nil {
22 panic(err)
23 }
24
25 nodes, err := client.CoreV1().Nodes().List(metav1.ListOptions{})
26 if err != nil {
27 panic(err)
28 }
29
30 fmt.Println("List of Kubernetes nodes:")
31 for _, node := range nodes.Items {
32 fmt.Printf("- %s - %s\n", node.Name, node.Labels)
33 }
34}
Execute the following commands in the CLI, and make sure your kubectl
is pointed to the cluster you would like to use:
1git clone git@github.com:banzaicloud/kurun.git
2cd kurun
3# Download the dependencies, this is just a one-time step to get the k8s libraries
4go get ./...
5./kurun test.go
6Sending build context to Docker daemon 31.05MB
7Step 1/2 : FROM alpine
8 ---> 3fd9065eaf02
9Step 2/2 : ADD main /
10 ---> 0f4ee24ec5ea
11Successfully built 0f4ee24ec5ea
12Successfully tagged kurun:latest
13[/main]
14List of Kubernetes nodes:
15- docker-for-desktop - map[beta.kubernetes.io/arch:amd64 beta.kubernetes.io/os:linux kubernetes.io/hostname:docker-for-desktop node-role.kubernetes.io/master:]
Learn by the code π︎
This project is open source and, of course, available in our GitHub repository.