• Русский
  • Маршрутизация исходящего трафика через шлюз с использованием Kubernetes Gateway API в режиме ambient

    В этом руководстве показано, как использовать Kubernetes Gateway API вместе с waypoint proxy для маршрутизации исходящего HTTP-трафика через egress gateway в режиме ambient.

    Предварительные требования

    • Установлен Alauda Service Mesh v2 Operator.
    • Ресурсы Istio и IstioCNI настроены с профилем ambient.
    • Создан ресурс Ztunnel.
    • Подтвердите совместимость с ядром Linux.

    Процедура

    1. Создайте namespace с именем egress-gateway:

      kubectl create namespace egress-gateway
    2. Добавьте метку istio-discovery=enabled в namespace egress-gateway:

      kubectl label namespace egress-gateway istio-discovery=enabled
    3. Включите режим ambient для namespace, применив метку режима dataplane:

      kubectl label namespace egress-gateway istio.io/dataplane-mode=ambient
    4. Создайте YAML-файл с именем egress-se.yaml, который определяет ServiceEntry для внешнего сервиса. Метка istio.io/use-waypoint связывает эту запись с waypoint proxy.

      apiVersion: networking.istio.io/v1
      kind: ServiceEntry
      metadata:
        name: httpbin-ext
        namespace: egress-gateway
        labels:
          istio.io/use-waypoint: waypoint
      spec:
        hosts:
          - httpbin.org
        ports:
          - number: 80
            name: http
            protocol: HTTP
        resolution: DNS
      1. Направляет трафик для этого ServiceEntry через waypoint proxy с именем waypoint в том же namespace.
    5. Примените ServiceEntry:

      kubectl apply -f egress-se.yaml
    6. Создайте YAML-файл с именем waypoint.yaml, который развертывает waypoint proxy в namespace egress-gateway. Waypoint proxy перехватывает и обрабатывает L7 трафик для сервисов в этом namespace.

      apiVersion: gateway.networking.k8s.io/v1
      kind: Gateway
      metadata:
        name: waypoint
        namespace: egress-gateway
        labels:
          istio.io/waypoint-for: service
      spec:
        gatewayClassName: istio-waypoint
        listeners:
          - name: mesh
            port: 15008
            protocol: HBONE
      1. Метка istio.io/waypoint-for: service указывает, что этот waypoint обрабатывает трафик для сервисов. Значение метки определяет тип обрабатываемого трафика. Подробнее см. в разделе Waypoint traffic types (документация Istio).
      2. Указывает класс шлюза istio-waypoint, который разворачивает waypoint proxy вместо стандартного ingress gateway.
    7. Примените конфигурацию waypoint proxy:

      kubectl apply -f waypoint.yaml
      NOTE

      В качестве альтернативы созданию YAML-файла вручную, вы можете развернуть waypoint proxy с помощью следующей команды:

      istioctl waypoint apply --enroll-namespace --name waypoint --namespace egress-gateway

      При использовании опции --enroll-namespace все сервисы в namespace egress-gateway (включая ServiceEntries) будут направлять свой трафик через waypoint.

    Проверка

    1. Убедитесь, что waypoint proxy готов, проверив его статус:

      kubectl get gateways.gateway.networking.k8s.io waypoint -n egress-gateway

      В столбце PROGRAMMED должно отображаться True, что означает успешную настройку.

      Пример вывода

      NAME       CLASS            ADDRESS      PROGRAMMED   AGE
      waypoint   istio-waypoint   10.4.61.76   True         38s
    2. Разверните клиент curl в namespace egress-gateway:

      kubectl apply -n egress-gateway -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/curl/curl.yaml
    3. Сохраните имя pod curl в переменную:

      export CURL_POD=$(kubectl get pods -n egress-gateway -l app=curl -o jsonpath='{.items[*].metadata.name}')
      echo "CURL_POD=$CURL_POD"
    4. С клиента curl проверьте, что можно достучаться до httpbin.org через egress gateway:

      kubectl exec $CURL_POD -n egress-gateway -- \
        curl -sS -v http://httpbin.org/get

      Успешный ответ от httpbin.org подтверждает, что исходящий трафик маршрутизируется через настроенный шлюз.

      Пример вывода

      < HTTP/1.1 200 OK
      ...
      < server: istio-envoy
      ...

      Логи ztunnel должны показывать прохождение трафика через waypoint, примерно так:

      Пример вывода логов ztunnel

      2026-03-09T10:18:02.686121Z	info	access	connection complete
        src.addr=10.3.0.134:35092
        src.workload="curl-c658c5974-6zsnb"
        src.namespace="egress-gateway"
        src.identity="spiffe://cluster.local/ns/egress-gateway/sa/curl"
        dst.addr=10.3.0.131:15008
        dst.hbone_addr=240.240.0.3:80
        dst.service="httpbin.org"
        dst.workload="waypoint-7d688546dc-v8x9c"
        dst.namespace="egress-gateway"
        dst.identity="spiffe://cluster.local/ns/egress-gateway/sa/waypoint"
        direction="outbound"
        bytes_sent=78
        bytes_recv=641
        duration="790ms"

    Очистка

    Удалите namespace egress-gateway и все связанные ресурсы:

    # Удалите метку dataplane-mode из namespace ambient
    kubectl label namespace egress-gateway istio.io/dataplane-mode-
    # Удалите namespace
    kubectl delete namespace egress-gateway