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 checkaprè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