Slide 1

Slide 1 text

(without introducing more risk) Should Kubernetes have a DSL? Puppet Gareth Rushgrove Alternative configuration options for K8

Slide 2

Slide 2 text

(without introducing more risk) @garethr

Slide 3

Slide 3 text

(without introducing more risk) Gareth Rushgrove

Slide 4

Slide 4 text

(without introducing more risk) What we’ll cover This session

Slide 5

Slide 5 text

- Setting the scene - Open discussion - Summary Gareth Rushgrove

Slide 6

Slide 6 text

(without introducing more risk) The argument Why not (only) YAML

Slide 7

Slide 7 text

Gareth Rushgrove Brian Grant, Google, Kubernetes Config SIG “We've had a few complaints that YAML is ugly, error prone, hard to read, etc. Are there any other alternatives we might want to support?

Slide 8

Slide 8 text

Gareth Rushgrove

Slide 9

Slide 9 text

(without introducing more risk) Gareth Rushgrove API wire format as user interface template: metadata: labels: app: guestbook tier: frontend spec: containers: - name: php-redis image: gcr.io/google_samples/gb-frontend:v4 resources: requests: cpu: 100m memory: 100Mi env:

Slide 10

Slide 10 text

The language to represent the data should be a simple, data-only format such as JSON or YAML, and programmatic modification of this data should be done in a real programming language Gareth Rushgrove Borg, Omega, and Kubernetes, ACM Queue, Volume 14, issue 1 http://queue.acm.org/detail.cfm?id=2898444 “

Slide 11

Slide 11 text

The reality is probably closer to most people hand writing YAML files Gareth Rushgrove

Slide 12

Slide 12 text

Code allows us to - Avoid repetition - Combine external inputs - Enforce correctness - Introduce abstractions Gareth Rushgrove

Slide 13

Slide 13 text

(without introducing more risk) Configuration language for JSON data Jsonnet

Slide 14

Slide 14 text

(without introducing more risk) jsonnet.org

Slide 15

Slide 15 text

(without introducing more risk) kubernetes examples

Slide 16

Slide 16 text

(without introducing more risk) kubecfg

Slide 17

Slide 17 text

(without introducing more risk) Gareth Rushgrove Jsonnet template $ cat squid.jsonnet local squid = { namespace:: "squid", squid_service: kube.Service("proxy") { metadata+: { namespace: $.namespace }, target_pod: $.squid.spec.template, port: 80, }, squid_data: kube.PersistentVolumeClaim("proxy") { metadata+: { namespace: $.namespace },

Slide 18

Slide 18 text

(without introducing more risk) A REPL for Kubernetes Kubeplay

Slide 19

Slide 19 text

(without introducing more risk) errordeveloper/kubeplay

Slide 20

Slide 20 text

(without introducing more risk) Gareth Rushgrove A REPL for Kubernetes $ ./kubeplay kubeplay (namespace="*")> pods # list pods in the cluster kubeplay (namespace="*")> @pod = _.any # pick a random pod from the list kubeplay (namespace="*")> puts @pod.to_json # output the pod definition { "metadata": { ... }, "spec": { ... "containers": [ {

Slide 21

Slide 21 text

(without introducing more risk) Gareth Rushgrove Ruby based DSL @metadata = replicasets("*/").to_ruby.items.map do |k,v| v.metadata end @metadata.each do |i| puts "Name:\t#{i.name}" puts "Labels:\t#{i.labels}" puts end

Slide 22

Slide 22 text

(without introducing more risk) Declarative Domain Specific Language Puppet

Slide 23

Slide 23 text

(without introducing more risk) garethr/garethr-kubernetes

Slide 24

Slide 24 text

(without introducing more risk) Gareth Rushgrove Puppet DSL kubernetes_pod { 'sample-pod': ensure => present, metadata => { namespace => 'default', }, spec => { containers => [{ name => 'container-name', image => 'nginx', }] }, }

Slide 25

Slide 25 text

(without introducing more risk) More Domain Specific Language Terraform

Slide 26

Slide 26 text

(without introducing more risk) maxmanuylov/terraform-provider-kubernetes

Slide 27

Slide 27 text

(without introducing more risk) Gareth Rushgrove Terraform provider resource "kubernetes_resource" "mypod" { # Required, must link on the corresponding "kubernetes_cluster" data s cluster = "${data.kubernetes_cluster.main.cluster}" collection = "pods" name = "mypod" labels { a = "b" } }

Slide 28

Slide 28 text

(without introducing more risk) A compiled typed JVM language for config Kotlin DSL

Slide 29

Slide 29 text

(without introducing more risk) k8-kotlin-dsl

Slide 30

Slide 30 text

(without introducing more risk) Gareth Rushgrove Ingress in Kotlin import com.fkorotkov.kubernetes.* import io.fabric8.kubernetes.api.model.IntOrString import io.fabric8.kubernetes.client.DefaultKubernetesClient fun main(args: Array) { val client = DefaultKubernetesClient().inNamespace("default") client.extensions().ingresses().createOrReplace( ingress { metadata { name = "example-ingress" } spec { backend {

Slide 31

Slide 31 text

(without introducing more risk) A scala language for kubernetes config Skuber

Slide 32

Slide 32 text

(without introducing more risk) Skuber

Slide 33

Slide 33 text

(without introducing more risk) Gareth Rushgrove RC in Scala import skuber._ import skuber.json.format._ val nginxSelector = Map("app" -> "nginx") val nginxContainer = Container("nginx",image="nginx").exposePort(80) val nginxController= ReplicationController("nginx",nginxContainer,nginxSelector) .withReplicas(5) val nginxService = Service("nginx") .withSelector(nginxSelector) .exposeOnNodePort(30001 -> 80) import scala.concurrent.ExecutionContext.Implicits.global

Slide 34

Slide 34 text

(without introducing more risk) Useful parts of potential solutions Notable mentions

Slide 35

Slide 35 text

(without introducing more risk) JSON Schema

Slide 36

Slide 36 text

(without introducing more risk) Open API/Swagger

Slide 37

Slide 37 text

(without introducing more risk) Discussion And thanks for listening