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

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

Содержание

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

  • Установлен Alauda Service Mesh v2 Operator.
  • Развернута управляющая плоскость Istio.

Процедура

  1. Создайте пространство имён с именем egress-gateway с помощью следующей команды:

    kubectl create namespace egress-gateway
  2. Создайте YAML-файл с именем egress-gateway-cr.yaml, который определяет egress-шлюз.

    Пример файла CR для egress-шлюза

    # ServiceEntry для разрешения трафика к httpbin.org
    apiVersion: networking.istio.io/v1
    kind: ServiceEntry
    metadata:
      name: httpbin-ext
    spec:
      hosts:
        - httpbin.org
      ports:
        - number: 80
          name: http
          protocol: HTTP
      location: MESH_EXTERNAL
      resolution: DNS
    ---
    # Gateway API Gateway для egress
    apiVersion: gateway.networking.k8s.io/v1
    kind: Gateway
    metadata:
      name: httpbin-egress-gateway
      annotations:
        networking.istio.io/service-type: ClusterIP
    spec:
      gatewayClassName: istio
      listeners:
        - name: http
          hostname: httpbin.org
          port: 80
          protocol: HTTP
          allowedRoutes:
            namespaces:
              from: All
    ---
    # HTTPRoute для направления трафика от sidecar к egress-шлюзу
    apiVersion: gateway.networking.k8s.io/v1
    kind: HTTPRoute
    metadata:
      name: direct-httpbin-to-egress-gateway
    spec:
      parentRefs:
        - kind: ServiceEntry
          group: networking.istio.io
          name: httpbin-ext
      rules:
        - backendRefs:
            - name: httpbin-egress-gateway-istio
              port: 80
    ---
    # HTTPRoute для перенаправления трафика с egress-шлюза на httpbin.org
    apiVersion: gateway.networking.k8s.io/v1
    kind: HTTPRoute
    metadata:
      name: forward-httpbin-from-egress-gateway
    spec:
      parentRefs:
        - name: httpbin-egress-gateway
      hostnames:
        - httpbin.org
      rules:
        - backendRefs:
            - kind: Hostname
              group: networking.istio.io
              name: httpbin.org
              port: 80

    Примените этот YAML-файл, выполнив следующую команду:

    kubectl -n egress-gateway apply -f egress-gateway-cr.yaml
  3. Проверьте статус конфигурации шлюза, выполнив команду:

    kubectl -n egress-gateway get gtw httpbin-egress-gateway

    Желаемый результат — когда значение в столбце PROGRAMMED равно True.

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

    NAME                     CLASS   ADDRESS                                                         PROGRAMMED   AGE
    httpbin-egress-gateway   istio   httpbin-egress-gateway-istio.egress-gateway.svc.cluster.local   True         22h

Проверка

  1. Создайте пространство имён с именем curl, выполнив следующую команду:

    kubectl create namespace curl
  2. Включите инъекцию sidecar для пространства имён. Если в вашей установке используется стратегия обновления InPlace, выполните команду:

    kubectl label namespace curl istio-injection=enabled
    NOTE

    Если вы используете стратегию обновления RevisionBased, выполните следующие команды:

    1. Чтобы узнать ваше <revision-name>, выполните:

      kubectl get istiorevisions.sailoperator.io

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

      NAME      NAMESPACE      PROFILE   READY   STATUS    IN USE   VERSION   AGE
      default   istio-system             True    Healthy   True     v1.26.3   47h
    2. Пометьте пространство имён с помощью имени ревизии для включения инъекции sidecar:

      kubectl label namespace curl istio.io/rev=default
  3. Разверните приложение curl, выполнив команду:

    kubectl apply -n curl -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/curl/curl.yaml
  4. Инициализируйте и экспортируйте переменную окружения CURL_POD, содержащую имя pod с curl:

    export CURL_POD=$(kubectl get pod -n curl -l app=curl -o jsonpath='{.items[0].metadata.name}')
  5. С помощью клиента curl подтвердите, что вы можете достичь httpbin.org через egress-шлюз, выполнив команду:

    kubectl exec "$CURL_POD" -n curl -c curl -- curl -s -v http://httpbin.org/get

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

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

    ...
    {
      "headers": {
        "Host": "httpbin.org",
        "User-Agent": "curl/8.15.0",
        "X-Envoy-Peer-Metadata-Id": "router~10.3.0.58~httpbin-egress-gateway-istio-7db8cbfc64-72g85.egress-gateway~egress-gateway.svc.cluster.local"
        ...
      },
      "url": "http://httpbin.org/get"
    }
    < HTTP/1.1 200 OK
    < server: envoy
    ...