You don't need no service mesh
serce.me
serce.me
Well, let me try and answer that -- I use istio in production and the reason I use it instead of, for instance, managing 30+ .p12's for each individual java service that needs to talk to an external api via mtls (not to mention all of those plus the 20 or so others which all automatically get mtls 'in-mesh') is because it's an absolute shitload easier to manage.
Is it complicated? Yes. Is it more complicated than orcestrating the cfgmgt to achieve the same thing via more traditional methods? No.
Don't get me wrong, I have my problems with istio:
* Until about 1.5 the docs were at best sparodic.
* Finding out how to handle things like talking to an entpoint that does some ssl renegotiation without crapping out is still not easy
* The configuration / yaml spec for the various options is not simple to write
However, those are really offset by what we get by using it. I have logs of every external api call my entire estate (a big complicated one) makes, I get automatic tracing, I can do some really cool shit like mirror traffic to a standby pod to do a/b testing, none of my serivces need credentials for mtls calls baked into them (they just call http and 'magic' happens on the egress).
End of the day, it's a tool. If you don't need it, don't use it. This article comes across like it was written in the same vein as the old man screaming "get off my lawn".
That's not at all how I read it. In fact to me the article sounds very similar to your comment on many fronts.
From the conclusion:
> A service mesh is not an ultimate "good practice" but simply one of the patterns to solve a set of issues, and it's quite a heavy one.
> before committing to a piece of technology, it’s crucial to understand the problems it solves, and the context in which the solution was made.
On the other hand, I think the title is doing it a huge disservice. Because, unfortunately, a lot of people don't read beyond the title, and that only helps to perpetuate the anti-k8s/Istio/devops sentiment that has become so popular and pervasive lately.
Are there a lot of situations where a service mesh complicates things and causes more problems than it's worth? Absolutely. Are there a lot of situations where a service mesh will really help? Without a doubt. Should you use it when you build your personal niche side-project? Probably not. But maybe a goal of your side project is to learn Istio - in which case, you totally should use it.
[1] https://en.wikipedia.org/wiki/African-American_Vernacular_En...
This article seems to argue that making everyone use an RPC library is enough. But rarely is there good monitoring & observability built in to that. Other tasks like discovery &c may seem superflous, but it brings a well-defined set of expectations that incoming engineers stand a good chance of knowing. You're not just bringing in Monolith style genetic material & practice, you're bringing in common genetic material that others will know & be familiar with.
The overhead seems debateable. Performance can be quite good in some cases, depending on choices of underlying tech. The author talks about the cost of maintaining the system, but in the two modest sized environments I've seen (under 100 nodes), the transition was extremely painless & fast & required little effort, & nearly no maintenance. It also drastically reduced the effort we had spent & intended to spend instrumenting our existing services, so it felt to us like the maintenance cost was hugely negative.
The arguments about the proxies limiting your available options are somewhat interesting. For 99.999% of companies, I'd say that using RSocket or Aeron is way more fancy tech than you should be targeting. I do hope HTTP3 support emerges relatively quickly. My hope is that gRPC has some plans in the works somewhere, and that once gRPC starts to progress, the proxies will rapidly catch up.
But, like everything there is a cost- in this case another level of complexity.
On the contrary, a proper RPC library tends to have those things built in. If your services are homogeneous enough that you can have everyone use the same RPC library, you can hook up that library's monitoring, discovery etc. functionality, and achieve the benefits of service mesh with much less overhead.
IME it's much the same for a lot of microservice scenarios - if your environment is heterogeneous then it makes sense, but in a homogeneous environment making a library instead often gets you most of the benefits at a much smaller cost.
I feel service mesh provides good value in application layer policy control traffic management (routing, rate limiting etc.), security, deep observability. But it nonetheless still only provide the mechanisms at this point. I.e., one can implement to a high degree of flexibility whatever policy for their applications running on k8s clusters. But the complexity is exposed naked to the user.
A solution is to provide more abstraction, but it's not clear what that abstraction would be.
My friend said similar thing. And he said unless there are thousands of applications to manage, service meshes does not worth the investment. Or the break-even point for service mesh today is very high, probably only makes sense for orgs that is at or beyond Uber's size.
Would love to see how others view the value prop of service mesh, and what additional investment could make it easier to get value from service mesh.
[1] https://www.usenix.org/conference/srecon20americas/presentat... [2] https://gitlab.com/gauntletwizard_net/kubetls
Why would I use this over istio?
More seriously, if your istio injector stops working, your app will keep working over plaintext. For some users, that’s a feature. For others, that’s a breach of contract with fines. My app targets the latter.
The logging, authentication, circuit breaker, etc. is nice to have on top of that but I don't think it's the main advantage, or at least not the only one.
How is it going to do so?
(The project is dormant but it's been a while I wanted to give it a refresh and perhaps if somebody is interested I'd have the right incentive)
[1] https://www.netifi.com/ [2] https://developers.cloudflare.com/argo-tunnel/quickstart
I advise keeping architecture as simple as possible at first by building a monolith (or maybe FaaS if you're really doing throwaway experimentation), and keep refactoring it until your domain knowledge has solidified and it's clear where your service boundaries actually are; it's very unlikely that you'll get the service split correct the first time if you do it too early.
It's just pain all around man. What can we do?
My apologies, though I said Envoy, I meant within an Istio or Istio-like deployment on K8S where the networking layer is already managed by Kubernetes. https://istio.io/latest/docs/setup/additional-setup/cni/
What I think is missing is, that there is an underlying assumption that you can tweak each software you have in your environment, which might not be the case when you use paid software + self-programmed software + SaaS. The burden to configure each software to have tracing or mTLS is higher than finding out how each software might handle HTTP_PROXY.
So yeah, I am a big fan of gRPC with contexts, deadlines client certificates, but in an integrated heterogeneous environment you can only do so much.
At least this is my current understanding. If somebody has better/other experiences please help :)