3.2. 使用 Istio API 通过网关直接出口流量


使用 Istio API 通过使用网关注入安装的网关直接出站 HTTP 流量。

先决条件

  • 您已使用网关注入安装网关。

流程

  1. 运行以下命令,创建一个名为 curl 的命名空间:

    $ oc create namespace curl
    Copy to Clipboard Toggle word wrap
  2. 根据您使用的更新策略,运行适当的命令在命名空间中启用 sidecar 注入:

    1. 如果您使用 InPlace 更新策略,请运行以下命令:

      $ oc label namespace curl istio-injection=enabled
      Copy to Clipboard Toggle word wrap
    2. 如果使用 RevisionBased update 策略,请运行以下命令:

      1. 运行以下命令来显示修订名称:

        $ oc get istiorevisions.sailoperator.io
        Copy to Clipboard Toggle word wrap

        输出示例

        NAME     TYPE    READY   STATUS    IN USE   VERSION   AGE
        default  Local   True    Healthy   True     v1.24.3   3m33s
        Copy to Clipboard Toggle word wrap

      2. 运行以下命令,使用修订名称标记命名空间以启用 sidecar 注入:

        $ oc label namespace curl istio.io/rev=default
        Copy to Clipboard Toggle word wrap
  3. 运行以下命令来部署 curl 应用程序:

    $ oc apply -n curl -f https://raw.githubusercontent.com/openshift-service-mesh/istio/refs/heads/master/samples/curl/curl.yaml
    Copy to Clipboard Toggle word wrap
  4. 导出使用 curl pod 初始化的 CURL_POD 环境变量:

    $ export CURL_POD=$(oc get pod -n curl -l app=curl -o jsonpath='{.items[0].metadata.name}')
    Copy to Clipboard Toggle word wrap
  5. 创建名为 http-se.yaml 的 YAML 文件,该文件将来自网格的流量定向到外部服务。以下示例定义了 URL 的 ServiceEntry

    配置示例

    apiVersion: networking.istio.io/v1
    kind: ServiceEntry
    metadata:
      name: egress-se
      namespace: curl
    spec:
      hosts:
        - docs.redhat.com
      ports:
        - number: 80
          name: http-port
          protocol: HTTP
      location: MESH_EXTERNAL
      resolution: DNS
    Copy to Clipboard Toggle word wrap

  6. 运行以下命令来应用 YAML 文件:

    $ oc apply -f http-se.yaml
    Copy to Clipboard Toggle word wrap
  7. 确保正确应用 ServiceEntry 配置。运行以下命令,向您在上一步中指定的主机发送 HTTP 请求:

    $ oc exec "$CURL_POD" -n curl -c curl -- curl -sSL -o /dev/null -D - http://docs.redhat.com
    Copy to Clipboard Toggle word wrap

    此命令应该返回 HTTP 状态代码,如 301 (redirect)或 200 (success),表示连接正常工作。

  8. 创建名为 http-gtw.yaml 的 YAML 文件,该文件会创建一个出口网关,并将流量从网格路由到为外部服务指定的主机。

    配置示例

    apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      name: egress-gw
      namespace: <gateway_namespace> # Namespace where the egress gateway is deployed
    spec:
      selector:
        istio: <gateway_name> # Selects the egress-gateway instance to handle this traffic
      servers:
        - port:
            number: 80
            name: http
            protocol: HTTP
          hosts:
            - docs.redhat.com # External service host, not a full URL.
    ---
    apiVersion: networking.istio.io/v1alpha3
    kind: DestinationRule
    metadata:
      name: egress-dr
      namespace: <gateway_namespace> # Namespace where the egress gateway is deployed
    spec:
      host: <gateway_name>.<gateway_namespace>.svc.cluster.local
      subsets:
        - name: rh-docs
    Copy to Clipboard Toggle word wrap

  9. 运行以下命令来应用 YAML 文件:

    $ oc apply -f http-gtw.yaml
    Copy to Clipboard Toggle word wrap
  10. 创建一个名为 http-vs.yaml 的 YAML 文件,它设置一个 VirtualService,以通过出口网关到外部主机从应用程序 sidecar 的流量流。

    配置示例

    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: egress-vs
      namespace: curl # Namespace where the curl pod is running
    spec:
      hosts:
        - docs.redhat.com # External service host, not a full URL.
      gateways:
        - mesh
        - <gateway_namespace>/egress-gw # Egress gateway name defined in the file that you used in the previous step.
      http:
        - match:
            - gateways:
                - mesh
              port: 80
          route:
            - destination:
                host: <gateway_name>.<gateway_namespace>.svc.cluster.local
                subset: rh-docs
                port:
                  number: 80
              weight: 100
        - match:
            - gateways:
                - <gateway_namespace>/egress-gw # Egress gateway name defined in the file that you used in the previous step.
              port: 80
          route:
            - destination:
                host: docs.redhat.com
                port:
                  number: 80
              weight: 100
    Copy to Clipboard Toggle word wrap

  11. 运行以下命令来应用 YAML 文件:

    $ oc apply -f http-vs.yaml
    Copy to Clipboard Toggle word wrap
  12. 将 HTTP 请求重新发送到 URL:

    $ oc exec "$CURL_POD" -n curl -c curl -- curl -sSL -o /dev/null -D - http://docs.redhat.com
    Copy to Clipboard Toggle word wrap

    终端应该显示类似以下输出的信息:

    输出示例

    ...
    HTTP/1.1 301 Moved Permanently
    ...
    location: <example_url>
    ...
    
    HTTP/2 200
    Content-Type: text/html; charset=utf-8
    Copy to Clipboard Toggle word wrap

  13. 运行以下命令,确保请求通过网关路由:

    $ oc logs deployment/<gateway_name> -n <gateway_namespace> | tail -1
    Copy to Clipboard Toggle word wrap
    注意

    必须启用访问日志记录才能使此验证步骤正常工作。您可以通过将 Istio 资源中的 spec.values.meshConfig.accessLogFile 字段设置为 /dev/stdout 来启用对标准输出的访问日志。

    终端应该显示类似以下输出的信息:

    输出示例

    [2024-11-07T14:35:52.428Z] "GET / HTTP/2" 301 - via_upstream - "-" 0 0 24 24 "10.128.2.30" "curl/8.11.0" "79551af2-341b-456d-b414-9220b487a03b" "docs.redhat.com" "23.55.176.201:80" outbound|80||docs.redhat.com 10.128.2.29:49766 10.128.2.29:80 10.128.2.30:38296 -
    Copy to Clipboard Toggle word wrap

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat