Skip to content
Back to skills

Service Mesh Patterns

ASecurity

Use when designing service mesh architecture and patterns.

  • 2 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added September 10, 2026
devopspythonrustgodebuggingapisecurity

Works with

  • api

Security analysis

A100/100

Scanned September 10, 2026

npx -y skills add LoopyLuci/Skills --skill service-mesh-patterns --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Service Mesh Patterns?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Service Mesh Patterns
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/loopyluci-service-mesh-patterns/badge)](https://www.skillsdirectory.com/skills/loopyluci-service-mesh-patterns)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: service-mesh-patterns
description: "Use when designing service mesh architecture and patterns."
version: 1.0.0
author: Hermes Agent
license: MIT
metadata:
  hermes:
    tags: [service-mesh, istio, linkerd, envoy, sidecar, microservices]
    related_skills: [api-gateway-load-balancing, zero-trust-network-architecture, distributed-systems-patterns, multi-platform-project]
---

# Service Mesh Patterns

Designing and implementing service mesh architectures for microservices communication — sidecar proxies, traffic management, observability, security, and resilience patterns using Envoy/Istio/Linkerd concepts.

## When to Use

- Managing service-to-service communication in a microservices architecture
- Implementing mTLS, traffic splitting, or circuit breaking at the mesh layer
- Adding observability (traces, metrics, logs) without application changes
- Transitioning from application-level resilience to infrastructure-level
- Multi-cluster or multi-cloud service connectivity

## Architecture

```
Pod/Container:
┌──────────────────┐
│  Service A        │
│  (Application)    │
├──────────────────┤
│  Sidecar Proxy    │ ← Envoy, Linkerd-proxy, or similar
│  (Data Plane)     │
└──────┬───────────┘
       │ mTLS + Telemetry
       │
┌──────┴───────────┐
│  Control Plane    │
│  (Istiod, etc.)   │
└──────────────────┘
```

## Sidecar Proxy Pattern

```python
class SidecarProxy:
    """Simplified sidecar proxy implementation (conceptual)."""
    
    def __init__(self, service_name, control_plane_endpoint):
        self.service_name = service_name
        self.control_plane = control_plane_endpoint
        self.routes = {}
        self.certs = None
        self.metrics = {'requests': 0, 'errors': 0, 'latency': []}
    
    def intercept_ingress(self, request):
        """Handle incoming request to the service."""
        # 1. TLS termination
        request = self.decrypt(request)
        
        # 2. Authentication / mTLS verification
        if not self.verify_mtls(request):
            return self.reject(401)
        
        # 3. Rate limiting
        if not self.rate_limiter.allow():
            return self.reject(429)
        
        # 4. Auth政策 (RBAC)
        if not self.check_auth(request):
            return self.reject(403)
        
        # 5. Telemetry
        start = time.time()
        
        # 6. Forward to local service
        response = self.forward_to_local(request)
        
        # 7. Record metrics
        self.metrics['requests'] += 1
        self.metrics['latency'].append(time.time() - start)
        
        return response
    
    def intercept_egress(self, request, target_service):
        """Handle outgoing request to another service."""
        # 1. Service discovery
        endpoints = self.resolve_service(target_service)
        
        # 2. Load balancing
        endpoint = self.load_balancer.pick(endpoints)
        
        # 3. Traffic policy (timeout, retry, circuit breaker)
        # 4. mTLS encryption
        request = self.encrypt(request, endpoint)
        
        # 5. Send with telemetry headers
        request.headers['x-request-id'] = str(uuid.uuid4())
        request.headers['x-trace-id'] = self.current_trace_id
        
        return self.send(request, endpoint)
```

## Traffic Management

### Traffic Splitting / Canary

```python
class TrafficManager:
    """Traffic routing policies for canary deployments."""
    
    def __init__(self):
        self.rules = {}
    
    def add_route_rule(self, service, subsets):
        """
        subsets: [{'name': 'stable', 'weight': 90},
                  {'name': 'canary', 'weight': 10}]
        """
        self.rules[service] = subsets
    
    def route_request(self, service, request):
        """Route request to subset based on weights."""
        if service not in self.rules:
            return service  # Default
        
        subsets = self.rules[service]
        roll = random.random() * 100
        cumulative = 0
        
        for subset in subsets:
            cumulative += subset['weight']
            if roll <= cumulative:
                return f"{service}-{subset['name']}"
        
        return f"{service}-{subsets[-1]['name']}"
    
    def match_based_routing(self, service, request):
        """Route based on request attributes (headers, cookies)."""
        # Istio-style: route based on header match
        if request.headers.get('x-canary') == 'true':
            return f"{service}-canary"
        if request.cookies.get('experiment') == 'b':
            return f"{service}-experiment-b"
        return f"{service}-stable"
```

### Timeouts and Retries

```python
class ResiliencePolicy:
    """Service-level resilience configuration."""
    
    def __init__(self, service):
        self.service = service
        self.timeout_ms = 5000
        self.retries = 3
        self.retry_on = ['connect-failure', 'refused-stream', 'unavailable']
        self.circuit_breaker = {
            'consecutive_errors': 5,
            'sleep_window_ms': 30000,
            'max_ejection_percent': 50
        }
    
    def should_retry(self, attempt, error):
        if attempt >= self.retries:
            return False
        return error.type in self.retry_on
```

## Observability

### Distributed Tracing

```python
import uuid
import time

class TraceContext:
    """Propagate trace context across service boundaries."""
    
    def __init__(self):
        self.trace_id = None
        self.span_id = None
        self.parent_span_id = None
    
    @classmethod
    def from_headers(cls, headers):
        context = cls()
        context.trace_id = headers.get('x-trace-id')
        context.span_id = headers.get('x-span-id')
        context.parent_span_id = headers.get('x-parent-span-id')
        return context
    
    @classmethod
    def new(cls):
        context = cls()
        context.trace_id = str(uuid.uuid4())
        context.span_id = str(uuid.uuid4())
        return context
    
    def to_headers(self):
        return {
            'x-trace-id': self.trace_id,
            'x-span-id': str(uuid.uuid4()),
            'x-parent-span-id': self.span_id
        }


class Tracer:
    """Collect and export trace spans."""
    
    def __init__(self, service_name):
        self.service = service_name
        self.spans = []
    
    def record_span(self, name, context, start_time, end_time, tags=None):
        span = {
            'trace_id': context.trace_id,
            'span_id': context.span_id,
            'parent_span_id': context.parent_span_id,
            'service': self.service,
            'operation': name,
            'start_time': start_time,
            'duration_ms': (end_time - start_time) * 1000,
            'tags': tags or {}
        }
        self.spans.append(span)
        return span
```

### Metrics

```python
class ServiceMetrics:
    """Request-level metrics collected by the sidecar."""
    
    def __init__(self, service_name):
        self.service = service_name
        self.counters = {'requests_total': 0, 'errors_total': 0}
        self.histograms = {'request_duration_ms': []}
        self.gauges = {'connections_active': 0}
    
    def record_request(self, duration_ms, status_code):
        self.counters['requests_total'] += 1
        if status_code >= 500:
            self.counters['errors_total'] += 1
        self.histograms['request_duration_ms'].append(duration_ms)
```

## Security

### mTLS Implementation

```python
class MutualTLS:
    """Service-to-service mTLS with automatic certificate rotation."""
    
    def __init__(self, identity):
        self.identity = identity
        self.certs = {}
    
    def request_certificate(self, spiffe_endpoint):
        """Request SPIFFE certificate from control plane."""
        # CSR generation → Control Plane signs → Return cert
        pass
    
    def verify_peer(self, peer_cert, expected_spiffe_id):
        """Verify peer certificate against expected identity."""
        from cryptography import x509
        cert = x509.load_pem_x509_certificate(peer_cert)
        # Extract SPIFFE ID from SAN extension
        spiffe_id = self._extract_spiffe(cert)
        return spiffe_id == expected_spiffe_id
```

## Common Pitfalls

1. **Sidecar resource overhead** — each sidecar adds ~50MB RAM per pod; optimize for scale
2. **Control plane latency** — misconfigured control plane causes Envoy hot-reload storms
3. **mTLS complexity** — certificate rotation, trust domain management, and root CA protection
4. **Protocol limitations** — not all protocols work transparently (UDP, HTTP/2->HTTP/1.1)
5. **Debugging overhead** — tracing adds storage cost; sample at 1-10%
6. **Feature envy** — don't put everything in the mesh; some concerns belong in the application

## Verification Checklist

- [ ] Sidecar intercepts all ingress/egress traffic transparently
- [ ] mTLS established between all services (verify with tcpdump)
- [ ] Traffic splitting routes correct % to each subset
- [ ] Circuit breaker trips and recovers correctly
- [ ] Distributed traces span all services in a request
- [ ] Metrics exported and queryable (Prometheus format)
- [ ] Certificate rotation works without connection drops

## See Also

- api-gateway-load-balancing — edge gateway vs. mesh
- zero-trust-network-architecture — ZTA with mTLS
- distributed-systems-patterns — broader microservices patterns
- multi-platform-project — multi-service deployment

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…