Активация 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
.