Building a sample Guestbook application using ksonnet on Kubernetes

Required

You’ll need:

  • ksonnet
  • running Kubernetes cluster

e.g. `kubectl cluster-info`

kubectl get pods -n kube-system | grep kube-dns

 

Steps are:

1. create sandbox namespace

2. init app

3. create Guestbook UI component – Deployment and Service

4. create Datastore component

 

Details:

1. create a sandbox namespace

kubectl create namespace ks-dev

(More on Kubernetes: Namespaces )

and set it up with:

CURRENT_CONTEXT=$(kubectl config current-context)
CURRENT_CLUSTER=$(kubectl config get-contexts $CURRENT_CONTEXT | tail -1 | awk '{print $3}')
CURRENT_USER=$(kubectl config get-contexts $CURRENT_CONTEXT | tail -1 | awk '{print $4}')

kubectl config set-context ks-dev \
  --namespace ks-dev \
  --cluster $CURRENT_CLUSTER \
  --user $CURRENT_USER

which updates your $KUBECONFIG.

Why? To isolate from existing resources on your cluster. Now, we should see this context when you do:

kubectl config get-contexts

(which is just summarising what’s in your $KUBECONFIG. E.g. `cat $KUBECONFIG`)

 

2. init your app

ks init guestbook --context ks-dev

which creates a directory, guestbook, with all your manifests, etc.

 

3. create Guestbook UI component

First declare 2 Kubernetes API resources: a Deployment and a Service. More info: Kubernetes: Deployments and Services

Generate manifest for Guestbook UI:

ks generate deployed-service guestbook-ui \
  --image gcr.io/heptio-images/ks-guestbook-demo:0.1 \
  --type ClusterIP

deployed-service: pattern for manifest (aka prototype)

guestbook-ui: filename and metadata.name

--image: container image

--type ClusterIP: sets how Service is exposed (other options: NodePort or LoadBalancer)

Then, to view this app:

  # Set up an API proxy so that you can access the guestbook-ui service locally
  kubectl proxy > /dev/null &
  KC_PROXY_PID=$!
  SERVICE_PREFIX=http://localhost:8001/api/v1
  GUESTBOOK_URL=$SERVICE_PREFIX/namespaces/ks-dev/services/guestbook-ui/proxy/

  # Check out the guestbook app in your browser
  open $GUESTBOOK_URL

A few gotchas:

1. i/o timeout

kubectl proxy > /dev/null
log.go:172] http: proxy error: dial tcp 192.168.99.100:8443: i/o timeout

is ‘cos you need to start your cluster. e.g. minikube start

2. bind: address already in use

kubectl proxy > /dev/null &

F1109 16:28:11.685303 72363 proxy.go:158] listen tcp 127.0.0.1:8001: bind: address already in use

is ‘cos kubectl proxy is already running. You can kill it with: `killall kubectl`

or just reload your URL.

 

4. create Datastore component

Available prototypes:

ks prototype list

Packages available:

ks pkg list

Install:

ks pkg install incubator/redis@master

and should now see it installed, plus the prototypes available. i.e. when you do:

ks prototype list

ks pkg list

 

See what parameters are required:

ks prototype describe redis-stateless

and generate:

ks generate redis-stateless redis

 

View YAML

ks show default

and deploy:

ks apply default

(can use --dry-runto see summary)

 

 

https://ksonnet.io/docs/tutorial/guestbook/

 

Use ksonnet to generate Kubernetes configurations from Helm Charts

What is ksonnet?

A CLI-supported framework for extensible Kubernetes configurations

https://ksonnet.io/

 

ksonnet uses the jsonnetlanguage.

https://jsonnet.org/

Nice that it can eliminate duplication with object-orientation.

More info – see Using jsonnet .
But what IS ksonnet?

Say you want to install an application on Kubernetes. Here’s how you could do it:

  1. kubectl – which quickly gets  complex when you have more than a basic app so you’d use something like helm
  2. helm – which simplifies stuff but you still get a ton of YAML files which is where ksonnet comes in

See this tutorial on building a sample application (Guestbook) using ksonnet on Kubernetes.

 

https://ksonnet.io/docs/examples/helm/