L’interface est localisée ; les présentations et documents des Skills sont traduits automatiquement par IA dans votre langue. Le code, les commandes, chemins et termes techniques restent en version originale, et le document de l’auteur fait foi.
Explorer les Skills
Développement · SKILL.md

service-mesh-debugging

service-mesh-debugging

Implements comprehensive debugging workflows for Istio and Linkerd service meshes including mTLS validation, sidecar injection issues, traffic routing problems, and mesh observability for microservices.

Independent GitHub snapshot · Automated classification · Original documentation governs

Documentation de la Skill

GitHub

name: service-mesh-debugging compatibility: opencode completeness: 95 content-types:

  • guidance
  • examples
  • do-dont
  • config description: Implements comprehensive debugging workflows for Istio and Linkerd service meshes including mTLS validation, sidecar injection issues, traffic routing problems, and mesh observability for microservices. license: MIT maturity: stable metadata: domain: cncf output-format: code related-skills: agent-network-troubleshooting, cncf-istio, cncf-kubernetes-debugging role: implementation scope: implementation triggers: istio debugging, linkerd troubleshooting, service mesh issues, envoy errors, mTLS problems, traffic routing, sidecar injection, mesh monitoring archetypes:
    • tactical anti_triggers:
    • brainstorming
    • vague ideation
    • non-containerized architecture response_profile: verbosity: low directive_strength: high abstraction_level: operational version: "1.0.0"

Service Mesh Debugging

Implements comprehensive debugging and troubleshooting workflows for Istio and Linkerd service meshes including mTLS validation, sidecar injection issues, traffic routing problems, and mesh observability for microservices.

TL;DR Checklist

  • Verify service mesh control plane is healthy (istiod/destiny pods running)
  • Check sidecar injection status on workload pods
  • Validate mTLS configuration between services
  • Review Envoy proxy logs for connection errors
  • Examine traffic routing rules and virtual services
  • Check network policies and firewall rules
  • Validate service account tokens and RBAC permissions
  • Use mesh observability tools (Kiali, Jaeger, Prometheus) for tracing

When to Use

Use this skill when:

  • Services in the mesh cannot communicate and you suspect service mesh misconfiguration
  • You're experiencing mTLS handshake failures or certificate errors
  • Sidecar proxies are not injecting or failing to start on pods
  • Traffic routing rules (virtual services, destination rules) are not working as expected
  • You need to debug Envoy proxy configuration or access logs
  • Mesh observability (tracing, metrics, logs) is not functioning correctly

When NOT to Use

Avoid this skill for:

  • Basic Kubernetes networking issues without service mesh involvement (use cncf-kubernetes-debugging instead)
  • Application-level bugs unrelated to mesh configuration
  • Service mesh installation or upgrade procedures (use cncf-istio or Linkerd documentation)
  • Performance tuning without specific debugging symptoms
  • Security compliance audits (use dedicated security review skills)

Core Workflow

  1. Control Plane Health Check — Verify istiod or Linkerd control plane components are running and healthy. Checkpoint: All control plane pods in Running state with no restarts.

  2. Sidecar Injection Verification — Check if sidecar proxies are properly injected into workload pods. Checkpoint: Pods show 2/2 containers (app + istio-proxy or linkerd-proxy).

  3. mTLS Validation — Test and validate mutual TLS configuration between services. Checkpoint: mTLS status shows STRICT or PERMISSIVE and connections succeed.

  4. Traffic Routing Debug — Examine virtual services, destination rules, and gateway configurations. Checkpoint: Routing rules match expected traffic patterns and no 404/503 errors.

  5. Proxy Log Analysis — Review Envoy and Linkerd proxy logs for errors and warnings. Checkpoint: No connection refused, TLS handshake errors, or upstream timeouts in proxy logs.

  6. Observability Verification — Confirm metrics, traces, and logs are flowing through the mesh. Checkpoint: Kiali graphs show traffic, Jaeger traces appear, Prometheus metrics are scraped.


Implementation Patterns

Pattern 1: Control Plane Health Check

Description: Verify the service mesh control plane (istiod or Linkerd) is operational before debugging workloads.

# Istio control plane health check
kubectl get pods -n istio-system
kubectl logs -n istio-system $(kubectl get pods -n istio-system -l app=istiod -o jsonpath='{.items[0].metadata.name}')
kubectl get deploy -n istio-system

# Linkerd control plane health check
kubectl get pods -n linkerd
linkerd check --proxy
linkerd check --proxy -w
linkerd status

❌ BAD — Skipping control plane verification

# This assumes the mesh is working without checking
kubectl exec -it $(kubectl get pods -l app=myapp -o jsonpath='{.items[0].metadata.name}') -- curl http://other-service
# If this fails, you don't know if it's mesh config or application issue

✅ GOOD — Verify control plane first

# 1. Check control plane pods are running
kubectl get pods -n istio-system
# Expected: istiod-xxx Running 1/1, istio-cni-node-xxx Running 1/1, etc.

# 2. Check control plane logs for errors
kubectl logs -n istio-system istiod-xxx | grep -i error

# 3. Only then debug workloads
kubectl get pods -l app=myapp

Pattern 2: Sidecar Injection Status Check

Description: Verify sidecar proxies are injected and running alongside application containers.

# Check pod has sidecar injected (should show 2/2 containers)
kubectl get pods -l app=myapp

# Check sidecar container details
kubectl describe pod myapp-pod | grep -A 5 "istio-proxy\|linkerd-proxy"

# Verify sidecar logs are streaming
kubectl logs myapp-pod -c istio-proxy --tail=10
kubectl logs myapp-pod -c linkerd-proxy --tail=10

# Check for injection issues
kubectl get pod myapp-pod -o jsonpath='{.spec.containers[*].name}'

❌ BAD — Not checking injection status

# Assuming injection worked without verification
kubectl exec myapp-pod -- curl http://backend:8080
# If this fails, is it injection or configuration?

✅ GOOD — Verify injection before debugging

# 1. Check injection label on namespace
kubectl get namespace default -L istio-injection
kubectl get namespace default -L linkerd.io/inject

# 2. Check pod has sidecar
kubectl get pod myapp-pod
# Should show: myapp-pod 2/2 Running 0 5m

# 3. Check sidecar container exists
kubectl get pod myapp-pod -o jsonpath='{.spec.containers[*].name}'
# Should show: myapp istio-proxy or myapp linkerd-proxy

Pattern 3: mTLS Validation

Description: Debug and validate mutual TLS configuration between services in the mesh.

# Check mTLS status for a service
istioctl proxy-config listener myapp-pod -o json | jq '.[] | select(.portValue == 8080)'

# Verify mTLS mode in destination rules
istioctl proxy-config destinationrule myapp-pod

# Check mTLS with curl (Istio)
kubectl exec $(kubectl get pods -l app=curl -o jsonpath='{.items[0].metadata.name}') -- curl -v https://myapp:8080/health

# Check mTLS with Linkerd
linkerd -n default check --proxy
linkerd -n default proxy-status

# Test mTLS connection with istioctl analyze
istioctl analyze

# Check certificate status
istioctl proxy-config secret myapp-pod | grep -A 5 "default"

❌ BAD — Ignoring mTLS issues

# Making HTTP requests without checking mTLS
kubectl exec curl-pod -- curl http://myapp:8080
# May get connection refused or certificate errors if mTLS is misconfigured

✅ GOOD — Validate mTLS configuration

# 1. Check destination rule mTLS mode
istioctl proxy-config destinationrule myapp-pod -o json | jq '.spec.trafficPolicy.tls.mode'

# 2. Check policy authentication
kubectl get policy -n default myapp-policy -o yaml

# 3. Test with mTLS enabled curl
kubectl exec curl-pod -- curl -v --cacert /etc/certs/root-cert.pem \
  --cert /etc/certs/cert-chain.pem \
  --key /etc/certs/key.pem https://myapp:8080/health

Pattern 4: Traffic Routing Debug

Description: Debug virtual services, destination rules, and gateway configurations for traffic routing issues.

# List virtual services
istioctl proxy-config route myapp-pod

# Check specific route configuration
istioctl proxy-config route myapp-pod -o json | jq '.routes[] | select(.name == "default")'

# Debug destination rules
istioctl proxy-config destinationrule myapp-pod

# Check gateway configuration
kubectl get gateway -A
istioctl proxy-config listener myapp-pod --port 80

# Test traffic routing with istioctl
istioctl proxy-config route myapp-pod --name 8080 -o json

# Check envoy configuration
istioctl proxy-config listeners myapp-pod
istioctl proxy-config clusters myapp-pod

❌ BAD — Not examining routing rules

# Simply testing connectivity without understanding routing
kubectl exec curl-pod -- curl http://myapp:8080
# If it fails, you don't know if it's a virtual service or destination rule issue

✅ GOOD — Examine routing configuration

# 1. List all virtual services
istioctl proxy-config virtualservice myapp-pod

# 2. Check route for specific host
istioctl proxy-config route myapp-pod -o json | \
  jq '.routes[] | select(.match.prefix == "/") | .route.cluster'

# 3. Verify destination rule subset exists
istioctl proxy-config destinationrule myapp-pod -o json | \
  jq '.spec.subsets[] | .name'

Pattern 5: Envoy Proxy Log Analysis

Description: Analyze Envoy proxy logs to identify connection issues, TLS errors, and routing problems.

# Get pod name
POD=$(kubectl get pods -l app=myapp -o jsonpath='{.items[0].metadata.name}')

# Check Envoy access logs
kubectl logs $POD -c istio-proxy | grep -E "^[0-9]|UPSTREAM_FAILURE|TLS"

# Check Envoy error logs
kubectl logs $POD -c istio-proxy | grep -i error

# Enable debug logging
istioctl debug log --level proxy:debug

# Check Envoy configuration
istioctl proxy-config listener $POD
istioctl proxy-config cluster $POD
istioctl proxy-config route $POD

# Check Envoy stats for errors
istioctl proxy-config stats $POD | grep -E "upstream|failure|error"

❌ BAD — Ignoring proxy logs

# Not checking proxy logs for errors
kubectl exec curl-pod -- curl http://myapp:8080
# If it fails, you have no visibility into why

✅ GOOD — Analyze proxy logs

# 1. Get proxy logs
kubectl logs $POD -c istio-proxy --tail=50 > proxy.log

# 2. Search for common errors
grep -E "(TLS|connection refused|reset|503|upstream)" proxy.log

# 3. Check connection pool stats
istioctl proxy-config stats $POD | grep -E "cluster.outbound|http.config_error"

Pattern 6: Service Account and RBAC Debug

Description: Debug service account tokens and RBAC permissions that affect mesh communication.

# Check service account
kubectl get sa myapp-sa -o yaml

# Verify service account token is mounted
kubectl get pod myapp-pod -o jsonpath='{.spec.volumes[*].name}'

# Check RBAC policy
kubectl get policy -n default myapp-policy -o yaml

# Check AuthorizationPolicy (Istio 1.6+)
kubectl get authorizationpolicy -n default

# Debug RBAC with istioctl
istioctl analyze --include-service-mesh

# Check JWT token in pod
kubectl exec myapp-pod -- cat /var/run/secrets/tokens/istio-token

❌ BAD — Ignoring service account issues

# Assuming service accounts are configured correctly
kubectl exec curl-pod -- curl http://myapp:8080
# May fail silently if RBAC is blocking traffic

✅ GOOD — Verify service account and RBAC

# 1. Check service account exists
kubectl get sa myapp -o yaml

# 2. Check RBAC policy
kubectl get authorizationpolicy -n default

# 3. Test with specific service account
kubectl exec -it curl-pod -- curl -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" \
  http://myapp:8080

Pattern 7: Mesh Observability Debug

Description: Debug metrics collection, distributed tracing, and service mesh observability tools.

# Check Prometheus scraping Istio metrics
kubectl get pods -n monitoring prometheus-k8s-0
kubectl exec -n monitoring prometheus-k8s-0 -- curl localhost:9090/api/v1/query?query=istio_requests_total

# Check Jaeger for traces
kubectl get pods -n tracing jaeger
linkerd traces --help

# Check Kiali dashboard
istioctl dashboard kiali

# Verify metrics are being collected
kubectl exec -n istio-system prometheus-xxx -- curl localhost:9090/api/v1/query?query=istio%7Bsource_service%3D%22myapp%22%7D

# Check trace data
kubectl exec -n tracing jaeger-xxx -- curl localhost:16686/api/traces?service=myapp

# Debug metrics with istioctl
istioctl analyze --metrics

❌ BAD — Not verifying observability

# Assuming Kiali/Jaeger are working without checking
# If dashboard shows no data, you don't know if it's scraping or tracing issue

✅ GOOD — Verify observability pipeline

# 1. Check Prometheus is scraping Istio
kubectl exec -n monitoring prometheus-0 -- curl localhost:9090/api/v1/query?query=up{job="istio-mesh"}

# 2. Check Kiali can access data
istioctl dashboard kiali --context

# 3. Generate test trace
kubectl exec -n default curl-pod -- curl http://myapp:8080
# Then check Jaeger for the trace

Pattern 8: Network Policy and Firewall Debug

Description: Debug network policies and firewall rules that may block mesh traffic.

# Check network policies
kubectl get networkpolicies -n default

# Verify network policy allows mesh traffic
kubectl get networkpolicy -n default -o yaml | grep -A 10 "podSelector\|ingress"

# Check for iptables rules
kubectl exec myapp-pod -c istio-proxy -- iptables -L -n -v

# Verify CNI plugin is working
kubectl get pods -n kube-system | grep cni

# Check for Calico/Flannel issues
kubectl get felixconfigurations.crd.projectcalico.org
kubectl get networkpolicies.networking.k8s.io -n default

# Debug with istio-cni
kubectl get pods -n istio-system | grep istio-cni
kubectl logs -n istio-system istio-cni-node-xxx

❌ BAD — Ignoring network policies

# Testing connectivity without checking network policies
kubectl exec curl-pod -- curl http://myapp:8080
# May fail due to network policy without realizing it

✅ GOOD — Verify network configuration

# 1. List network policies
kubectl get networkpolicies -n default

# 2. Check if policy allows mesh traffic
kubectl get networkpolicy myapp-policy -n default -o yaml | grep -A 5 "ingress"

# 3. Check CNI logs
kubectl logs -n kube-system calico-node-xxx | grep -i error

Constraints

MUST DO

  • Always verify control plane health before debugging workloads
  • Check sidecar injection status before investigating application issues
  • Validate mTLS configuration when services cannot communicate
  • Examine Envoy proxy logs for connection errors and TLS handshake failures
  • Use istioctl analyze or linkerd check for comprehensive validation
  • Correlate mesh observability data (Kiali, Jaeger, Prometheus) with application logs
  • Check network policies and firewall rules when traffic is unexpectedly blocked

MUST NOT DO

  • Assume sidecar injection is working without verifying pod container count
  • Ignore control plane logs when debugging mesh-wide issues
  • Skip mTLS validation when investigating connection failures
  • Debug traffic routing without examining virtual service and destination rule configurations
  • Rely solely on application logs without checking proxy logs
  • Assume observability tools are working without verifying data ingestion
  • Bypass service mesh entirely for debugging without isolating mesh-specific issues

Output Template

When debugging service mesh issues, your response must include:

  1. Control Plane Status — Output of control plane health checks (kubectl get pods -n istio-system or linkerd status)

  2. Sidecar Injection Verification — Pod container count and sidecar proxy status (kubectl get pods -l app=myapp and proxy logs)

  3. mTLS Configuration — Destination rule mTLS mode and authentication policy status (istioctl proxy-config destinationrule and istioctl analyze)

  4. Traffic Routing Analysis — Virtual service and destination rule configuration matching expected patterns

  5. Proxy Log Summary — Key error messages from Envoy or Linkerd proxy logs

  6. Observability Status — Confirmation that metrics, traces, and logs are flowing through the mesh

  7. Recommended Action — Specific command or configuration change based on findings


Related Skills

SkillPurpose
cncf-kubernetes-debuggingFor general Kubernetes networking issues before isolating mesh-specific problems
cncf-istioFor Istio-specific installation, configuration, and advanced features
agent-network-troubleshootingFor high-level network connectivity issues across any infrastructure

References

Official Documentation

CLI Tools

  • istioctl - Istio CLI for debugging and configuration
  • linkerd - Linkerd CLI for verification and diagnostics
  • kubectl - Kubernetes CLI for pod and resource inspection

Common Commands Reference

# Istio debugging
istioctl analyze                    # Analyze mesh configuration
istioctl proxy-config               # View proxy configuration
istioctl debug log                  # Enable debug logging
istioctl dashboard kiali            # Open Kiali dashboard
istioctl proxy-status               # Get proxy synchronization status

# Linkerd debugging
linkerd check                       # Check mesh health
linkerd viz                         # Open Linkerd Viz dashboard
linkerd traces                      # View distributed traces
linkerd profile                     # Analyze service configuration

# Kubectl debugging
kubectl get pods -n istio-system    # Check control plane
kubectl get pods -l app=myapp       # Check workload pods
kubectl logs -c istio-proxy         # View proxy logs

Quick Debug Matrix

SymptomLikely CauseFirst Command to Run
No traffic between servicesmTLS misconfigurationistioctl proxy-config destinationrule
Sidecar not injectedNamespace label missingkubectl get namespace -L istio-injection
503 errorsUpstream connection failurekubectl logs -c istio-proxy
Traffic not routing correctlyVirtual service misconfigurationistioctl proxy-config route
No metrics in KialiMetrics collection issueistioctl dashboard kiali
Traces not showingJaeger not collectingkubectl get pods -n tracing
Connection refusedNetwork policy blockingkubectl get networkpolicies
Certificate errorsmTLS certificate issueistioctl proxy-config secret

This skill provides comprehensive debugging workflows for service mesh issues. Always start with control plane verification and work down to workload-specific issues.

Skills enregistrées