Реализация Service Mesh (Istio/Linkerd) для микросервисов
Service Mesh — инфраструктурный слой для управления межсервисным трафиком в Kubernetes. Вместо того чтобы каждый микросервис самостоятельно реализовывал retry, timeout, mTLS и трейсинг, эти функции выносятся в sidecar-прокси, прозрачный для кода сервиса.
Что даёт Service Mesh
Traffic Management:
- Canary deployment (5% трафика → новая версия)
- A/B тестирование по заголовкам
- Circuit breaker на уровне инфраструктуры
- Retry и timeout без изменения кода
Observability:
- Автоматический трейсинг всех запросов между сервисами
- Метрики latency, error rate, throughput для каждой пары сервисов
- Граф зависимостей сервисов (Service Graph)
Security:
- mTLS между всеми сервисами без изменения кода
- Certificate rotation
- Authorization Policies
Istio vs Linkerd
| Критерий | Istio | Linkerd |
|---|---|---|
| Прокси | Envoy (тяжёлый, мощный) | Linkerd2-proxy (лёгкий, Rust) |
| Потребление RAM | 300–500 МБ на sidecar | 10–30 МБ на sidecar |
| Сложность | Высокая | Умеренная |
| Возможности | Полный набор | Основные функции |
| Кривая обучения | Крутая | Более пологая |
Linkerd — для команд, которым нужны mTLS, observability и basic traffic management без изучения сотни CRD Istio.
Установка Linkerd
# Установка CLI
curl --proto '=https' --tlsv1.2 -sSfL https://run.linkerd.io/install | sh
# Проверка кластера
linkerd check --pre
# Установка control plane
linkerd install --crds | kubectl apply -f -
linkerd install | kubectl apply -f -
# Проверка
linkerd check
Инъекция sidecar (аннотация на namespace):
apiVersion: v1
kind: Namespace
metadata:
name: production
annotations:
linkerd.io/inject: enabled
После этого все поды в namespace автоматически получают linkerd-proxy контейнер.
Istio Traffic Management
Canary Deployment — постепенный выкат новой версии:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: order-service
spec:
hosts:
- order-service
http:
- match:
- headers:
x-canary:
exact: "true"
route:
- destination:
host: order-service
subset: v2
- route:
- destination:
host: order-service
subset: v1
weight: 95
- destination:
host: order-service
subset: v2
weight: 5
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: order-service
spec:
host: order-service
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
trafficPolicy:
connectionPool:
http:
http2MaxRequests: 1000
outlierDetection:
consecutiveErrors: 5
interval: 10s
baseEjectionTime: 30s
Circuit Breaker через DestinationRule:
spec:
trafficPolicy:
outlierDetection:
consecutiveGatewayErrors: 5
interval: 10s
baseEjectionTime: 30s
maxEjectionPercent: 100
connectionPool:
tcp:
maxConnections: 100
http:
http1MaxPendingRequests: 100
http2MaxRequests: 1000
mTLS
В Istio mTLS включается per-namespace или глобально:
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: default
namespace: production
spec:
mtls:
mode: STRICT # только mTLS, plaintext запрещён
Authorization Policy — кто может вызывать кого:
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: order-service-policy
namespace: production
spec:
selector:
matchLabels:
app: order-service
rules:
- from:
- source:
principals: ["cluster.local/ns/production/sa/api-gateway"]
to:
- operation:
methods: ["GET", "POST"]
Observability через Kiali
Kiali — UI для Istio, показывает Service Graph:
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.20/samples/addons/kiali.yaml
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.20/samples/addons/jaeger.yaml
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.20/samples/addons/prometheus.yaml
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.20/samples/addons/grafana.yaml
istioctl dashboard kiali
Сроки реализации
- Установка Linkerd + базовая observability — 3–5 дней
- Установка Istio + canary routing + mTLS — 1–2 недели
- Настройка authorization policies и полная observability stack — ещё 1 неделя







