Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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
Tweet

More Decks by Gareth Rushgrove

Other Decks in Technology

Transcript

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

    Rushgrove Alternative configuration options for K8
  2. - Why not (only) YAML - A quick look at

    some alternatives - Short discussion Gareth Rushgrove
  3. 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?
  4. (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:
  5. 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 “
  6. - Avoid repetition - Combine external inputs - Enforce correctness

    - Introduce abstractions Gareth Rushgrove
  7. (without introducing more risk) Gareth Rushgrove Jonnet template // Example

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

    example.jsonnet { "person1": { "name": "Alice", "welcome": "Hello Alice!" }, "person2": { "name": "Bob", "welcome": "Hello Bob!" } }
  9. (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) ]))
  10. (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": [ {
  11. (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
  12. (without introducing more risk) Gareth Rushgrove Puppet DSL kubernetes_pod {

    'sample-pod': ensure => present, metadata => { namespace => 'default', }, spec => { containers => [{ name => 'container-name', image => 'nginx', }] }, }
  13. (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',
  14. (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" } }