istio.io/content/uk/docs/tasks/traffic-management/tcp-traffic-shifting/index.md

11 KiB
Raw Permalink Blame History

title description weight keywords aliases owner test
Перемикання трафіку TCP Показує, як перенести TCP-трафік зі старої на нову версію TCP-сервісу. 31
traffic-management
tcp-traffic-shifting
/uk/docs/tasks/traffic-management/tcp-version-migration.html
istio/wg-networking-maintainers yes

Це завдання показує, як перенести TCP-трафік з одної версії мікросервісу на іншу.

Поширений випадок використання — це поступове перенесення TCP трафіку зі старої версії мікросервісу на нову. В Istio ви досягаєте цієї мети, конфігуруючи послідовність правил маршрутизації, які перенаправляють відсоток TCP трафіку з одного призначення на інше.

У цьому завданні ви направите 100% TCP трафіку до tcp-echo:v1. Потім ви направите 20% TCP трафіку до tcp-echo:v2, використовуючи функцію маршрутизації за коефіцієнтами в Istio.

{{< boilerplate gateway-api-gamma-experimental >}}

Перш ніж почати

Налаштування тестового середовища

  1. Щоб почати, створіть простір імен для тестування перемикання TCP трафіку.

    {{< text bash >}} $ kubectl create namespace istio-io-tcp-traffic-shifting {{< /text >}}

  2. Розгорніть демонстраційний застосунок [curl]({{< github_tree >}}/samples/curl), який буде використовуватися як джерело тестових запитів.

    {{< text bash >}} $ kubectl apply -f @samples/curl/curl.yaml@ -n istio-io-tcp-traffic-shifting {{< /text >}}

  3. Розгорніть версії v1 і v2 мікросервісу tcp-echo.

    {{< text bash >}} $ kubectl apply -f @samples/tcp-echo/tcp-echo-services.yaml@ -n istio-io-tcp-traffic-shifting {{< /text >}}

Застосування маршрутизації TCP на основі коефіцієнтів

  1. Направте весь TCP трафік до версії v1 мікросервісу tcp-echo.

{{< tabset category-name="config-api" >}}

{{< tab name="Istio APIs" category-value="istio-apis" >}}

{{< text bash >}} $ kubectl apply -f @samples/tcp-echo/tcp-echo-all-v1.yaml@ -n istio-io-tcp-traffic-shifting {{< /text >}}

{{< /tab >}}

{{< tab name="Gateway API" category-value="gateway-api" >}}

{{< text bash >}} $ kubectl apply -f @samples/tcp-echo/gateway-api/tcp-echo-all-v1.yaml@ -n istio-io-tcp-traffic-shifting {{< /text >}}

{{< /tab >}}

{{< /tabset >}}

  1. Визначте ingress IP та port:

{{< tabset category-name="config-api" >}}

{{< tab name="Istio APIs" category-value="istio-apis" >}}

Дотримуйтесь інструкцій Визначення ingress IP та портів, щоб встановити змінні оточення TCP_INGRESS_PORT та INGRESS_HOST.

{{< /tab >}}

{{< tab name="Gateway API" category-value="gateway-api" >}}

Використовуйте наступні команди для встановлення змінних оточення SECURE_INGRESS_PORT та INGRESS_HOST:

{{< text bash >}} $ kubectl wait --for=condition=programmed gtw tcp-echo-gateway -n istio-io-tcp-traffic-shifting export INGRESS_HOST=(kubectl get gtw tcp-echo-gateway -n istio-io-tcp-traffic-shifting -o jsonpath='{.status.addresses[0].value}') export TCP_INGRESS_PORT=(kubectl get gtw tcp-echo-gateway -n istio-io-tcp-traffic-shifting -o jsonpath='{.spec.listeners[?(@.name=="tcp-31400")].port}') {{< /text >}}

{{< /tab >}}

{{< /tabset >}}

  1. Переконайтеся, що служба tcp-echo працює, надіславши до неї деякий TCP-трафік.

    {{< text bash >}} export CURL=(kubectl get pod -l app=curl -n istio-io-tcp-traffic-shifting -o jsonpath={.items..metadata.name}) $ for i in {1..20}; do
    kubectl exec "$CURL" -c curl -n istio-io-tcp-traffic-shifting -- sh -c "(date; curl 1) | nc $INGRESS_HOST $TCP_INGRESS_PORT";
    done one Mon Nov 12 23:24:57 UTC 2022 one Mon Nov 12 23:25:00 UTC 2022 one Mon Nov 12 23:25:02 UTC 2022 one Mon Nov 12 23:25:05 UTC 2022 one Mon Nov 12 23:25:07 UTC 2022 one Mon Nov 12 23:25:10 UTC 2022 one Mon Nov 12 23:25:12 UTC 2022 one Mon Nov 12 23:25:15 UTC 2022 one Mon Nov 12 23:25:17 UTC 2022 one Mon Nov 12 23:25:19 UTC 2022 ... {{< /text >}}

    Зверніть увагу, що всі мітки часу мають префікс one, що означає, що весь трафік було перенаправлено на v1 версію сервісу tcp-echo.

  2. Передайте 20% трафіку з tcp-echo:v1 на tcp-echo:v2 за допомогою наступної команди:

{{< tabset category-name="config-api" >}}

{{< tab name="Istio APIs" category-value="istio-apis" >}}

{{< text bash >}} $ kubectl apply -f @samples/tcp-echo/tcp-echo-20-v2.yaml@ -n istio-io-tcp-traffic-shifting {{< /text >}}

{{< /tab >}}

{{< tab name="Gateway API" category-value="gateway-api" >}}

{{< text bash >}} $ kubectl apply -f @samples/tcp-echo/gateway-api/tcp-echo-20-v2.yaml@ -n istio-io-tcp-traffic-shifting {{< /text >}}

{{< /tab >}}

{{< /tabset >}}

  1. Зачекайте кілька секунд, поки нові правила поширяться, а потім підтвердіть, що правило було замінено:

{{< tabset category-name="config-api" >}}

{{< tab name="Istio APIs" category-value="istio-apis" >}}

{{< text bash yaml >}} $ kubectl get virtualservice tcp-echo -o yaml -n istio-io-tcp-traffic-shifting apiVersion: networking.istio.io/v1 kind: VirtualService ... spec: ... tcp:

  • match:
    • port: 31400 route:
    • destination: host: tcp-echo port: number: 9000 subset: v1 weight: 80
    • destination: host: tcp-echo port: number: 9000 subset: v2 weight: 20 {{< /text >}}

{{< /tab >}}

{{< tab name="Gateway API" category-value="gateway-api" >}}

{{< text bash >}} $ kubectl get tcproute tcp-echo -o yaml -n istio-io-tcp-traffic-shifting apiVersion: gateway.networking.k8s.io/v1alpha2 kind: TCPRoute ... spec: parentRefs:

  • group: gateway.networking.k8s.io kind: Gateway name: tcp-echo-gateway sectionName: tcp-31400 rules:
  • backendRefs:
    • group: "" kind: Service name: tcp-echo-v1 port: 9000 weight: 80
    • group: "" kind: Service name: tcp-echo-v2 port: 9000 weight: 20 ... {{< /text >}}

{{< /tab >}}

{{< /tabset >}}

  1. Надішліть ще трохи TCP-трафіку до мікросервісу tcp-echo.

    {{< text bash >}} export CURL=(kubectl get pod -l app=curl -n istio-io-tcp-traffic-shifting -o jsonpath={.items..metadata.name}) $ for i in {1..20}; do
    kubectl exec "$CURL" -c curl -n istio-io-tcp-traffic-shifting -- sh -c "(date; curl 1) | nc $INGRESS_HOST $TCP_INGRESS_PORT";
    done one Mon Nov 12 23:38:45 UTC 2022 two Mon Nov 12 23:38:47 UTC 2022 one Mon Nov 12 23:38:50 UTC 2022 one Mon Nov 12 23:38:52 UTC 2022 one Mon Nov 12 23:38:55 UTC 2022 two Mon Nov 12 23:38:57 UTC 2022 one Mon Nov 12 23:39:00 UTC 2022 one Mon Nov 12 23:39:02 UTC 2022 one Mon Nov 12 23:39:05 UTC 2022 one Mon Nov 12 23:39:07 UTC 2022 ... {{< /text >}}

    Тепер ви повинні помітити, що близько 20% міток часу мають префікс two, що означає, що 80% TCP-трафіку було перенаправлено на v1 версію служби tcp-echo, а 20% — на v2.

Розуміння того, що відбулося

У цьому завданні ви частково мігрували TCP трафік зі старої версії на нову версію сервісу tcp-echo, використовуючи функцію маршрутизації за коефіцієнтами Istio. Зверніть увагу, що це дуже відрізняється від міграції версій за допомогою функцій розгортання платформ оркестрування контейнерів, які використовують масштабування екземплярів для управління трафіком.

За допомогою Istio ви можете дозволити двом версіям сервісу tcp-echo масштабуватися вгору і вниз незалежно одна від одної, не впливаючи на розподіл трафіку між ними.

Для отримання додаткової інформації про маршрутизацію версій з автомасштабуванням, ознайомтеся зі статтею в блозі Canary Deployment з використанням Istio.

Очищення

  1. Видаліть правила маршрутизації:

{{< tabset category-name="config-api" >}}

{{< tab name="Istio APIs" category-value="istio-apis" >}}

{{< text bash >}} $ kubectl delete -f @samples/tcp-echo/tcp-echo-all-v1.yaml@ -n istio-io-tcp-traffic-shifting {{< /text >}}

{{< /tab >}}

{{< tab name="Gateway API" category-value="gateway-api" >}}

{{< text bash >}} $ kubectl delete -f @samples/tcp-echo/gateway-api/tcp-echo-all-v1.yaml@ -n istio-io-tcp-traffic-shifting {{< /text >}}

{{< /tab >}}

{{< /tabset >}}

  1. Видаліть демонстраційний застосунок curl, застосунок tcp-echo і тестовий простір імен:

    {{< text bash >}} $ kubectl delete -f @samples/curl/curl.yaml@ -n istio-io-tcp-traffic-shifting $ kubectl delete -f @samples/tcp-echo/tcp-echo-services.yaml@ -n istio-io-tcp-traffic-shifting $ kubectl delete namespace istio-io-tcp-traffic-shifting {{< /text >}}