nav-img
Evolution

Управление сервисами с Istio

Istio предлагает инструменты для управления трафиком между микросервисами, обеспечивая гибкость в настройке маршрутизации, балансировки нагрузки и отказоустойчивости. В примере рассмотрим, как развернуть Istio в кластере Managed Kubernetes, опубликовать приложение, маршрутизировать трафик и настроить политики доступа к приложению.

Перед началом работы

  1. Создайте кластер Managed Kubernetes и хотя бы одну группу узлов.

  2. В созданный кластер установите плагин Istio.

  3. Проверьте, что SNAT-шлюз создан.

  4. Подключитесь к кластеру Managed Kubernetes.

Шаг 1. Разверните приложение

  1. Убедитесь, что все поды Istio в статусе Running:

    kubectl get pods -n istio-system

    Результат:

    NAME READY STATUS RESTARTS AGE
    istio-ingressgateway-58d8bc5c94-pz8gm 1/1 Running 0 25m
    istiod-5586bcd5b-288bp 1/1 Running 0 25m
  2. Установите тестовое приложение:

    kubectl apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/helloworld/helloworld.yaml

    Результат:

    service/helloworld created
    deployment.apps/helloworld-v1 created
    deployment.apps/helloworld-v2 created
  3. Проверьте состояние подов:

    kubectl get pods

    Результат:

    helloworld-v1-69ff8fc747-97qjg 1/1 Running 0 15s
    helloworld-v2-779454bb5f-r2mkt 1/1 Running 0 15s
  4. Опубликуйте приложение:

    kubectl apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/helloworld/helloworld-gateway.yaml

    Результат:

    gateway.networking.istio.io/helloworld-gateway created
    virtualservice.networking.istio.io/helloworld created
  5. Получите IP-адрес Ingress-шлюза для доступа к приложению:

    kubectl -n istio-system get service istio-ingressgateway

    Результат:

    NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    istio-ingressgateway LoadBalancer 10.108.253.201 <ingress_host> 15021:31920/TCP,80:30851/TCP,443:32145/TCP 6m3s

    Где <ingress_host> — назначенный IP-адрес.

  6. Проверьте, что ресурс доступен:

    curl http://<ingress_host>/hello

Шаг 2. Распределите трафик

Приложение helloworld развернуто в версиях v1 и v2. При обновлении страницы тестового приложения отображается версия приложения v1 или версия приложения v2.

  1. Распределите трафик helloworld следующим образом: для 70% пользователей должна отображаться версия приложения v1, для 30% — версия приложения v2. Для этого создайте манифест helloworld-route.yaml:

    apiVersion: networking.istio.io/v1
    kind: DestinationRule
    metadata:
    name: helloworld-dr
    spec:
    host: helloworld
    subsets:
    - name: v1
    labels:
    version: v1
    - name: v2
    labels:
    version: v2
    ---
    apiVersion: networking.istio.io/v1
    kind: VirtualService
    metadata:
    name: helloworld
    spec:
    hosts:
    - "*"
    gateways:
    - helloworld-gateway
    http:
    - route:
    - destination:
    host: helloworld
    subset: v1
    port:
    number: 5000
    weight: 70
    - destination:
    host: helloworld
    subset: v2
    port:
    number: 5000
    weight: 30
  2. Примените правило маршрутизации:

    kubectl apply -f helloworld-route.yaml

    Результат:

    destinationrule.networking.istio.io/helloworld-dr created
    virtualservice.networking.istio.io/helloworld configured
  3. Выполните команду:

    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-97qjg
    Hello version: v1, instance: helloworld-v1-69ff8fc747-97qjg
    Hello version: v2, instance: helloworld-v2-779454bb5f-r2mkt
    Hello version: v1, instance: helloworld-v1-69ff8fc747-97qjg
    Hello version: v1, instance: helloworld-v1-69ff8fc747-97qjg
    Hello version: v1, instance: helloworld-v1-69ff8fc747-97qjg
    Hello version: v1, instance: helloworld-v1-69ff8fc747-97qjg
    Hello version: v1, instance: helloworld-v1-69ff8fc747-97qjg
    Hello version: v1, instance: helloworld-v1-69ff8fc747-97qjg
    Hello version: v1, instance: helloworld-v1-69ff8fc747-97qjg

Шаг 3. Перенаправьте запросы только на одну версию приложения

  1. Создайте helloworld-dr.yaml и сохраните манифест:

    apiVersion: networking.istio.io/v1
    kind: DestinationRule
    metadata:
    name: helloworld-dr
    spec:
    host: helloworld
    subsets:
    - name: v1
    labels:
    version: v1
    - name: v2
    labels:
    version: v2
    ---
    apiVersion: networking.istio.io/v1
    kind: VirtualService
    metadata:
    name: helloworld
    spec:
    hosts:
    - "*"
    gateways:
    - helloworld-gateway
    http:
    - match:
    - uri:
    exact: /hello
    route:
    - destination:
    host: helloworld
    subset: v1
    port:
    number: 5000
  2. Примените манифест:

    kubectl apply -f helloworld-dr.yaml

    Результат:

    destinationrule.networking.istio.io/helloworld-dr configured
    virtualservice.networking.istio.io/helloworld configured
  3. Выполните команду:

    for run in {1..10}; do curl http://<ingress_host>/hello; done

    Теперь все запросы обрабатываются подами версии helloworld-v1.

  4. Направьте все запросы к helloworld-v2:

    apiVersion: networking.istio.io/v1
    kind: DestinationRule
    metadata:
    name: helloworld-dr
    spec:
    host: helloworld
    subsets:
    - name: v1
    labels:
    version: v1
    - name: v2
    labels:
    version: v2
    ---
    apiVersion: networking.istio.io/v1
    kind: VirtualService
    metadata:
    name: helloworld
    spec:
    hosts:
    - "*"
    gateways:
    - helloworld-gateway
    http:
    - match:
    - uri:
    exact: /hello
    route:
    - destination:
    host: helloworld
    subset: v2
    port:
    number: 5000
  5. Выполните команду:

    for run in {1..10}; do curl http://<ingress_host>/hello; done

    Теперь все запросы обрабатываются подами версии helloworld-v2.

Что дальше

Далее вы можете настраивать mTLS и применять политики аутентификации, контролировать трафик с помощью HTTP‑заголовков, ограничивать скорость для сервисов, настроить цепочку фильтров с использованием WASM. Подробные примеры — в документации Istio.

Если вы закончили работу с приложением, удалите все ресурсы и кластер.