linkerd-patterns

Par wshobson · agents

Implémentez des modèles de service mesh Linkerd pour des déploiements légers axés sur la sécurité. À utiliser lors de la configuration de Linkerd, de la mise en place de politiques de trafic ou de l'implémentation d'un réseau zero-trust avec un overhead minimal.

npx skills add https://github.com/wshobson/agents --skill linkerd-patterns

Modèles Linkerd

Modèles de production pour Linkerd service mesh - le service mesh léger et sécurisé par défaut pour Kubernetes.

Quand Utiliser Cette Skill

  • Configurer un service mesh léger
  • Implémenter le mTLS automatique
  • Configurer les traffic splits pour des déploiements canary
  • Configurer les profils de service pour les métriques par route
  • Implémenter les retries et timeouts
  • Service mesh multi-cluster

Concepts Clés

1. Architecture Linkerd

┌─────────────────────────────────────────────┐
│                Control Plane                 │
│  ┌─────────┐ ┌──────────┐ ┌──────────────┐ │
│  │ destiny │ │ identity │ │ proxy-inject │ │
│  └─────────┘ └──────────┘ └──────────────┘ │
└─────────────────────────────────────────────┘
                      │
┌─────────────────────────────────────────────┐
│                 Data Plane                   │
│  ┌─────┐    ┌─────┐    ┌─────┐             │
│  │proxy│────│proxy│────│proxy│             │
│  └─────┘    └─────┘    └─────┘             │
│     │           │           │               │
│  ┌──┴──┐    ┌──┴──┐    ┌──┴──┐            │
│  │ app │    │ app │    │ app │            │
│  └─────┘    └─────┘    └─────┘            │
└─────────────────────────────────────────────┘

2. Ressources Clés

Ressource Objectif
ServiceProfile Métriques par route, retries, timeouts
TrafficSplit Déploiements canary, tests A/B
Server Définir les politiques côté serveur
ServerAuthorization Politiques de contrôle d'accès

Templates

Template 1 : Installation du Mesh

# Installer CLI
curl --proto '=https' --tlsv1.2 -sSfL https://run.linkerd.io/install | sh

# Valider le cluster
linkerd check --pre

# Installer les CRDs
linkerd install --crds | kubectl apply -f -

# Installer le control plane
linkerd install | kubectl apply -f -

# Vérifier l'installation
linkerd check

# Installer l'extension viz (optionnel)
linkerd viz install | kubectl apply -f -

Template 2 : Injection de Namespace

# Injection automatique pour le namespace
apiVersion: v1
kind: Namespace
metadata:
  name: my-app
  annotations:
    linkerd.io/inject: enabled
---
# Ou injecter un déploiement spécifique
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  annotations:
    linkerd.io/inject: enabled
spec:
  template:
    metadata:
      annotations:
        linkerd.io/inject: enabled

Template 3 : Service Profile avec Retries

apiVersion: 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 non retryable par défaut
      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

Template 4 : Traffic Split (Canary)

apiVersion: 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%

Template 5 : Server Authorization Policy

# Définir le serveur
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
---
# Autoriser le trafic depuis des clients spécifiques
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
---
# Autoriser le trafic non authentifié (ex : depuis l'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

Template 6 : HTTPRoute pour le Routage Avancé

apiVersion: 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

Template 7 : Configuration Multi-cluster

# Sur chaque cluster, installer avec les credentials du cluster
linkerd multicluster install | kubectl apply -f -

# Lier les clusters
linkerd multicluster link --cluster-name west \
  --api-server-address https://west.example.com:6443 \
  | kubectl apply -f -

# Exporter un service vers d'autres clusters
kubectl label svc/my-service mirror.linkerd.io/exported=true

# Vérifier la connectivité cross-cluster
linkerd multicluster check
linkerd multicluster gateways

Commandes de Monitoring

# Vue du trafic en direct
linkerd viz top deploy/my-app

# Métriques par route
linkerd viz routes deploy/my-app

# Vérifier le statut du proxy
linkerd viz stat deploy -n my-namespace

# Afficher les dépendances entre services
linkerd viz edges deploy -n my-namespace

# Tableau de bord
linkerd viz dashboard

Débogage

# Vérifier le statut d'injection
linkerd check --proxy -n my-namespace

# Afficher les logs du proxy
kubectl logs deploy/my-app -c linkerd-proxy

# Déboguer identity/TLS
linkerd identity -n my-namespace

# Tap le trafic (en direct)
linkerd viz tap deploy/my-app --to deploy/my-backend

Bonnes Pratiques

À Faire

  • Activer mTLS partout - C'est automatique avec Linkerd
  • Utiliser les ServiceProfiles - Obtenir les métriques par route et les retries
  • Configurer les retry budgets - Prévenir les storms de retries
  • Monitorer les golden metrics - Success rate, latency, throughput

À Éviter

  • Ne pas sauter le check - Toujours exécuter linkerd check après les changements
  • Ne pas sur-configurer - Les défauts de Linkerd sont sensés
  • Ne pas ignorer les ServiceProfiles - Ils déverrouillent les fonctionnalités avancées
  • Ne pas oublier les timeouts - Définir des valeurs appropriées par route

Skills similaires