Reach for a sidecar when you need the same capability across many services written in different languages and you do not want to maintain a client library for each one. mTLS between every service, uniform request metrics, and centrally controlled traffic policy are textbook cases. It is also the cleanest way to add behavior to a third-party or legacy app you cannot recompile.
The cost is real. Every pod now runs an extra container, so you double your container count and pay for its CPU and memory. A mesh of Envoy sidecars across thousands of pods can add meaningful overhead and a few milliseconds of latency per hop. There is also operational weight: another image to patch, version, and roll out, plus the iptables magic makes debugging harder when something goes wrong.
The main alternatives are a shared library baked into the app (no extra process, but you must build and update it for every language) and, more recently, eBPF-based meshes like Cilium that move proxy work into the kernel to avoid the per-pod sidecar entirely. Pick a sidecar when uniformity across languages beats raw efficiency.