Why services lose requests without Linkerd service mesh
Services inside the cluster communicate over a network that is not encrypted by default and does not confirm who is on the other end. One compromised pod or an extra rule is enough for an outsider to read traffic between services and access internal APIs as a neighbor.
Perimeter protection does not work here: it ends at the ingress gateway, while inside services trust each other without verification.
Manual certificate issuance adds fragility. Certificates are issued by script, the renewal date is kept in a calendar, and rotation is coordinated between teams.
A missed date — and connections between services break at once, and the cause is searched in logs because it is not reflected in metrics.
A separate problem is monitoring blind spots. Load on nodes and pods is visible, but breakdown by service pairs is not: it is unclear who is losing requests, how long they wait for a response, and how often they retry.
When one service starts responding slower, callers accumulate connections, the pool exhausts, and the failure rises up the chain.
Thus a single failure turns into a cascading failure, and recovery time goes to finding the culprit, not fixing the issue. We analyze how this is closed: what Linkerd service mesh gives, how it removes these three pain points, and what traffic data appears at the output.
Measurable effects: timelines, failures, observability
While traffic between services goes directly, one lagging instance drags its neighbors along: retries multiply, queues grow, and the on-call engineer collects the cause from logs of several applications at once.
After enabling Linkerd, the connection between services becomes manageable: the service layer sees who responds slowly and diverts traffic from the problematic instance before errors reach the user. The share of successful requests grows without rewriting application code.
Certificates for mutual authentication are issued and renewed automatically — rotation ceases to be a separate task in the on-call calendar.
Together with it goes a whole class of failures: connections rejected due to an expired certificate no longer surface in the middle of the workday.
Observability appears without changes in services: for each route, the share of successful requests, latency distribution, and how traffic is divided between versions are visible.
Incident analysis ceases to be an argument — the graph shows which route degraded and from what moment.
Service recovery time is reduced due to automation: traffic draining, retries with a limit, and version switching work without manual commands. Rollout and rollback are described declaratively — manual operations during release become noticeably fewer.
Service mesh operation modes and their limitations
The mesh connection mode determines what share of load actually goes through sidecar proxies, and it is set not at once, but at the level of a namespace or an individual service.
This affects both overhead and the completeness of the observability picture, so choosing "for growth" in advance almost always turns out to be a mistake.
| Option | When it fits | Limitations |
|---|---|---|
| Full cluster coverage | End-to-end mTLS and unified tracing across all services are needed | Proxy in every pod: higher resource consumption, implementation requires planned restart of workloads |
| Selective service connection | Phased migration: critical services first, the rest as teams are ready | In unconnected sections, traffic goes without encryption and is not visible in the overall picture |
| Sidecar layer only for critical services | A small set of services with increased protection requirements | Some failures and delays remain outside monitoring, unified policies are applied fragmentarily |
Mesh limitations manifest at the junctions of modes: while coverage is partial, some requests go past the proxy, and access rules must be written so that this section does not become a hole.
Gradual version deployment requires separate attention. First the control plane is updated, then workloads are restarted one namespace at a time, comparing the share of successful requests and latencies.
The update proceeds without downtime, but only if the proxies of the previous version are compatible with the new control plane.
Implementation stages: from traffic audit to handover
Implementation of Linkerd begins not with installation, but with inventory. While it is unknown which services communicate and in what direction, enabling encryption turns into a guessing game, and the first service without a proxy drops adjacent calls. The order of work is structured so that at each step a point of return remains.
- Traffic audit. We take a map of connections: who communicates with whom, on which ports, where connections go bypassing the cluster. The basis is network metrics, service descriptions, and proxy logs.
- Routing scheme. We fix addressing inside the service mesh and rules for external traffic: what is available from outside, how requests are distributed between versions. The scheme is agreed before changes in the cluster.
- Enabling mutual authentication. First observation mode: connections are checked but not blocked — it is visible who does not yet know how to identify themselves. Then strict mode, by services, starting with non-critical ones.
- Load testing. We take latencies, the share of successful responses, and behavior when one instance fails, comparing with measurements before implementation. Separately, we run a connection break and a version update.
- Observability and regulations. We set up dashboards by connections between services, alerts on error growth and certificate lifetime. We fix the rules for adding a service and rolling back changes.
- Handover to the team. We hand over configurations to the repository, the routing scheme, and the regulation for connecting a new service. Training takes place on a live stand so that engineers themselves conduct connections.
After handover, the team expands the service mesh on their own, without ordering each connection. The solution remains inside your infrastructure and lives by your regulations.
Handover package: configurations, routing schemes, regulations
After implementation, the team retains not only a working mesh, but also a package of artifacts by which the infrastructure can be developed without us.
All decisions are fixed in the repository next to the service code: configuration changes pass review just like regular edits and get into version history.
- Configuration descriptions — values of proxy and controller parameters with comments: why such timeouts, retries, and connection limits were chosen, which of them can be changed without restarting services.
- Access policies — a matrix of "who communicates with whom" at the level of services and methods, rules for mandatory encryption of traffic between pods, and the order of issuance and rotation of certificates.
- Request routing scheme — a map of service dependencies, points of measurement, and rules for distributing traffic between stable and canary versions.
- Update regulation — the sequence of releasing a new version of the mesh controller, checking compatibility with already connected proxies, rollout windows, and conditions for automatic stop.
- Change rollback procedure — how to return the previous routing profile and policies, what happens with already running service instances, and at which step the decision to roll back is made.
- Infrastructure documentation — structure of clusters and namespaces, service catalog with responsible persons, and a diagnostic checklist for degradation.
- Monitoring panels and alert rules — request success, latencies, traffic volume, trigger thresholds, and the list of those who receive the signal.
We analyze each artifact with your team at handover: we show where it lies, how to check a change on a safe section, and how to roll back if traffic analysis showed not what was expected.
Case study: how cascading failures between services were eliminated
Before implementation, services inside the cluster communicated directly: each client had its own timeouts, its own request retries, and its own error handling.
As soon as the catalog service responded slower, the waiting was picked up by the next service, then the frontend — connection pools overflowed, and one slow section dropped the whole chain.
Cascading failures repeated 3–4 times per month, and incident analysis took hours: connections between services were not visible on any monitoring panel, and the cause was searched manually in logs.
We moved inter-service communication through Linkerd in sidecar-proxy mode and moved policies to the platform level: encryption of the channel between services, unified timeouts and retries with a limit on the number of attempts, a limit of concurrent requests, and circuit breaking at the caller when the error share grows.
Release of new versions went canary way — the share of traffic to the new version grew stepwise, and return to the previous route was performed by metrics, not manually.
Metrics before and after
| Metric | Before | After |
|---|---|---|
| Success rate | 97.4% | 99.95% |
| Cascading failures | 3–4 per month | none in a quarter |
| Failure cause localization | hours via logs | minutes via tracing |
| Rollback to previous version | manual, about 40 minutes | route switching, minutes |
Resilience of services ceased to depend on the accuracy of an individual developer: policies are the same for all, and a new service gets them automatically when connecting to the mesh.
Diagnostics narrowed to one panel — it is visible which service returns errors and what its callers feel.
How Linkerd differs from manual encryption setup
The difference is not whether encryption between services is enabled, but who is responsible for the lifecycle of certificates, access rules, and failure analysis.
A manual scheme is self-written scripts for issuance and renewal of certificates, edits of reverse proxy configuration, and a set of checks that lives in a separate repository and rests on one person.
The cost of an error in such a configuration manifests not immediately. A missed renewal deadline — the connection between services falls off entirely, not degrades; a mistake in rules — part of traffic goes bypassing encryption, and this can be noticed only by indirect metrics.
Self-written scripts also do not forgive version mismatches: what works on the stand behaves differently on production.
Linkerd closes this as a managed connectivity layer: certificate renewal goes by itself, encryption and traffic distribution rules are described declaratively and applied without rebuilding applications.
A policy change is an edit of one manifest instead of going around all services with a rollout of a new version and restart.
Support on your own differs even more. Scripts over time overgrow with exceptions, they are afraid to touch them, and when the responsible person changes, the logic is restored from change history.
A ready solution has a predictable model, documentation, and diagnostics: it is visible which connections are protected, where they break, and with what latency requests go between services.
An honest caveat: on two or three services, a self-written scheme sometimes lives longer than it should, — exactly until the moment when exceptions accumulate more than logic. We analyze how this is closed by transfer to a managed layer.
Questions asked before implementing the mesh
Before enabling Linkerd in a working cluster, questions about compatibility and the cost of intervention are natural. We collected what is most often asked before the start of work — with substantive answers.
Will services need to be rewritten?
No. The mesh places a proxy container next to the application and works at the level of exchange between services: traffic encryption and metrics are enabled without changes in code. Separately, we check services that manage encryption themselves — we connect them after a test run.
How much will latency increase?
One intermediate hop inside the cluster is added to each request. Where the bottleneck was database calls or external calls, the increase remains within the usual latency spread. Measurements are taken before and after enabling per service.
How much work will fall on our team?
From the customer — access to the cluster and a list of services with criticality marks. Configurations, connection order, checks, and rollback — on our side. Windows are agreed in advance and we show what exactly changes in the cluster.
Can it be enabled gradually?
Yes, this is the standard order. The mesh is enabled by namespaces: we start with the least critical, compare the share of unsuccessful requests and response time on end-to-end scenarios, then move on. Rollback is removal of enablement for a specific namespace, without rebuilding services.
Let's discuss your task and come back with an implementation plan
To come back with an implementation plan, not general considerations, we need initial data on the infrastructure.
Assessment of the scope directly depends on how the cluster and rollout process are arranged: the number of stages and the order of enabling mTLS in Linkerd depend on this.
Below is what we request at the stage of discussing the task; part of the information is taken by export of manifests, part — by a short conversation with your engineer.
- Cluster topology: number of environments, separation of namespaces, who owns shared resources.
- Method of application delivery: Helm charts, templates, or manual manifests — the format of work depends on this.
- Current issuance and rotation of certificates, requirements for the trusted chain and external certificate authority.
- List of services of the first stage and their dependencies: with whom we start, whom we affect indirectly.
- How canary rollout is planned: by which metrics we consider success and who decides on traffic transfer.
- Where metrics, logs, and traces are collected and what retention policies are applied to them.
- Change regulation: approval windows, who confirms the release, how rollback is formalized.
The cooperation scheme is simple: we analyze the inputs, show the stages and what is checked after each, and come back with an implementation plan and scope assessment. Describe the task — what already works, where the bottleneck is, and what result is needed.







