A Kubernetes native shell experience:
The basic idea behind
kn is to use the fact that pods in Kubernetes are modelled after machines. That is, the apps running in containers in the pod can communicate with each other via
localhost and transfer data via volumes they can mount into their own filesystem hierarchy as they see fit.
So, imagine you want to try something out real quick? Do a short iteration using a scripting language such as Python, Ruby, or Node.js? Might want to jump on a container to debug something in-cluster? Run a quick load test? Then,
kn is for you: it offers a collection of shell functions allowing you to quickly launch a pod, jump into it and have the code and data available you need to carry out your task.
Note that this tool is meant to be used in dev and test environments. Use at your own risk.
Simply Git clone or download this repo from the release page, and copy
kn*.sh somewhere on your path. If you're super fancy, you can set an alias like so: (since I moved the script to
kn in the Bash shell v3.2 on macOS and Linux. Note that in order to work
kn requires you to have
kubectl installed and configured. If you also want to use the (optional) feature to expose an environment to the public, you need to have ngrok installed and configured.
The following environment variables are used (set global or per invocation):
KN_BASE_IMAGE… set the base image to use; defaults to
KN_SYNC… if set to
true, the content of the current directory will be copied into the pod at
/tmp/work; defaults to
KN_POLICY… if set to
public, services will be made available on the public Web using
ngrok; defaults to
KN_MODE… if set to
daemon, the environment is detached and we assume there's some kind of networked service running; defaults to
The following commands are available:
up [NAME] [PORT]… creates environment, copies files of current directory unless disabled by
connect NAME… puts you into the running environment.
down NAME… deletes environment, removes all resources associated with it.
publish NAME PORT… publishes the daemonized environment
NAMEby using port-forwarding of
PORTin the environment (assuming something serves on this port in the container) to port
9898locally, and, if enabled by
KN_POLICY, makes it also publicly available using
ls… lists all resources manged by
Launching an interactive environment with
## launch interactive environment: $ kn up ....... Copied content of /Users/mhausenblas/tmp to /tmp/work in the environment The environment [sandbox] is now ready! ## list all environments: $ kn ls NAME SINCE sandbox 2018-10-22T10:16:13Z ## jump into the environment: $ kn connect connecting to sandbox-64dc6d6bf9-s6gzjsh-4.2# sh-4.2# sh-4.2# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 10:16 ? 00:00:00 sleep 86400 root 27 0 0 10:17 pts/0 00:00:00 sh root 36 27 0 10:17 pts/0 00:00:00 ps -ef sh-4.2# exit exit ## destroy the environment: $ kn down The environment [sandbox] has been destroyed, all data is gone the way of the dodo
Publishing a daemonized environment using the container image
quay.io/mhausenblas/pingsvc:2 that serves on port
## launch as daemonized env: $ KN_BASE_IMAGE=quay.io/mhausenblas/pingsvc:2 KN_MODE=daemon kn up psvc 8888 The daemonized environment [psvc] is now ready! To publish your environment, do: kn publish psvc 8888 ## now make it publicly available using ngrok: $ KN_POLICY=public kn publish psvc 8888 ngrok by @inconshreveable Session Status online Account Michael Hausenblas (Plan: Pro) Version 2.2.8 Region United States (us) Web Interface http://127.0.0.1:4040 Forwarding http://0cf727cf.ngrok.io -> localhost:9898 Forwarding https://0cf727cf.ngrok.io -> localhost:9898 Connections ttl opn rt1 rt5 p50 p90 1 0 0.01 0.00 0.30 0.30 HTTP Requests ------------- GET /ping 200 OK ## in a second terminal session, check if we can get to the service: $ curl localhost:9898/ping pong $ curl http://0cf727cf.ngrok.io/ping pong ## now we can get rid of the environment: $ kn down psvc The environment [psvc] has been destroyed, all data is gone the way of the dodo