Что такое Service Mesh в контексте Kubernetes?

«Что такое Service Mesh в контексте Kubernetes?» — вопрос из категории Kubernetes, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Service Mesh — это выделенный инфраструктурный слой, предназначенный для управления, наблюдения и обеспечения безопасности сетевого взаимодействия между микросервисами (pod-ами) в кластере Kubernetes. Его основная задача — вынести сквозные функциональные требования (cross-cutting concerns) из кода приложения в конфигурируемую платформу.

Ключевые возможности, которые предоставляет Service Mesh:

  • Умная маршрутизация трафика: Canary-деплойменты, A/B-тестирование, постепенный roll-out, инжекция ошибок для тестирования отказоустойчивости.
  • Безопасность: Сквозное шифрование трафика между сервисами с использованием взаимного TLS (mTLS) без изменений в коде приложения.
  • Наблюдаемость (Observability): Автоматический сбор детализированных метрик, распределенной трассировки (tracing) и логов для всего межсервисного трафика.
  • Надежность: Автоматические повторные попытки, таймауты, ограничители запросов (circuit breakers) и отказоустойчивая балансировка нагрузки.

Архитектура: Чаще всего реализуется по модели sidecar-прокси. Рядом с каждым pod-ом вашего приложения внедряется легковесный прокси-контейнер (например, Envoy в Istio). Весь входящий и исходящий сетевой трафик приложения проходит через этот прокси, который и применяет все политики mesh.

Пример (Istio): Настройка canary-развертывания.

Допустим, у вас есть Deployment myapp с версией v1 (метка version: v1). Вы развернули новую версию v2. VirtualService и DestinationRule направляют 90% трафика на v1 и 10% на v2.

# DestinationRule определяет подмножества (subsets) на основе меток pod-ов.
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: myapp
spec:
  host: myapp-svc.namespace.svc.cluster.local
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2
---
# VirtualService определяет правила маршрутизации между подмножествами.
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: myapp
spec:
  hosts:
  - myapp-svc.namespace.svc.cluster.local
  http:
  - route:
    - destination:
        host: myapp-svc.namespace.svc.cluster.local
        subset: v1
      weight: 90
    - destination:
        host: myapp-svc.namespace.svc.cluster.local
        subset: v2
      weight: 10

Популярные реализации: Istio, Linkerd, Consul Connect. Выбор зависит от требований к сложности, производительности и ресурсоемкости.