Сервис-меш: Istio, Linkerd и когда он нужен

Рейтинг: 62.3% · 11 голосов
Kubernetes для разработчиков: поды, деплойменты, сервисы, ingress, конфиги и отладка. Уроки по главам с обсуждением.
Ответить
Аватара пользователя
anton_k8s
Сообщения: 55
Зарегистрирован: 12 май 2026, 03:23

Сервис-меш: Istio, Linkerd и когда он нужен

Сообщение anton_k8s »

Оглавление курса (48)
  1. Зачем нужен Kubernetes и из чего состоит кластер
  2. Поднимаем локальный кластер: minikube и kind
  3. Поды: базовая единица запуска
  4. Deployment и ReplicaSet: управляем репликами
  5. Service: сетевой доступ к подам
  6. ConfigMap и Secret: выносим конфигурацию
  7. Ingress: пускаем трафик снаружи
  8. Хранилище: Volumes и PersistentVolumeClaim
  9. Namespaces, requests и limits
  10. Health checks: liveness и readiness пробы
  11. Отладка: почему под не стартует
  12. Helm: пакетный менеджер для Kubernetes
  13. Базовая безопасность: RBAC и доступы
  14. Job и CronJob: разовые и периодические задачи
  15. StatefulSet и DaemonSet: stateful-нагрузки и системные агенты
  16. Стратегии обновления и планирование: rollout и rollback, graceful shutdown, nodeSelector, affinity, taints
  17. Автомасштабирование: HPA по метрикам, обзор VPA и Cluster Autoscaler
  18. Наблюдаемость: логи, метрики, events, обзор Prometheus и Grafana
  19. Безопасность глубже: securityContext, Pod Security Standards, NetworkPolicy, шифрование секретов
  20. Архитектура control plane: api-server, etcd, scheduler
  21. Узел кластера: kubelet, kube-proxy и container runtime
  22. Декларативная модель: reconciliation, контроллеры, CRD
  23. kubectl профессионально: get, describe, explain, jsonpath
  24. Под глубже: init, sidecar, lifecycle hooks и QoS
  25. Метки, селекторы и организация ресурсов
  26. Сервисы и kube-proxy глубже: типы, IPVS, EndpointSlices
  27. Ingress, ingress-контроллеры и Gateway API
  28. Секреты в кластере: шифрование, External Secrets, Vault
  29. Хранилище глубже: PV, StorageClass, CSI и StatefulSet
  30. Сеть кластера: CNI, NetworkPolicy и CoreDNS
  31. Планировщик: affinity, taints, topology spread
  32. Ресурсы, QoS и вытеснение: requests, limits, eviction
  33. Helm глубже: шаблоны, хуки, зависимости, OCI
  34. Kustomize и управление конфигурацией без шаблонов
  35. RBAC и аутентификация глубже
  36. Admission и Pod Security: контроль на входе
  37. Policy as code: Kyverno и OPA Gatekeeper
  38. GitOps: Argo CD и Flux
  39. Операторы и CRD: расширяем Kubernetes
  40. Сервис-меш: Istio, Linkerd и когда он нужен (вы здесь)
  41. Эксплуатация кластера: апгрейд, узлы, бэкап etcd
  42. Где запускать кластер: managed, self-hosted, k3s, Deckhouse
  43. Траблшутинг кластера: Pending, CrashLoop, узлы NotReady
  44. Стоимость и эффективность кластера: FinOps
  45. CI/CD в Kubernetes: сборка, деплой, прогрессивные релизы
  46. Лучшие практики и антипаттерны Kubernetes
  47. Сквозной проект и путь дальше: от манифеста до прода
  48. Деплой приложений через Argo CD: Application, sync и App-of-Apps
Представь: у тебя в кластере не три сервиса, а сорок. Платёжка ходит в каталог, каталог в инвентарь, инвентарь в кэш, кэш падает - и пол-системы виснет, потому что вызовы не отваливаются по таймауту, а тупо ждут. Безопасники требуют шифрование трафика между подами, но переписывать TLS в каждом сервисе на пяти языках никто не будет. Тимлид хочет выкатить новую версию на 5 процентов трафика и откатить, если вырастут ошибки. И всем нужны метрики "какой сервис кому звонит и сколько 500-х", но в код их добавлять долго. Вот это - ровно та боль, которую закрывает service mesh. В этом уроке разберём, как он устроен под капотом, чем istio отличается от linkerd, что такое sidecarless-революция 2026 года, и - главное - когда kubernetes mesh реально нужен, а когда это оверинжиниринг, за который ты потом будешь расплачиваться бессонными ночами.

Что такое service mesh и какую проблему он решает

Service mesh - это инфраструктурный слой, который перехватывает весь сетевой трафик между твоими сервисами и берёт на себя то, что иначе пришлось бы зашивать в каждое приложение: шифрование, ретраи, таймауты, балансировку, сбор метрик и трассировку. Ключевая идея - вынести сетевую логику ИЗ кода приложения в отдельный прокси, который живёт рядом с подом и о котором приложение даже не знает.

Меш делится на два слоя. Data plane (плоскость данных) - это армия прокси, через которые реально течёт трафик. Control plane (плоскость управления) - мозг, который раздаёт прокси конфигурацию: куда маршрутизировать, какие сертификаты использовать, какие политики применять. Прокси не знают друг про друга напрямую - они получают актуальную картину мира от control plane. Поменял ты правило маршрутизации через CRD - control plane пересчитал конфиг и разослал его всем прокси за секунды, без рестарта приложений.

Классическая реализация data plane - это sidecar: в каждый под рядом с твоим контейнером инжектится контейнер-прокси (обычно Envoy). Через iptables или eBPF весь входящий и исходящий трафик пода заворачивается в этот прокси. Приложение думает, что коннектится к localhost, а на деле прокси устанавливает mTLS-туннель до прокси соседнего пода. Отсюда волшебство: шифрование и метрики появляются "бесплатно", без единой строки в коде.

Изображение

mTLS, трафик-менеджмент и наблюдаемость - три кита

Разберём, ЧТО конкретно даёт меш, потому что без понимания ценности невозможно решить, нужен ли он.

1. mTLS между сервисами. Mutual TLS - это взаимная аутентификация: не только клиент проверяет сервер, но и сервер проверяет клиента по сертификату. В обычном кластере трафик между подами идёт открытым текстом по приватной сети - кто пролез внутрь, читает всё. Меш выдаёт каждому сервису криптографическую identity (по стандарту SPIFFE, вида spiffe://cluster.local/ns/prod/sa/payments) и автоматически ротирует короткоживущие сертификаты. Так mtls kubernetes из мучительного ручного управления PKI превращается в дефолт. Это базовый кирпич zero-trust: сервис A может звонить сервису B не потому, что они в одной сети, а потому что предъявил валидный сертификат с нужной identity.

2. Трафик-менеджмент. Тут меш раскрывается на полную:
  • Canary / weighted routing - льёшь 5 процентов трафика на v2, 95 на v1, смотришь метрики, плавно сдвигаешь вес. Откат - смена одной цифры в конфиге.
  • Retries - прокси сам повторяет неудавшийся запрос (например, на другой инстанс), приложение об этом не знает.
  • Timeouts - жёсткий потолок ожидания, чтобы один тормозящий сервис не подвесил всю цепочку.
  • Circuit breaking - если инстанс сыпет ошибками, прокси временно выкидывает его из пула, давая отлежаться. Это спасает от каскадных отказов.
  • Fault injection - можно искусственно вносить задержки и ошибки, чтобы проверить устойчивость (chaos-инженерия без отдельных тулов).
3. Наблюдаемость без правки кода. Раз весь трафик идёт через прокси, меш бесплатно отдаёт золотые сигналы (RPS, latency, доля ошибок) по каждой паре сервисов, плюс заголовки для distributed tracing. Дальше Prometheus собирает метрики, Grafana и Kiali рисуют граф сервисов, Jaeger показывает трейсы. Ты буквально видишь топологию системы и где затык - не дописав ни строчки инструментирования в приложение.

Sidecar против ambient: тренд 2026 на sidecarless

Классический sidecar платит дорого. На каждый под - отдельный контейнер Envoy, а это память (десятки-сотни мегабайт на под), CPU, лишний сетевой хоп туда-обратно и, главное, операционная боль: обновил версию меша - надо передёрнуть (рестартнуть) ВСЕ поды, чтобы подтянулся новый прокси. На тысяче подов это тяжело.

Ответ индустрии в 2025-2026 - ambient mesh (sidecarless), который в Istio дошёл до GA. Идея: убрать прокси из подов и разнести функции по двум уровням.
  • ztunnel (zero-trust tunnel) - лёгкий прокси на Rust, запущенный как DaemonSet, один на ноду. Он берёт на себя L4: mTLS, SPIFFE-identity, шифрование и базовые L4-политики для всех подов ноды. Это дёшево и включается на весь кластер без трогания приложений.
  • Waypoint - опциональный L7-прокси (Envoy), который поднимается на namespace или сервис ТОЛЬКО когда нужны умные L7-функции: HTTP-роутинг, ретраи, canary, L7-авторизация. Не нужен L7 - не платишь за него.
Выигрыш по ресурсам в ambient заявляют в районе 70 процентов против sidecar, плюс снимается боль "рестартни всё ради апгрейда". Параллельно Cilium идёт ещё радикальнее: его data plane живёт в ядре Linux через eBPF, прокси для L4 в принципе не нужен, а Envoy поднимается по одному на ноду только под L7. Kernel-space обработка - самая быстрая по latency, плюс Hubble даёт сетевую наблюдаемость на уровне DNS/HTTP/gRPC почти даром.
Правило большого пальца на 2026: если ставишь меш с нуля - сразу смотри в сторону ambient/sidecarless, а не классических sidecar. Меньше оверхеда, проще эксплуатация, легче апгрейды.
istio против linkerd: мощь против простоты

Два самых известных меша воплощают две философии.

istio - швейцарский нож. Data plane на Envoy, богатейший трафик-менеджмент, мульти-кластер и мульти-сеть, самая зрелая модель авторизации (важно для SOC 2, PCI-DSS, HIPAA), VM-воркоады вне кластера, ambient-режим. За мощь платишь сложностью: десятки CRD, кривая обучения крутая, неаккуратная конфигурация легко стреляет в ногу. istio - выбор, когда у тебя реально сложные требования и есть кому его эксплуатировать.

linkerd - меш-минималист, выпускник CNCF. Свой собственный микропрокси на Rust (не Envoy), за счёт чего он очень лёгкий и быстрый. mTLS включён по умолчанию из коробки, конфигурация минимальна, дашборд чистый и про золотые сигналы, а не про тонну ручек. linkerd сознательно отказывается от части тяжёлых фич ради того, чтобы его можно было поставить и забыть. Это выбор, когда тебе нужны mTLS, наблюдаемость и базовая надёжность без операционного ада.

Грубая развилка: нужен максимум контроля над трафиком, мульти-кластер, строгий compliance - istio. Нужны mTLS и метрики с минимальным оверхедом и без отдельного инженера на поддержку - linkerd. Нужна максимальная производительность и ты уже на eBPF-CNI - смотри Cilium.

Практика: ставим linkerd и включаем mTLS

Покажу на linkerd - он быстрее всего доводится до рабочего состояния. Сначала ставим CLI и проверяем готовность кластера:

Код: Выделить всё

curl -sL https://run.linkerd.io/install | sh
linkerd check --pre

Код: Выделить всё

kubernetes-api
--------------
v can initialize the client
v can query the Kubernetes API

pre-kubernetes-setup
--------------------
v can create Namespaces
v can create ClusterRoles
...
Status check results are v
Каждая строка с v (галочка) - пройденная проверка. Если хоть одна выпала в x, дальше не лезь: linkerd прямо подскажет, чего не хватает (прав, версии API). Ставим CRD, control plane и наблюдаемость:

Код: Выделить всё

linkerd install --crds | kubectl apply -f -
linkerd install | kubectl apply -f -
linkerd check
linkerd viz install | kubectl apply -f -
Теперь самое важное - меш не трогает поды сам по себе. Чтобы в под заинжектился прокси, на namespace или деплой вешается аннотация. Включаем меш на namespace и передёргиваем рабочие нагрузки:

Код: Выделить всё

kubectl annotate namespace prod linkerd.io/inject=enabled
kubectl rollout restart deployment -n prod
После рестарта в каждом поде станет на один контейнер больше. Проверим:

Код: Выделить всё

kubectl get pod -n prod
NAME                        READY   STATUS    RESTARTS   AGE
payments-7c9f8b6d4-2xk9p    2/2     Running   0          40s
Обрати внимание на колонку READY: 2/2 - это твой контейнер плюс linkerd-proxy. Был бы 1/1 - прокси не заинжектился, аннотацию или рестарт прозевал. Убедимся, что трафик реально шифруется:

Код: Выделить всё

linkerd viz edges deployment -n prod
SRC        DST        SRC_NS   DST_NS   SECURED
catalog    payments   prod     prod     v
checkout   catalog    prod     prod     v
Колонка SECURED с галочкой - между этими сервисами поднят mTLS. Никакой код не правился: identity, сертификаты и их ротация - на control plane. Это и есть тот самый kubernetes mesh в действии.

Типичные грабли и антипаттерны
  • Меш ради меша. Главный антипаттерн. На пять микросервисов ставить istio - значит получить больше движущихся частей, чем самих сервисов. Сложность инфраструктуры превысит сложность бизнес-логики.
  • Забыл аннотацию инжекции. Поставил меш, а поды как были 1/1, так и остались. Меш не магия - без аннотации и рестарта прокси не появится, трафик идёт открытым текстом, а ты думаешь, что под защитой.
  • Жёсткий таймаут без ретраев и наоборот. Поставил агрессивные ретраи на не-идемпотентный POST - словил дубли платежей. Ретраи безопасны только для идемпотентных операций, это надо проектировать осознанно.
  • Игнор оверхеда. Каждый sidecar - это +хоп и +память на под. На больших масштабах считай ресурсы заранее или сразу бери ambient/sidecarless.
  • Mesh-only Ingress на границе. Меш отвечает за восток-запад трафик (между сервисами). На входе с улицы (север-юг) всё равно нужен Gateway API или Ingress. Меш их не заменяет.
  • Апгрейд sidecar-меша без плана. Новая версия требует рестарта всех подов с прокси. На большом кластере это надо катить волнами, а не одним rollout на всё.
Когда меш оправдан, а когда оверинжиниринг и какие альтернативы

Service mesh оправдан, когда: сервисов МНОГО (десятки и больше), есть жёсткое требование mTLS/zero-trust по всему трафику, нужен тонкий трафик-менеджмент (canary, circuit breaking) для многих сервисов, нужна сквозная наблюдаемость графа сервисов, и - критично - у тебя есть команда, готовая это эксплуатировать.

Меш - оверинжиниринг, когда сервисов мало, трафик простой, а compliance не требует mTLS. В этом случае альтернативы дешевле и достаточны:
  • Gateway API - современный преемник Ingress, закрывает маршрутизацию и TLS-терминацию на входе. Часть задач "управления трафиком" решается им без меша.
  • Библиотеки и фреймворки - ретраи, таймауты, circuit breaking можно взять из библиотек (resilience-паттерны в самом приложении). Минус - надо тащить на каждом языке и править код, плюс - ноль инфраструктурного оверхеда.
  • NetworkPolicy + WireGuard на уровне CNI - шифрование нода-нода и сегментация сети без полноценного меша.
  • Cilium как CNI - даёт часть mesh-функций (L7-политики, наблюдаемость через Hubble) почти бесплатно, если он уже твой сетевой плагин.
Простое правило: начинай без меша. Когда боль "не вижу, кто кому звонит", "нужен mTLS везде" и "хочу canary на десяти сервисах" становится системной - тогда вводи меш, и желательно в ambient-режиме.

Мини-лаба: пощупай меш руками
  • Подними локальный кластер (k3d, kind или Yandex Managed Kubernetes / VK Cloud для облака).
  • Установи linkerd: linkerd install --crds | kubectl apply -f -, затем control plane и viz.
  • Задеплой demo-приложение из двух-трёх сервисов, навесь на namespace аннотацию linkerd.io/inject=enabled и сделай rollout restart.
  • Проверь, что поды стали 2/2, а linkerd viz edges deployment показывает SECURED с галочкой.
  • Открой linkerd viz dashboard и найди граф сервисов, RPS и долю успешных ответов.
  • Бонус: разверни istio в ambient-режиме (istioctl install --set profile=ambient), пометь namespace меткой ambient и убедись, что mTLS поднялся БЕЗ единого sidecar в подах.
Контрольные вопросы
  • Чем data plane отличается от control plane и что из них реально пропускает через себя трафик?
  • Что даёт mTLS в меше и почему его сложно сделать руками без меша?
  • В чём принципиальная разница между sidecar и ambient (ztunnel + waypoint) по ресурсам и эксплуатации?
  • Назови две ситуации, где меш - оверинжиниринг, и чем его заменить.
Итог

Service mesh - это инфраструктурный слой из прокси (data plane) и мозга (control plane), который даёт mTLS, трафик-менеджмент и наблюдаемость без правки кода приложений. istio - мощный и сложный, linkerd - простой и лёгкий, а тренд 2026 - sidecarless: ambient в Istio (ztunnel + waypoint) и eBPF в Cilium режут оверхед и боль апгрейдов. Меш оправдан на десятках сервисов с требованиями к безопасности и трафику, но на маленькой системе это оверинжиниринг - там хватит Gateway API и библиотек. Главное правило: вводи меш не потому, что модно, а когда боль стала системной.
👍2 ❤️6 🔥2 😄 🤔2
Аватара пользователя
asyncenjoyer
Сообщения: 1
Зарегистрирован: 23 май 2026, 09:20

Re: Сервис-меш: Istio, Linkerd и когда он нужен

Сообщение asyncenjoyer »

Поставил linkerd на тестовый namespace, поды стали 2/2 и edges показывает SECURED - реально mTLS из коробки, код не трогал. Спасибо за разбор колонки READY, без этого бы не понял что прокси не заинжектился.
👍 ❤️ 🔥 😄 🤔2
Аватара пользователя
debiankun
Сообщения: 1
Зарегистрирован: 14 май 2026, 07:02

Re: Сервис-меш: Istio, Linkerd и когда он нужен

Сообщение debiankun »

А вот про ambient вопрос: если ztunnel один на ноду делает L4 mTLS, а waypoint поднимается только под L7 - получается на кластере где всем нужны только ретраи waypoint все равно везде нужен? Или можно точечно по namespace?
👍 ❤️2 🔥1 😄 🤔
Ответить
← Предыдущая глава
Операторы и CRD: расширяем Kubernetes
Следующая глава →
Эксплуатация кластера: апгрейд, узлы, бэкап etcd

Все главы курса «Kubernetes: оркестрация контейнеров от основ до продакшена»

Поделиться темой: ✈ Telegram VK

Вернуться в «Kubernetes на практике»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость