With dozens of microservices, each one needs the same retries, timeouts, encryption and metrics, and writing them into every codebase does not scale. A service mesh puts a sidecar proxy next to each service and configures them all centrally, adding mTLS, traffic splits and per-call metrics without code changes. It fits a large Kubernetes setup with many teams and services. For a handful of services, a library or a plain load balancer is usually enough and much simpler to run.