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:

1 package main 2 3 import ( 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 12 func 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

" , 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:

1 git clone git@github.com:banzaicloud/kurun.git 2 cd kurun 3 # Download the dependencies, this is just a one-time step to get the k8s libraries 4 go get ./... 5 ./kurun test.go 6 Sending build context to Docker daemon 31.05MB 7 Step 1/2 : FROM alpine 8 ---> 3fd9065eaf02 9 Step 2/2 : ADD main / 10 ---> 0f4ee24ec5ea 11 Successfully built 0f4ee24ec5ea 12 Successfully tagged kurun:latest 13 [ /main ] 14 List 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.