From 76af69c8f49d7d4479334d77e22d3fc9790de0eb Mon Sep 17 00:00:00 2001 From: Angus Lees <gus@inodes.org> Date: Fri, 16 Jun 2017 12:44:33 +1000 Subject: [PATCH] Provide guestbook.jsonnet example Update example to use something self-contained. Add diff,delete to the quickstart example --- README.md | 30 ++++++++------ examples/example.libsonnet | 52 +++++++++++++++++++++++++ examples/guestbook.jsonnet | 80 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 150 insertions(+), 12 deletions(-) create mode 100644 examples/example.libsonnet create mode 100644 examples/guestbook.jsonnet diff --git a/README.md b/README.md index bd5edf91..40073234 100644 --- a/README.md +++ b/README.md @@ -37,25 +37,31 @@ avoid an immediate `Killed: 9`. ## Quickstart ```console -# This example uses ksonnet-lib -% git clone https://github.com/ksonnet/ksonnet-lib.git +# Fetch guestbook example +% git clone https://github.com/ksonnet/kubecfg.git +% cd kubecfg -# Set kubecfg/jsonnet library search path. Can also use `-J` args everywhere. -% export KUBECFG_JPATH=$PWD/ksonnet-lib - -# Hello-world ksonnet-lib example -% cd ksonnet-lib/examples/readme +# Set kubecfg/jsonnet library search path to <kubecfg.git>/lib. +# Can also use explicit `-J` args everywhere. +% export KUBECFG_JPATH=$PWD/lib # Show generated YAML -% kubecfg show -o yaml hello-nginx.jsonnet +% kubecfg show -o yaml examples/guestbook.jsonnet # Create resources -% kubecfg update hello-nginx.jsonnet +% kubecfg update examples/guestbook.jsonnet + +# Modify configuration (downgrade gb-frontend image) +% sed -i.bak '\,gcr.io/google-samples/gb-frontend,s/:v4/:v3/' examples/guestbook.jsonnet +# See differences vs server +% kubecfg diff examples/guestbook.jsonnet -# Modify configuration -% sed -ie 's/nginx:1.7.9/nginx:1.13.0/' hello-nginx.jsonnet # Update to new config -% kubecfg update hello-nginx.jsonnet +% kubecfg update examples/guestbook.jsonnet + +# Clean up after demo +% kubecfg delete examples/guestbook.jsonnet +% mv examples/guestbook.jsonnet.bak examples/guestbook.jsonnet ``` ## Features diff --git a/examples/example.libsonnet b/examples/example.libsonnet new file mode 100644 index 00000000..2a02f3bc --- /dev/null +++ b/examples/example.libsonnet @@ -0,0 +1,52 @@ +// This library is intended to support kubecfg examples, and should +// not necessarily be considered recommended jsonnet structure. + +local kubecfg = import "kubecfg.libsonnet"; + +{ + service(name):: { + local this = self, + + apiVersion: "v1", + kind: "Service", + metadata: { + name: name, + labels: { name: name }, + }, + + targetPod_:: error "targetPod_ required in this usage", + spec: { + ports: [{port: p.containerPort} + for p in this.targetPod_.spec.containers[0].ports], + selector: this.targetPod_.metadata.labels, + }}, + + container(name, image):: { + local this = self, + + name: name, + image: kubecfg.resolveImage(image), + + env_:: {}, // key/value version of `env` (hidden) + env: [{name: k, value: this.env_[k]} for k in std.objectFields(this.env_)], + + ports: [], + }, + + deployment(name):: { + local this = self, + + apiVersion: "extensions/v1beta1", + kind: "Deployment", + metadata: { + name: name, + labels: { name: name }, + }, + spec: { + replicas: 1, + template: { + metadata: { labels: this.metadata.labels }, + spec: { + containers: [] + }}}}, +} diff --git a/examples/guestbook.jsonnet b/examples/guestbook.jsonnet new file mode 100644 index 00000000..4fe31ba8 --- /dev/null +++ b/examples/guestbook.jsonnet @@ -0,0 +1,80 @@ +// Simple self-contained example to demonstrate kubecfg. +// This should not necessarily be considered a model jsonnet example +// to build upon. + +// This is a simple port to jsonnet of the standard guestbook example +// https://github.com/kubernetes/kubernetes/tree/master/examples/guestbook +// +// Expects to be run with ../lib in the jsonnet search path: +// ``` +// export KUBECFG_JPATH=$PWD/../lib +// kubecfg update guestbook.jsonnet +// # poke at $(minikube service --url frontend), etc +// kubecfg delete guestbook.jsonnet +// ``` + +local example = import "example.libsonnet"; + +{ + frontend_deployment: example.deployment("frontend") { + spec+: { + replicas: 3, + template+: { + spec+: { + containers: [ + example.container( + "php-redis", "gcr.io/google-samples/gb-frontend:v4" + ) { + resources: { + requests: { cpu: "100m", memory: "100Mi" }, + }, + env_: { + GET_HOSTS_FROM: "dns", + }, + ports: [{containerPort: 80}], + }]}}}}, + + frontend_service: example.service("frontend") { + targetPod_: $.frontend_deployment.spec.template, + }, + + redis_master_deployment: example.deployment("redis-master") { + spec+: { + template+: { + spec+: { + containers: [ + example.container( + "master", "gcr.io/google_containers/redis:e2e" + ) { + resources: { + requests: { cpu: "100m", memory: "100Mi" }, + }, + ports: [{containerPort: 6379}], + }]}}}}, + + redis_master_service: example.service("redis-master") { + targetPod_: $.redis_master_deployment.spec.template, + }, + + redis_slave_deployment: example.deployment("redis-slave") { + spec+: { + replicas: 2, + template+: { + spec+: { + containers: [ + example.container( + "slave", "gcr.io/google_samples/gb-redisslave:v1" + ) { + resources: { + requests: { cpu: "100m", memory: "100Mi" }, + }, + env_: { + GET_HOSTS_FROM: "dns", + }, + ports: [{containerPort: 6379}], + }]}}}}, + + redis_slave_service: example.service("redis-slave") { + targetPod_: $.redis_slave_deployment.spec.template, + }, +} -- GitLab