$30 off During Our Annual Pro Sale. View Details »

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

    View Slide

  2. (without introducing more risk)
    @garethr

    View Slide

  3. (without introducing more risk)
    Gareth Rushgrove

    View Slide

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

    View Slide

  5. - Why not (only) YAML
    - A quick look at some alternatives
    - Short discussion
    Gareth Rushgrove

    View Slide

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

    View Slide

  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?

    View Slide

  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:

    View Slide

  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

    View Slide

  10. - Avoid repetition
    - Combine external inputs
    - Enforce correctness
    - Introduce abstractions
    Gareth Rushgrove

    View Slide

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

    View Slide

  12. (without introducing more risk)
    jsonnet.org

    View Slide

  13. (without introducing more risk)
    Gareth Rushgrove
    Jonnet template
    // Example template
    {
    person1: {
    name: "Alice",
    welcome: "Hello " + self.name + "!",
    },
    person2: self.person1 { name: "Bob" },
    }

    View Slide

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

    View Slide

  15. (without introducing more risk)
    kubernetes examples

    View Slide

  16. (without introducing more risk)
    kubernetes-anywhere

    View Slide

  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)
    ]))

    View Slide

  18. (without introducing more risk)
    A REPL for Kubernetes
    Kubeplay

    View Slide

  19. (without introducing more risk)
    errordeveloper/kubeplay

    View Slide

  20. (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": [
    {

    View Slide

  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

    View Slide

  22. (without introducing more risk)
    Declarative Domain Specific Language
    Puppet

    View Slide

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

    View Slide

  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',
    }]
    },
    }

    View Slide

  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',

    View Slide

  26. (without introducing more risk)
    More Domain Specific Language
    Terraform

    View Slide

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

    View Slide

  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"
    }
    }

    View Slide

  29. (without introducing more risk)
    If you’re interested in this topic
    One last thing

    View Slide

  30. (without introducing more risk)
    KubeCon BoF session

    View Slide

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

    View Slide