Why the Service Mesh Should Fade Out of Sight
go.forrester.com
go.forrester.com
A bit of a stretch; k8s has a long way to go before it fulfils the requirements of an OS. But it's an interesting way to think of it.
Keep in mind, any such kernel would have very simple requirements. k8s typically runs on a hypervisor not bare metal, taking care of security, and bare metal compatibility. k8s manages the sharing of resources. The file system typically needs to be ephemeral rather than persisted. IPC all happens through explicit APIs.
What else does a kernel even do?
You must have miss-read my comment or I did a poor job writing, sorry.
I was saying, to become an OS, “there is very little OS functionality that k8s would need implement” most of the functionality is already handled by other parts of the stack, e.g. hypervisor, networked storage like S3, and user built APIs.
But I agree with you, as I hope my comment was clear: while it's an interesting metaphor, K8s is a long way away from being usefully thought of as an OS. And if it ever does reach a point where such a term would be useful it will be unrecognizable when compared to where it is today.
But in the spectrum of things, k8s is much more than a clever hack, but not quite a designed operating system.
I disagree that they should fade out of sight. This sentiment is to a larger extent applicable to reverse proxies too. My experience debugging problems when the service mesh is not accounted for can be painful.
For example, setting keepalive parameters and max connection age parameters for gRPC clients and servers. If the intermediary proxies and sidecar components are not accounted for, connections may close sooner than configured on the server but still be open on the client. Similar permutations of this abound.
Another example is retry logic. If retry mechanisms are configured between client and server, there can be a multiplicative blowup of connections established/dropped to/from servers due to intermediate proxies retrying.
I think hiding the service mesh will end up with complications similar to "dll hell".
a) does not show any understanding of how software works.
b) makes little sense, given what a linker actually does.
c) shows little to no understanding of how an individual computer works, let alone a service mesh.
My experience is limited to istio but tagging a deployment is more or less all an engineer needs to know. After that a sidecar is attached that rewrites ip traffic and gives you better observability, mutual TLS encrypted transports and obviously http routing / traffic control.
Obviously to take advantage of a lot of policy capabilities an engineer would need to know or declare their dependencies but I hardly think this is something that has a cognitive overhead that the author seems to imply.
Just like an OS hides the complexity of managing hardware, but software written is very much aware of the OS and depends on it’s specific interfaces to operate.
TMYK: Linkerd was actually named for the dynamic linker ("linker daemon"). It's also the service mesh most focused on transparency--in the vast majority of cases you can add Linkerd to an existing application without config and the application will continue functioning. https://linkerd.io/2/design-principles/
Uhhhh. If linking software is the gold standard for a service mesh, I think we're already there. If you're using the right tools and stack it's fine, but if you mess around and go lower-level you're in for a treat.
NB I'm surprised that anything from Forrester made it on here but kudos to them.
I’ve seen several codebases now where the company decided to move to a full SOA-architecture without much effort put into maintaining stable, public interfaces at every service.
The goals defined sometimes are quite misguided, eg: “We’ve moved 80% of our services over to k8s”.
Okay. Goal achieved. Then I see engineers face issues over coordinating changes across several services. It’s very easy to fall into the trap of solving the problem of making sure coupled service deployments all happen at the same time. Rather than defining public interfaces and making the services be able to handle several versions.
Since when did the most advanced and widely used OSes in the world become legacy?
> legacy Ones ... more and more irrelevant as it matures
And what will Kubernetes run on, bare metal? Thin air?
Too many developers, linux and other OS primitives are unneeded overhead on their application. One can write a little cloud formation, or kubernetes yaml and be off to the races while only interacting with linux as part of their build system.
As for the syslog/cron/apt examples I'll share some more detail below.
- Syslog Isn't used as it's pretty straightforward to pull in ones favorite language specific log library, combined with ones favorite log tool of choice and be off to the races.
- Cron doesn't get used as it can only easily handle scheduling on a specific host. Whereas there are a plethora of distributed schedulers which will happily run commands on any number of hosts.
- Apt/yum don't get used as folks want to have their builds to be repeatable, and rely on software built in via their dependency management system of choice and deployed via fat statically linked binary.
If you have any specific suggestions, I am on the lookout. I checked out tools like airflow and dask but did not see what they added. Trying not to go full blown HPC cluster.
If you aren't using a PaaS, take a look at hashicorp's nomad tool. It's worth noting that if your team uses microservices or just likes making lots of services, a self-hosted or cloud PaaS solution will save you inordinate amounts of time when it's used by more than 20 engineers.
Too many people, knifes and other tools are unneeded overhead on their application. One can cook a little cake, or pasta and be off to the races while only interacting with kitchen as part of their build system.
If the customer has a bad experience with a specific plate of pasta or piece of cake, they just say “Sorry!“ and replace it with a new one automatically. Most of the times the people coming to the restaurant are not particularly discerning anyway and just want something to satiate their hunger, so they are fine with this arrangement. New packaged flavors are rolled out periodically by the frozen food company and so the restaurant can even boast a seasonal menu!
I found many people using it for the sake of sounding articulated, but not even in farms cattles are as disposable as we like to use it to refer to computers, distributions or whatever.
Fundamentally, legacy is something left to us by someone else. On its own it’s neutral: if it is a result of someone’s effort, legacy is usually good; if it is a result of someone’s mismanagement, legacy is bad.
Curiously enough, in tech the mere state of being left by someone always implies something undesirable, obsolete, to be replaced. No matter how hard someone worked on it, where there’s legacy there is a tinge of exasperation. The state of being legacy is more or less an opposite to being current; a piece of software cannot be both.
Certainly some parts of the world are trying to make this the future anyway, though there’s a lot of room for misgivings (being a distributed system is hell)
Uh, I hate to be glib but has the author ever built something of consequence?
At least once a week I see some team running into this stuff, if you don't understand it then you're stuck twiddling your thumbs as soon as you hit any problem with your classloader or linker.
Analogy aside service connections seem a heck of a lot more complicated than virtual address spaces. I just really have a hard time buying that you are going to make all of the leaky parts of that abstraction disappear.