Validating Kubernetes YAML for best practice and policies
learnk8s.io
learnk8s.io
Having recently worked a little bit with YAML for Kubernetes and HCL for Terraform, I really wish they had both just used "a real programming language" right from the start. I'll choose Racket because I know it best, but there are probably many languages that would work well. You could expose very nearly the same configuration language, but backed by a real programming language. I bet this would make some of the tools the author lists at the end (eg copper, config-lint) much easier to write, or perhaps not necessary at all.
And the author didn't mention Helm, but I will. The part of Helm I saw seemed to be a lot of work just to add "functions with parameters" to Kubernetes YAML, something we could have had for free using "a real programming language" from the start: https://helm.sh/docs/chart_template_guide/functions_and_pipe...
Why are so few configuration languages not backed by a real language?
In many cases, not having a full featured language is helpful as you have some additional guarantees that comes with a non Turing complete language like guaranteed completion.
In some cases though, you do need a full pledged programming language. For those cases, HashiCorp recently announced CDK support for Terraform: https://www.hashicorp.com/blog/cdk-for-terraform-enabling-py...
I suppose guaranteed completion matters if you are running untrusted code, but wouldn't sandboxing solve that? Are there any other guarantees that sandboxing wouldn't solve?
There is more benefits than just that, by restricting the possibilities you know there won't be unbounded loops, analysis and code review is easier (and infrastructure teams are often seriously lagging in this regard), it can be easier to maintain, update and test.
In some cases, you can have a project where this is seriously limiting though because you have some very complex and specific thing you need to express. For this you can use CDK. I would say both approach are complementary, not exclusive.
In my experience I would say nearly all infrastructure projects can be expressed as Terraform rather easily, but YMMV.
Once you switch to something as powerful as YAML, you might as well reach for a real programming language.
Living in Norway I've had quite a few of these situations where no is parsed to False [1].
[1] https://hitchdev.com/strictyaml/why/implicit-typing-removed/
That said, yeah :facepalm:
Can you make an example of the power of yaml that makes it more like a programming language (in particular vs JSON)?
The language is vast, and most people use it without knowing it.
I love YAML, but I wish there was a "strict&sane yaml subset".
Perhaps certain things are easier: it's easier to parse, to isolate the code portions, and to read data portions. But then validating what's inside those code portions is a challenge.
It seems like there's an opportunity for a programming language purpose built for the task of configuration. Its chief feature would be the ability to provide a lot of information when read in "inert data" mode, yet also provide full programming language power when read in "run" mode.
ETA: Perhaps embed Python inside something similar to YAML, and support active code via a "lambda" type. Use indentation for delimiting.
project: "Foo"
version: "1.0.1"
email: "me@example.com"
load:
lambda file_path:
passTcl, Perl, Python based config files experience in production, means I only touch Gradle when Google forces me to do so on Android.
Every time you have to use another configuration language you have to learn all the quirks (ex: "" == undef in puppet), Give up all your powerful tools (like a debugger) and learn new abstractions. It's extremely counterproductive and it usually would have been better to have simple data structure that you generate from a program written in a traditional language (which the team can artificially restrict to avoid recursion if they want.)
Also IMO there's no such thing as a "declarative language." These are just languages where almost everything has a side affect of mutating a data structure that you don't have an easy way of inspecting or debugging.
There are currently several options, like https://github.com/stripe/skycfg
> Why are so few configuration languages not backed by a real language?
There are tons of tools that work with YAML/JSON but I imagine you mean more like a first-class citizen programming language specific or good at writing static configuration. The other side of the coin is that configuration in many cases have a different audience than programmers (for ex, end users or operations team) and it's a good option to have static configuration key=value than any human can (more or less) read easily without having to run programming code in your head. Plus programming, besides being harder to read and share, introduces bugs. So I suppose the preference between code writing configuration and stand-alone configuration depends on who the consumer is and how complex the configuration is.
But there are two promising projects that could finally make a difference (at least one of them).
I would much rather have devs double check/validate things locally before they edit changes.
Modifying config files by using the edit text feature in GitHub (GH), doesn't enable you to do that.
& Devs are lazy. I'm lazy. They want things easy. Me too.
So let's make it easy. Modify your CI/CD pipeline to validate YAML configs on any file changes (use GH hooks for example)
Now devs can do whatever they want - if their pre-deployment checks fail, go back and fix it!
Only partially kidding here.
Classic example:
- containerPort: 7173
name: http
I think that's an object in a list? But it's not overly clear.And if I indented any of those lines wrong... - country: NO
Of course it's booleanBecause it reduces syntactic noise and increases informational density.
Most other serialization formats end up putting in indentation anyway to make them readable (JSON, TOML).
When studying the Yaml spec I discovered that a map property (key: value) can have not only a string as its key, but any value. Even a list. (cue screams)
the fact that I have to read the spec to figure out what's going on.
It should have been fairly simple to do this.
Why do I have to know the difference between ":" and "=" ...?
I thought HCL was one of the best attempts at a terse config language. Shortening foo { bar { bazz {} }} to foo bar baz{} cleans up plenty.
Someone in another thread mentioned using some LISP or LISP-like language to solve this problem.
Would something like TOML make things better here?
What would have been the solution?
Mature libraries with plenty of experience deploying into production.
Plus for small enough stuff, like configuration files, one can just plug XPATH as well, making the search for items even easier.
TBH, I have no experience with it. But, it sounds like if you need a configuration language with programmatic features, it would be more suited to the job than a general purpose programming language.