Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Production patterns for Linkerd service mesh - the lightweight, security-first service mesh for Kubernetes.
.claude/skills/lingxling-linkerd-patterns/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-06 | ✗→✓ | ▲ Improved | 157% | 0% |
| case-14 | ✗→✓ | ▲ Improved | 76% | 0% |
| case-19 | ✗→✓ | ▲ Improved | 344% | 0% |
| case-20 | ✗→✓ | ▲ Improved | 86% | 0% |
| case-23 | ✗→✓ | ▲ Improved | 41% | 0% |
Production patterns for Linkerd service mesh - the lightweight, security-first service mesh for Kubernetes.
resources/implementation-playbook.md.┌─────────────────────────────────────────────┐
│ Control Plane │
│ ┌─────────┐ ┌──────────┐ ┌──────────────┐ │
│ │ destiny │ │ identity │ │ proxy-inject │ │
│ └─────────┘ └──────────┘ └──────────────┘ │
└─────────────────────────────────────────────┘
│
┌─────────────────────────────────────────────┐
│ Data Plane │
│ ┌─────┐ ┌─────┐ ┌─────┐ │
│ │proxy│────│proxy│────│proxy│ │
│ └─────┘ └─────┘ └─────┘ │
│ │ │ │ │
│ ┌──┴──┐ ┌──┴──┐ ┌──┴──┐ │
│ │ app │ │ app │ │ app │ │
│ └─────┘ └─────┘ └─────┘ │
└─────────────────────────────────────────────┘| Resource | Purpose | |----------|---------| | ServiceProfile | Per-route metrics, retries, timeouts | | TrafficSplit | Canary deployments, A/B testing | | Server | Define server-side policies | | ServerAuthorization | Access control policies |
bash# Install CLI brew install linkerd # Alternative: download the official installer, inspect it, then execute it tmpdir="$(mktemp -d)" trap 'rm -rf "$tmpdir"' EXIT curl --proto '=https' --tlsv1.2 -sSfL https://run.linkerd.io/install -o "$tmpdir/linkerd-install.sh" sed -n '1,160p' "$tmpdir/linkerd-install.sh" sh "$tmpdir/linkerd-install.sh" # Validate cluster linkerd check --pre # Install CRDs linkerd install --crds | kubectl apply -f - # Install control plane linkerd install | kubectl apply -f - # Verify installation linkerd check # Install viz extension (optional) linkerd viz install | kubectl apply -f -
yaml# Automatic injection for namespace apiVersion: v1 kind: Namespace metadata: name: my-app annotations: linkerd.io/inject: enabled --- # Or inject specific deployment apiVersion: apps/v1 kind: Deployment metadata: name: my-app annotations: linkerd.io/inject: enabled spec: template: metadata: annotations: linkerd.io/inject: enabled
yamlapiVersion: linkerd.io/v1alpha2 kind: ServiceProfile metadata: name: my-service.my-namespace.svc.cluster.local namespace: my-namespace spec: routes: - name: GET /api/users condition: method: GET pathRegex: /api/users responseClasses: - condition: status: min: 500 max: 599 isFailure: true isRetryable: true - name: POST /api/users condition: method: POST pathRegex: /api/users # POST not retryable by default isRetryable: false - name: GET /api/users/{id} condition: method: GET pathRegex: /api/users/[^/]+ timeout: 5s isRetryable: true retryBudget: retryRatio: 0.2 minRetriesPerSecond: 10 ttl: 10s
yamlapiVersion: split.smi-spec.io/v1alpha1 kind: TrafficSplit metadata: name: my-service-canary namespace: my-namespace spec: service: my-service backends: - service: my-service-stable weight: 900m # 90% - service: my-service-canary weight: 100m # 10%
yaml# Define the server apiVersion: policy.linkerd.io/v1beta1 kind: Server metadata: name: my-service-http namespace: my-namespace spec: podSelector: matchLabels: app: my-service port: http proxyProtocol: HTTP/1 --- # Allow traffic from specific clients apiVersion: policy.linkerd.io/v1beta1 kind: ServerAuthorization metadata: name: allow-frontend namespace: my-namespace spec: server: name: my-service-http client: meshTLS: serviceAccounts: - name: frontend namespace: my-namespace --- # Allow unauthenticated traffic (e.g., from ingress) apiVersion: policy.linkerd.io/v1beta1 kind: ServerAuthorization metadata: name: allow-ingress namespace: my-namespace spec: server: name: my-service-http client: unauthenticated: true networks: - cidr: 10.0.0.0/8
yamlapiVersion: policy.linkerd.io/v1beta2 kind: HTTPRoute metadata: name: my-route namespace: my-namespace spec: parentRefs: - name: my-service kind: Service group: core port: 8080 rules: - matches: - path: type: PathPrefix value: /api/v2 - headers: - name: x-api-version value: v2 backendRefs: - name: my-service-v2 port: 8080 - matches: - path: type: PathPrefix value: /api backendRefs: - name: my-service-v1 port: 8080
bash# On each cluster, install with cluster credentials linkerd multicluster install | kubectl apply -f - # Link clusters linkerd multicluster link --cluster-name west \ --api-server-address https://west.example.com:6443 \ | kubectl apply -f - # Export a service to other clusters kubectl label svc/my-service mirror.linkerd.io/exported=true # Verify cross-cluster connectivity linkerd multicluster check linkerd multicluster gateways
bash# Live traffic view linkerd viz top deploy/my-app # Per-route metrics linkerd viz routes deploy/my-app # Check proxy status linkerd viz stat deploy -n my-namespace # View service dependencies linkerd viz edges deploy -n my-namespace # Dashboard linkerd viz dashboard
bash# Check injection status linkerd check --proxy -n my-namespace # View proxy logs kubectl logs deploy/my-app -c linkerd-proxy # Debug identity/TLS linkerd identity -n my-namespace # Tap traffic (live) linkerd viz tap deploy/my-app --to deploy/my-backend
linkerd check after changes| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 12,148 | 16,089 | +32% | 1 | 1 | 0% | 2,169 | 4,104 | +89% | 0 | 0 | — |
case-02 | fail→fail | 23,934 | 12,631 | -47% | 1 | 1 | 0% | 3,822 | 4,563 | +19% | 0 | 0 | — |
case-03 | pass→pass | 16,808 | 12,086 | -28% | 1 | 1 | 0% | 2,648 | 3,637 | +37% | 0 | 0 | — |
case-04 | pass→pass | 10,860 | 9,651 | -11% | 1 | 1 | 0% | 1,586 | 3,445 | +117% | 0 | 0 | — |
case-05 | pass→pass | 9,999 | 10,379 | +4% | 1 | 1 | 0% | 1,828 | 3,561 | +95% | 0 | 0 | — |
case-06 | fail→pass | 8,953 | 8,696 | -3% | 1 | 1 | 0% | 1,347 | 3,464 | +157% | 0 | 0 | — |
case-07 | pass→pass | 3,871 | 3,313 | -14% | 1 | 1 | 0% | 418 | 2,562 | +513% | 0 | 0 | — |
case-08 | pass→pass | 3,336 | 4,168 | +25% | 1 | 1 | 0% | 613 | 2,791 | +355% | 0 | 0 | — |
case-09 | pass→pass | 3,169 | 3,509 | +11% | 1 | 1 | 0% | 438 | 2,688 | +514% | 0 | 0 | — |
case-10 | pass→pass | 4,645 | 2,971 | -36% | 1 | 1 | 0% | 624 | 2,733 | +338% | 0 | 0 | — |
case-11 | pass→pass | 10,252 | 9,062 | -12% | 1 | 1 | 0% | 1,474 | 3,358 | +128% | 0 | 0 | — |
case-12 | pass→pass | 8,844 | 10,102 | +14% | 1 | 1 | 0% | 1,613 | 3,223 | +100% | 0 | 0 | — |
case-13 | pass→pass | 4,109 | 4,852 | +18% | 1 | 1 | 0% | 805 | 2,960 | +268% | 0 | 0 | — |
case-14 | fail→pass | 10,487 | 7,329 | -30% | 1 | 1 | 0% | 1,840 | 3,244 | +76% | 0 | 0 | — |
case-15 | pass→pass | 10,343 | 5,153 | -50% | 1 | 1 | 0% | 1,436 | 3,170 | +121% | 0 | 0 | — |
case-16 | pass→pass | 7,001 | 134,968 | +1828% | 1 | 1 | 0% | 992 | 3,004 | +203% | 0 | 0 | — |
case-17 | pass→pass | 11,296 | 10,522 | -7% | 1 | 1 | 0% | 1,720 | 3,444 | +100% | 0 | 0 | — |
case-18 | pass→pass | 6,025 | 3,626 | -40% | 1 | 1 | 0% | 916 | 2,689 | +194% | 0 | 0 | — |
case-19 | fail→pass | 3,505 | 6,327 | +81% | 1 | 1 | 0% | 614 | 2,725 | +344% | 0 | 0 | — |
case-20 | fail→pass | 8,472 | 6,583 | -22% | 1 | 1 | 0% | 1,618 | 3,011 | +86% | 0 | 0 | — |
case-21 | pass→pass | 8,242 | 6,873 | -17% | 1 | 1 | 0% | 1,135 | 3,240 | +185% | 0 | 0 | — |
case-22 | pass→pass | 8,739 | 4,350 | -50% | 1 | 1 | 0% | 1,479 | 2,864 | +94% | 0 | 0 | — |
case-23 | fail→pass | 23,939 | 3,033 | -87% | 1 | 1 | 0% | 1,829 | 2,576 | +41% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +22 percentage points is the difference between those two pass rates over the 23 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.