Активация Istio для приложений возможна, если в кластере включен и настроен модуль istio. За это отвечает администратор кластера.
Суть активации — добавить сайдкар-контейнер к подам приложения, после чего Istio сможет управлять трафиком.
Рекомендованный способ добавления сайдкаров — использовать сайдкар-injector. Istio умеет «подселять» к подам приложения сайдкар-контейнер с помощью механизма Admission Webhook. Для добавления сайдкаров используются лейблы и аннотации:
- Лейбл к
namespace— обозначает ваше пространство имён для компонента сайдкар-injector. После применения лейбла к новым подам будут добавлены сайдкар-контейнеры:istio-injection=enabled— использует глобальную версию Istio (spec.settings.globalVersionв ресурсе ModuleConfig);istio.io/rev=v1x16— использует конкретную версию Istio для этого пространства имён.
- Аннотация к поду
sidecar.istio.io/inject("true"или"false") позволяет локально переопределить политикуsidecarInjectorPolicy. Эти аннотации работают только в пространствах имён, обозначенных лейблами из списка выше.
Также существует возможность добавить сайдкар к определенному поду в пространстве имён без установленных лейблов istio-injection=enabled или istio.io/rev=vXxYZ путем установки лейбла sidecar.istio.io/inject=true.
Istio-proxy, который работает в качестве сайдкар-контейнера, тоже потребляет ресурсы и добавляет накладные расходы:
- Каждый запрос DNAT’ится в Envoy, который обрабатывает это запрос и создает еще один. На принимающей стороне — аналогично.
- Каждый Envoy хранит информацию обо всех сервисах в кластере, что требует памяти. Больше кластер — больше памяти потребляет Envoy. Решение — кастомный ресурс Sidecar.
Также важно подготовить Ingress-контроллер и Ingress-ресурсы приложения:
- Включите
enableIstioSidecarу ресурса IngressNginxController. - Добавьте аннотации на Ingress-ресурсы приложения:
nginx.ingress.kubernetes.io/service-upstream: "true"— Ingress-контроллер в качестве upstream использует ClusterIP сервиса вместо адресов подов. Балансировкой трафика между подами теперь занимается сайдкар-proxy. Используйте эту опцию, только если у вашего сервиса есть ClusterIP;nginx.ingress.kubernetes.io/upstream-vhost: "myservice.myns.svc"— сайдкар-proxy Ingress-контроллера принимает решения о маршрутизации на основе заголовкаHost. Без этой аннотации контроллер оставит заголовок с адресом сайта, напримерHost: example.com.