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

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

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

    Процедура

    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
        labels:
          # Укажите имя ревизии Istio; по умолчанию 'default'
          istio.io/rev: default
      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         68s
    4. Необязательно: Разверните шлюз на Infra Nodes:

      Нажмите, чтобы развернуть
      Предварительные требования

      Alauda Container Platform версии 4.2.0 или выше, либо обновите CRD Gateway API до последней версии.

      a. Создайте ConfigMap с именем asm-kube-gateway-options в том же пространстве имён, где планируете развернуть Gateway:

      apiVersion: v1
      kind: ConfigMap
      metadata:
        name: asm-kube-gateway-options
        namespace: egress-gateway
      data:
        deployment: |
          spec:
            template:
              spec:
                nodeSelector:
                  node-role.kubernetes.io/infra: ""
                tolerations:
                  - effect: NoSchedule
                    key: node-role.kubernetes.io/infra
                    value: reserved
                    operator: Equal
      1. Указывает имя configmap.
      2. Указывает пространство имён configmap, совпадающее с пространством имён шлюза.
      3. Задает nodeSelector и tolerations для планирования pod-ов шлюза на Infra Nodes.

      b. Ссылку на ConfigMap добавьте в ресурс Gateway, добавив поле infrastructure.parametersRef:

      apiVersion: gateway.networking.k8s.io/v1
      kind: Gateway
      metadata:
        name: httpbin-egress-gateway
        namespace: egress-gateway
      spec:
        # Добавьте следующую инфраструктурную конфигурацию в ваш Gateway CR
        infrastructure:
          parametersRef:
            group: ""
            kind: ConfigMap
            name: asm-kube-gateway-options
        # ... остальная конфигурация Gateway
      1. Указывает имя шлюза.
      2. Указывает пространство имён шлюза.

    Проверка

    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.28.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}')
      echo "CURL_POD=$CURL_POD"
    5. С помощью клиента curl подтвердите, что вы можете достичь httpbin.org через egress-шлюз, выполнив команду:

      kubectl exec "$CURL_POD" -n curl -c curl -- curl -sS -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
      ...