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

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

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

    Процедура

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

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

      Пример файла CR для egress gateway
      # ServiceEntry to allow traffic to 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 for egress
      apiVersion: gateway.networking.k8s.io/v1
      kind: Gateway
      metadata:
        name: httpbin-egress-gateway
        annotations:
          networking.istio.io/service-type: ClusterIP
        labels:
          # Specify the Istio revision name; defaults to 'default'
          istio.io/rev: default
      spec:
        gatewayClassName: istio
        listeners:
          - name: http
            hostname: httpbin.org
            port: 80
            protocol: HTTP
            allowedRoutes:
              namespaces:
                from: All
      ---
      # HTTPRoute to direct traffic from sidecars to the egress gateway
      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 to forward traffic from the egress gateway to 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. Проверьте состояние конфигурации gateway, выполнив эту команду:

      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. Необязательно : Разверните gateway на Инфраструктурные узлы:

      Щелкните, чтобы развернуть
      Предварительные требования

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

      a. Создайте ConfigMap с именем asm-kube-gateway-options в том же namespace, где вы планируете развернуть ваш 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. Указывает namespace ConfigMap, который совпадает с namespace gateway.
      3. Задает node selector и tolerations для размещения pod gateway на Infra Nodes.

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

      apiVersion: gateway.networking.k8s.io/v1
      kind: Gateway
      metadata:
        name: httpbin-egress-gateway
        namespace: egress-gateway
      spec:
        # Add the following infrastructure configuration to your Gateway CR
        infrastructure:
          parametersRef:
            group: ""
            kind: ConfigMap
            name: asm-kube-gateway-options
        # ... rest of your Gateway configuration
      1. Указывает имя gateway.
      2. Указывает namespace gateway.

    Проверка

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

      kubectl create namespace curl
    2. Включите инъекцию sidecar для namespace. Если в вашей конфигурации используется стратегия обновления 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.6   47h
      2. Добавьте label к namespace, используя имя revision, чтобы включить инъекцию 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 gateway, выполнив эту команду:

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

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

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

      ...
      {
        "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
      ...