Посмотреть выступление с докладом по этой теме также можно посмотреть здесь.
В течение года мы опробовали гипотезу, что Service Mesh — это, в принципе, классное направление, куда нам хочется идти. Поэтому один велосипед мы заменили на второй и назвали его Navigator. С ним мы прожили еще несколько лет до конца 2022 года. За это время к нам прилетали все новые и новые требования от бизнеса.
Netra представляла собой легковесное решение (<2000 строк Go-кода) без Control Plane. Данная sidecar-прокси прозрачно обрабатывала весь входящий и исходящий трафик из приложения, автоматически собирала метрики и трейсы и обеспечивала базовую маршрутизацию.
Представьте, что у нас много сервисов и разработчиков. Одновременно несколько разработчиков хотят разрабатывать один и тот же сервис — обновить его код, выкатить свои изменения и проверить их в определенном staging окружении. Когда людей становится много, начинается толкание локтями. Нужно либо договариваться о каком-то расписании, мол «я беру сервис с двух до трех часов дня, пожалуйста, не мешайте», либо иметь много изолированных staging окружений, чтобы каждый нашел себе место, где можно что-то протестировать. Данный подход плохо масштабируется с ростом компании.
Navigator представляет из себя тот самый Control Plane, который обращается к API Kubernetes, получает информацию про поды и ресурсы, необходимые для конфигурации, и готовит конфигурацию для envoy. envoy — это уже реализованная прокси, которая будет запущена в каждом поде рядом с настоящим приложением в роли сайдкара.
Наши собственные ресурсы — это Canary, который банально контролировал, какой процент канарейки нужно пустить на новую версию приложения, и Nexus.
apiVersion: v1items:- apiVersion: navigator.avito.ru/v1kind: Nexusmetadata:...spec:appName: cars-service-catalog-2119-stagingcookieAffinity: ""downstreams:- name: cars-service-catalog-2119-stagingnamespace: cars-serviceheaderAffinity: ""inboundPorts:- name: httpport: 8890mTLS:enabled: truespiffeID: spiffe://company/hs/cars-service/service/non-prodrateLimit:enabled: falseport: 15011serviceName: cars-serviceservices:- namespace: toggles- namespace: geo-locator- namespace: image-classifier- namespace: ab-tests- namespace: delivery-layout- namespace: cars-storage- namespace: user-profile- namespace: cars-service
Но базовый HTTPS не решает проблему доверия клиенту. Сервер не знает, кто именно к нему подключился. Для решения этой задачи существует расширение протокола TLS, которое называется Mutual TLS. Теперь сертификат будет не только у сервера, но и у клиента тоже.
[[policy]]description = "Ограничить доступ к РТГ данным"endpoints = ["грс:get","грс:getAll","http:put:/user/*/update","http:post/user","http:get/user/*/payments",]clients = [# сервисы"atlas","admin-api",# пользователи"user:ipivanov",# ЮНИТЫ"user.unit:paas",]
Если интересна тема межсервисной авторизации, доклад про это можно послушать здесь.
Если тема безопасности вам тоже интересна, то мы рассказывали про нее здесь.
Но форкнуть может каждый. Вопрос: как этот форк дальше поддерживать? Тут нам помогает то, что Service Mesh — это не та штука, которую хочется часто обновлять.