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

Should Kubernetes have a DSL for configuration?

Should Kubernetes have a DSL for configuration?

Slides used for the introduction to my Birds of a Feather session at KubeCon EU in Berlin. A discussion of various approaches to using programming languages to configure Kubernetes rather than writing the raw data.

Gareth Rushgrove

March 30, 2017
Tweet

More Decks by Gareth Rushgrove

Other Decks in Technology

Transcript

  1. (without introducing more risk) Should Kubernetes have a DSL? Puppet

    Gareth Rushgrove Alternative configuration options for K8
  2. 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?
  3. (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:
  4. 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 “
  5. Code allows us to - Avoid repetition - Combine external

    inputs - Enforce correctness - Introduce abstractions Gareth Rushgrove
  6. (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 },
  7. (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": [ {
  8. (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
  9. (without introducing more risk) Gareth Rushgrove Puppet DSL kubernetes_pod {

    'sample-pod': ensure => present, metadata => { namespace => 'default', }, spec => { containers => [{ name => 'container-name', image => 'nginx', }] }, }
  10. (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" } }
  11. (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<String>) { val client = DefaultKubernetesClient().inNamespace("default") client.extensions().ingresses().createOrReplace( ingress { metadata { name = "example-ingress" } spec { backend {
  12. (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