Налаштування waypoint-проксі
Waypoint-проксі є необовʼязковим розгортанням проксі на основі Envoy, що додає обробку на рівні 7 (L7) для визначеного набору робочих навантажень.
Waypoint-проксі встановлюються, оновлюються та масштабуються незалежно від застосунків; власник застосунку не повинен бути обізнаний про їх існування. У порівнянні з режимом панелі даних на основі sidecar, який запускає екземпляр проксі Envoy поруч з кожним робочим навантаженням, кількість необхідних проксі може бути суттєво зменшена.
Waypoint-проксі або їх набір може бути спільним для кількох застосунків, що мають спільний контур безпеки. Це можуть бути всі екземпляри конкретного робочого навантаження або всі робочі навантаження в просторі імен.
На відміну від режиму sidecar, у режимі ambient політики виконуються точкою призначення. У багатьох аспектах waypoint діє як шлюз до ресурсу (простір імен, сервіс або pod). Istio забезпечує, щоб увесь трафік, що надходить до ресурсу, проходив через waypoint, який потім забезпечує дотримання всіх політик для цього ресурсу.
Чи потрібен вам waypoint-проксі?
Багаторівневий підхід режиму оточення дозволяє користувачам впроваджувати Istio більш поступово, плавно переходячи від відсутності mesh, до захищеного L4 overlay і до повної обробки L7.
Більшість функцій режиму ambient забезпечуються вузловим проксі ztunnel. Ztunnel обмежується обробкою трафіку на рівні 4 (L4), тому він може безпечно працювати як спільний компонент.
Коли ви налаштовуєте перенаправлення на waypoint, трафік буде переспрямовуватись ztunnel до waypoint. Якщо вашим застосункам потрібні будь-які з наступних функцій mesh на рівні L7, вам знадобиться waypoint-проксі:
- Управління трафіком: HTTP-маршрутизація та балансування навантаження, аварійне відновлення, обмеження швидкості, введення збоїів, повторні спроби, тайм-аути
- Безпека: Розширені політики авторизації на основі L7-примітивів, таких як тип запиту або HTTP-заголовок
- Спостережуваність: HTTP-метрики, логування доступу, трейсинг
Розгортання waypoint-проксі
Waypoint-проксі розгортаються за допомогою ресурсів Kubernetes Gateway.
Зверніть увагу, що CRD Kubernetes Gateway API стандартно не встановлені в більшості кластерів Kubernetes, тому переконайтеся, що вони встановлені перед використанням Gateway API:
$ kubectl get crd gateways.gateway.networking.k8s.io &> /dev/null || \
{ kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.2.0/standard-install.yaml; }
Ви можете використовувати підкоманди istioctl waypoint для створення, застосування або перегляду цих ресурсів.
Після розгортання waypoint весь простір імен (або будь-які обрані вами сервіси чи podʼи) мають бути зареєстровані для використання waypoint.
Перш ніж розгортати waypoint-проксі для конкретного простору імен, переконайтеся, що простір імен позначено міткою istio.io/dataplane-mode: ambient
:
$ kubectl get ns -L istio.io/dataplane-mode
NAME STATUS AGE DATAPLANE-MODE
istio-system Active 24h
default Active 24h ambient
istioctl
може згенерувати ресурс Kubernetes Gateway для waypoint-проксі. Наприклад, щоб згенерувати waypoint-проксі з назвою waypoint
для простору імен default
, що може обробляти трафік для сервісів у цьому просторі імен:
$ istioctl waypoint generate --for service -n default
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
labels:
istio.io/waypoint-for: service
name: waypoint
namespace: default
spec:
gatewayClassName: istio-waypoint
listeners:
- name: mesh
port: 15008
protocol: HBONE
Зверніть увагу, що ресурс Gateway має мітку istio-waypoint
, встановлену на gatewayClassName
, що вказує на те, що це waypoint, надано Istio. Ресурс Gateway позначений міткою istio.io/waypoint-for: service
, що вказує на те, що waypoint може обробляти трафік для сервісів, що є стандартним налаштуванням.
Для безпосереднього розгортання waypoint-проксі використовуйте apply
замість generate
:
$ istioctl waypoint apply -n default
waypoint default/waypoint applied
Або ви можете розгорнути згенерований ресурс Gateway:
$ kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
labels:
istio.io/waypoint-for: service
name: waypoint
namespace: default
spec:
gatewayClassName: istio-waypoint
listeners:
- name: mesh
port: 15008
protocol: HBONE
EOF
Після застосування ресурсу Gateway, Istiod буде контролювати цей ресурс, розгортати та керувати відповідним розгортанням і обслуговуванням waypoint для користувачів автоматично.
Типи трафіку waypoint
Стандартно waypoint буде обробляти тільки трафік, що призначений для сервісів у своєму просторі імен. Це рішення було прийняте тому, що трафік, спрямований лише до podʼа, є рідкісним і часто використовується для внутрішніх цілей, таких як збір даних Prometheus, а додаткове навантаження на обробку на рівні L7 може бути небажаним.
Також можливо, щоб waypoint обробляв весь трафік, лише трафік, спрямований безпосередньо до робочих навантажень (podʼів або віртуальних машин) у кластері, або жоден трафік. Типи трафіку, які будуть перенаправлені до waypoint, визначаються міткою istio.io/waypoint-for
на обʼєкті Gateway
.
Використовуйте аргумент --for
у команді istioctl waypoint apply
, щоб змінити типи трафіку, які можуть бути перенаправлені на waypoint:
Значення waypoint-for | Початковий тип призначення |
---|---|
service | Сервіси Kubernetes |
workload | IP podʼів або IP віртуальних машин |
all | Трафік як сервісів, так і робочих навантажень |
none | Жоден трафік (корисно для тестування) |
Вибір waypoint здійснюється на основі типу призначення, service
або workload
, до якого трафік був спочатку адресований. Якщо трафік адресовано до сервісу, який не має waypoint, перехід через waypoint не відбудеться: навіть якщо кінцевий робочий процес, до якого він потрапляє, має прикріплений waypoint.
Використання waypoint-проксі
Коли waypoint-проксі розгорнуто, він не використовується жодними ресурсами, поки ви явно не налаштуєте ці ресурси на його використання.
Щоб увімкнути використання waypoint для простору імен, сервісу або podʼа, додайте мітку istio.io/use-waypoint
з назвою waypoint як значенням.
Якщо ви використовуєте istioctl
для розгортання waypoint для простору імен, ви можете використовувати параметр --enroll-namespace
, щоб автоматично позначити простір імен:
$ istioctl waypoint apply -n default --enroll-namespace
waypoint default/waypoint applied
namespace default labeled with "istio.io/use-waypoint: waypoint"
Альтернативно, ви можете додати мітку istio.io/use-waypoint: waypoint
до простору імен default
за допомогою kubectl
:
$ kubectl label ns default istio.io/use-waypoint=waypoint
namespace/default labeled
Після того як простір імен буде зареєстрований для використання waypoint, будь-які запити від podʼів, що використовують режим панелі даних ambient, до будь-якого сервісу, що працює в цьому просторі імен, будуть направлені через waypoint для обробки на рівні L7 та застосування політик.
Якщо вам потрібна більша деталізація, ніж використання waypoint для всього простору імен, ви можете зареєструвати лише конкретний сервіс або pod для використання waypoint. Це може бути корисно, якщо вам потрібні функції рівня L7 лише для деяких сервісів у просторі імен, якщо ви хочете, щоб розширення, таке як WasmPlugin
, застосовувалось лише до конкретного сервісу, або якщо ви звертаєтесь до headless service Kubernetes за IP-адресою podʼа.
Налаштування сервісу для використання конкретної waypoint
Використовуючи сервіс з прикладу застосунку bookinfo, ми можемо розгорнути waypoint з назвою reviews-svc-waypoint
для сервісу reviews
:
$ istioctl waypoint apply -n default --name reviews-svc-waypoint
waypoint default/reviews-svc-waypoint applied
Позначте сервіс reviews
, щоб він використовував waypoint reviews-svc-waypoint
:
$ kubectl label service reviews istio.io/use-waypoint=reviews-svc-waypoint
service/reviews labeled
Будь-які запити від podʼів у mesh до сервісу reviews
тепер будуть направлятись через waypoint reviews-svc-waypoint
.
Налаштування podʼа для використання конкретного waypoint
Розгорніть waypoint х назвою reviews-v2-pod-waypoint
для podʼа reviews-v2
.
$ istioctl waypoint apply -n default --name reviews-v2-pod-waypoint --for workload
waypoint default/reviews-v2-pod-waypoint applied
Позначте pod reviews-v2
, щоб він використовував waypoint reviews-v2-pod-waypoint
:
$ kubectl label pod -l version=v2,app=reviews istio.io/use-waypoint=reviews-v2-pod-waypoint
pod/reviews-v2-5b667bcbf8-spnnh labeled
Будь-які запити від podʼів в ambient mesh до IP podʼа reviews-v2
тепер будуть направлені через waypoint reviews-v2-pod-waypoint
для обробки на рівні L7 та застосування політик.
Використання waypoint в різних просторах імен
Стандартно проксі waypoint доступний для ресурсів у тому ж просторі імен. Починаючи з Istio 1.23, стало можливим використовувати waypoint в інших просторах імен. У цьому розділі ми розглянемо конфігурацію шлюзу, необхідну для увімкнення використання waypoint у різних просторах імен, а також як налаштувати ваші ресурси для використання waypoint з іншого простору імен.
Налаштування waypoint для використання у різних просторах імен
Щоб увімкнути використання waypoint у різних просторах імен, слід налаштувати Gateway
для дозволу маршрутів з інших просторів імен.
Наступний Gateway
дозволить ресурсам у просторі імен з назвою “cross-namespace-waypoint-consumer” використовувати цей egress-gateway
:
kind: Gateway
metadata:
name: egress-gateway
namespace: common-infrastructure
spec:
gatewayClassName: istio-waypoint
listeners:
- name: mesh
port: 15008
protocol: HBONE
allowedRoutes:
namespaces:
from: Selector
selector:
matchLabels:
kubernetes.io/metadata.name: cross-namespace-waypoint-consumer
Налаштування ресурсів для використання waypoint проксі з іншого простору імен
Стандартно, панель управління Istio буде шукати waypoint, вказаний за допомогою мітки istio.io/use-waypoint
, у тому ж просторі імен, що й ресурс, до якого застосовано цю мітку. Можна використовувати waypoint в іншому просторі імен, додавши нову мітку istio.io/use-waypoint-namespace
. istio.io/use-waypoint-namespace
працює для всіх ресурсів, які підтримують мітку istio.io/use-waypoint
. Разом ці дві мітки вказують відповідно імʼя та простір імен вашого waypoint. Наприклад, щоб налаштувати ServiceEntry
з назвою istio-site
для використання waypoint з назвою egress-gateway
у просторі імен з назвою common-infrastructure
, можна скористатися такими командами:
$ kubectl label serviceentries.networking.istio.io istio-site istio.io/use-waypoint=egress-gateway
serviceentries.networking.istio.io/istio-site labeled
$ kubectl label serviceentries.networking.istio.io istio-site istio.io/use-waypoint-namespace=common-infrastructure
serviceentries.networking.istio.io/istio-site labeled
Очищення
Ви можете видалити всі waypoint з простору імен, виконавши наступні дії:
$ istioctl waypoint delete --all -n default
$ kubectl label ns default istio.io/use-waypoint-
Вилучіть CRD Kubernetes Gateway API:
$ kubectl delete -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.2.0/standard-install.yaml