Kubernetes without the YAML

Kubernetes without the YAML

A lightning talk from the Kubernetes dev room at Configuration Management Camp 2017. Discussion of higher level programatic interfaces and tools for Kubernetes.


Gareth Rushgrove

February 07, 2017


  1. (without introducing more risk) Kubernetes without the YAML Puppet Gareth

    Rushgrove Alternative configuration options for K8
  2. (without introducing more risk) @garethr

  3. (without introducing more risk) Gareth Rushgrove

  4. (without introducing more risk) What we’ll cover This talk

  5. - Why not (only) YAML - A quick look at

    some alternatives - Short discussion Gareth Rushgrove
  6. (without introducing more risk) The argument Why not (only) YAML

  7. 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?
  8. (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:
  9. 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 “
  10. - Avoid repetition - Combine external inputs - Enforce correctness

    - Introduce abstractions Gareth Rushgrove
  11. (without introducing more risk) Configuration language for JSON data Jsonnet

  12. (without introducing more risk) jsonnet.org

  13. (without introducing more risk) Gareth Rushgrove Jonnet template // Example

    template { person1: { name: "Alice", welcome: "Hello " + self.name + "!", }, person2: self.person1 { name: "Bob" }, }
  14. (without introducing more risk) Gareth Rushgrove Render templates $ jsonnet

    example.jsonnet { "person1": { "name": "Alice", "welcome": "Hello Alice!" }, "person2": { "name": "Bob", "welcome": "Hello Bob!" } }
  15. (without introducing more risk) kubernetes examples

  16. (without introducing more risk) kubernetes-anywhere

  17. (without introducing more risk) Gareth Rushgrove Jsonnet functions function(cfg) local

    if_enabled(addon, manifest) = if cfg.phase3[addon] then manifest local join(arr) = std.foldl(function(a, b) a + b, arr, {}); if_enabled("run_addons", join([ if_enabled("kube_proxy", (import "kube-proxy/kube-proxy.jsonnet" if_enabled("dashboard", (import "dashboard/dashboard.jsonnet")(c if_enabled("heapster", (import "heapster/heapster.jsonnet")(cfg) if_enabled("kube_dns", (import "kube-dns/kube-dns.jsonnet")(cfg) ]))
  18. (without introducing more risk) A REPL for Kubernetes Kubeplay

  19. (without introducing more risk) errordeveloper/kubeplay

  20. (without introducing more risk) Gareth Rushgrove A REPL for Kubernetes

    $ ./kubeplay kubeplay (namespace="*")> pods # list pods in the cluster <list-of-pods> kubeplay (namespace="*")> @pod = _.any # pick a random pod from the list kubeplay (namespace="*")> puts @pod.to_json # output the pod definition { "metadata": { ... }, "spec": { ... "containers": [ {
  21. (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
  22. (without introducing more risk) Declarative Domain Specific Language Puppet

  23. (without introducing more risk) garethr/garethr-kubernetes

  24. (without introducing more risk) Gareth Rushgrove Puppet DSL kubernetes_pod {

    'sample-pod': ensure => present, metadata => { namespace => 'default', }, spec => { containers => [{ name => 'container-name', image => 'nginx', }] }, }
  25. (without introducing more risk) Gareth Rushgrove Query existing resources $

    puppet resource kubernetes_pod sample-pod kubernetes_pod { 'sample-pod': ensure => 'present', metadata => { 'creationTimestamp' => '2016-01-20T14:03:23Z', 'name' => 'sample-pod', 'namespace' => 'default', 'resourceVersion' => '4579', 'selfLink' => '/api/v1/namespaces/default/pods/sample-pod’, 'uid' => '91c8a550-bf7e-11e5-816e-42010af001b1' }, spec => { 'containers' => [{ ‘image' => 'nginx',
  26. (without introducing more risk) More Domain Specific Language Terraform

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

  28. (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" } }
  29. (without introducing more risk) If you’re interested in this topic

    One last thing
  30. (without introducing more risk) KubeCon BoF session

  31. (without introducing more risk) Questions? And thanks for listening