Управление сервисами с Istio
Istio предлагает инструменты для управления трафиком между микросервисами, обеспечивая гибкость в настройке маршрутизации, балансировки нагрузки и отказоустойчивости. В примере рассмотрим, как развернуть Istio в кластере Managed Kubernetes, опубликовать приложение, маршрутизировать трафик и настроить политики доступа к приложению.
Перед началом работы
Создайте кластер Managed Kubernetes и хотя бы одну группу узлов.
В созданный кластер установите плагин Istio.
Проверьте, что SNAT-шлюз создан.
Шаг 1. Разверните приложение
Убедитесь, что все поды Istio в статусе Running:
kubectl get pods -n istio-systemРезультат:
NAME READY STATUS RESTARTS AGEistio-ingressgateway-58d8bc5c94-pz8gm 1/1 Running 0 25mistiod-5586bcd5b-288bp 1/1 Running 0 25mУстановите тестовое приложение:
kubectl apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/helloworld/helloworld.yamlРезультат:
service/helloworld createddeployment.apps/helloworld-v1 createddeployment.apps/helloworld-v2 createdПроверьте состояние подов:
kubectl get podsРезультат:
helloworld-v1-69ff8fc747-97qjg 1/1 Running 0 15shelloworld-v2-779454bb5f-r2mkt 1/1 Running 0 15sОпубликуйте приложение:
kubectl apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/helloworld/helloworld-gateway.yamlРезультат:
gateway.networking.istio.io/helloworld-gateway createdvirtualservice.networking.istio.io/helloworld createdПолучите IP-адрес Ingress-шлюза для доступа к приложению:
kubectl -n istio-system get service istio-ingressgatewayРезультат:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEistio-ingressgateway LoadBalancer 10.108.253.201 <ingress_host> 15021:31920/TCP,80:30851/TCP,443:32145/TCP 6m3sГде <ingress_host> — назначенный IP-адрес.
Проверьте, что ресурс доступен:
curl http://<ingress_host>/hello
Шаг 2. Распределите трафик
Приложение helloworld развернуто в версиях v1 и v2. При обновлении страницы тестового приложения отображается версия приложения v1 или версия приложения v2.
Распределите трафик helloworld следующим образом: для 70% пользователей должна отображаться версия приложения v1, для 30% — версия приложения v2. Для этого создайте манифест helloworld-route.yaml:
apiVersion: networking.istio.io/v1kind: DestinationRulemetadata:name: helloworld-drspec:host: helloworldsubsets:- name: v1labels:version: v1- name: v2labels:version: v2---apiVersion: networking.istio.io/v1kind: VirtualServicemetadata:name: helloworldspec:hosts:- "*"gateways:- helloworld-gatewayhttp:- route:- destination:host: helloworldsubset: v1port:number: 5000weight: 70- destination:host: helloworldsubset: v2port:number: 5000weight: 30Примените правило маршрутизации:
kubectl apply -f helloworld-route.yamlРезультат:
destinationrule.networking.istio.io/helloworld-dr createdvirtualservice.networking.istio.io/helloworld configuredВыполните команду:
for run in {1..10}; do curl http://<ingress_host>/hello; doneВ результате вы должны увидеть 7 из 10 запросов, обработанных helloworld-v1, и только 3 из 10 запросов, обработанных hello world-v2.
Hello version: v1, instance: helloworld-v1-69ff8fc747-97qjgHello version: v1, instance: helloworld-v1-69ff8fc747-97qjgHello version: v2, instance: helloworld-v2-779454bb5f-r2mktHello version: v1, instance: helloworld-v1-69ff8fc747-97qjgHello version: v1, instance: helloworld-v1-69ff8fc747-97qjgHello version: v1, instance: helloworld-v1-69ff8fc747-97qjgHello version: v1, instance: helloworld-v1-69ff8fc747-97qjgHello version: v1, instance: helloworld-v1-69ff8fc747-97qjgHello version: v1, instance: helloworld-v1-69ff8fc747-97qjgHello version: v1, instance: helloworld-v1-69ff8fc747-97qjg
Шаг 3. Перенаправьте запросы только на одну версию приложения
Создайте helloworld-dr.yaml и сохраните манифест:
apiVersion: networking.istio.io/v1kind: DestinationRulemetadata:name: helloworld-drspec:host: helloworldsubsets:- name: v1labels:version: v1- name: v2labels:version: v2---apiVersion: networking.istio.io/v1kind: VirtualServicemetadata:name: helloworldspec:hosts:- "*"gateways:- helloworld-gatewayhttp:- match:- uri:exact: /helloroute:- destination:host: helloworldsubset: v1port:number: 5000Примените манифест:
kubectl apply -f helloworld-dr.yamlРезультат:
destinationrule.networking.istio.io/helloworld-dr configuredvirtualservice.networking.istio.io/helloworld configuredВыполните команду:
for run in {1..10}; do curl http://<ingress_host>/hello; doneТеперь все запросы обрабатываются подами версии helloworld-v1.
Направьте все запросы к helloworld-v2:
apiVersion: networking.istio.io/v1kind: DestinationRulemetadata:name: helloworld-drspec:host: helloworldsubsets:- name: v1labels:version: v1- name: v2labels:version: v2---apiVersion: networking.istio.io/v1kind: VirtualServicemetadata:name: helloworldspec:hosts:- "*"gateways:- helloworld-gatewayhttp:- match:- uri:exact: /helloroute:- destination:host: helloworldsubset: v2port:number: 5000Выполните команду:
for run in {1..10}; do curl http://<ingress_host>/hello; doneТеперь все запросы обрабатываются подами версии helloworld-v2.
Что дальше
Далее вы можете настраивать mTLS и применять политики аутентификации, контролировать трафик с помощью HTTP‑заголовков, ограничивать скорость для сервисов, настроить цепочку фильтров с использованием WASM. Подробные примеры — в документации Istio.
Если вы закончили работу с приложением, удалите все ресурсы и кластер.