2.2. 使用 Istio 网关和 VirtualService 资源公开服务


您可以使用 Istio 网关和 VirtualService 资源来配置使用网关注入部署的网关。资源将网格中的服务公开给网格之外的流量。您可以将网关 Service 类型设置为 LoadBalancer,以允许来自集群外部的流量。

先决条件

  • 已使用网关注入安装了 Istio 网关。
  • 您使用 Istio 网关和 VirtualService 资源。
  • 您已有 VirtualService 配置,且不会计划迁移到 ambient 模式。

流程

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

    $ oc create namespace httpbin
    Copy to Clipboard Toggle word wrap
  2. 在命名空间中启用 sidecar 注入。如果您使用 InPlace 升级策略,请运行以下命令:

    $ oc label namespace httpbin istio-injection=enabled
    Copy to Clipboard Toggle word wrap
    注意

    如果使用 基于 Revision 的 升级策略,请运行以下命令:

    1. 要查找您的 & lt;revision-name& gt;,请运行以下命令:

      $ 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
    1. 使用修订名称标记命名空间,以启用 sidecar 注入:

      $ oc label namespace httpbin istio.io/rev=default
      Copy to Clipboard Toggle word wrap
  3. 运行以下命令,部署名为 httpbin 的示例服务:

    $ oc apply -n httpbin -f https://raw.githubusercontent.com/openshift-service-mesh/istio/refs/heads/master/samples/httpbin/httpbin.yaml
    Copy to Clipboard Toggle word wrap
  4. 创建名为 httpbin-gw.yaml 的 YAML 文件,该文件定义了 Istio 网关资源。此资源将网关代理配置为为主机公开端口 80 (HTTP),即 httpbin.example.com

    apiVersion: networking.istio.io/v1
    kind: Gateway
    metadata:
      name: httpbin-gateway
      namespace: httpbin
    spec:
      selector:
        istio: <gateway_name> 
    1
    
      servers:
      - port:
          number: 80
          name: http
          protocol: HTTP
        hosts:
        - httpbin.example.com 
    2
    Copy to Clipboard Toggle word wrap
    1
    选择器 设置为网关代理 Deployment 的 pod 模板中指定的唯一标签或一组标签。默认情况下,Istio 网关资源 配置适用于所有命名空间中的匹配网关 pod。
    2
    使用 hosts 字段,指定在尝试访问关联端口上网格服务时客户端可以使用的地址列表。
  5. 运行以下命令来应用 YAML 文件:

    $ oc apply -f httpbin-gw.yaml
    Copy to Clipboard Toggle word wrap
  6. VirtualService 创建名为 httpbin-vs.yaml 的 YAML 文件。VirtualService 定义将网关代理的流量路由到 httpbin 服务的规则。

    apiVersion: networking.istio.io/v1
    kind: VirtualService
    metadata:
      name: httpbin
      namespace: httpbin
    spec:
      hosts:
      - httpbin.example.com 
    1
    
      gateways:
      - httpbin-gateway 
    2
    
      http:
      - match:
        - uri:
            prefix: /status
        - uri:
            prefix: /headers
        route:
        - destination: 
    3
    
            port:
              number: 8000
            host: httpbin
    Copy to Clipboard Toggle word wrap
    1
    指定 VirtualService 的路由规则应用到 的主机指定的主机 必须由 Istio 网关资源 公开。
    2
    通过将 网关名称添加到网关 列表中,将 VirtualService 绑定到上一步中创建的 Istio 网关资源。
    3
    通过定义包含 httpbin 服务 的主机和端口 的目的地,将匹配流量路由到之前部署的 httpbin 服务。
  7. 运行以下命令来应用 YAML 文件:

    $ oc apply -f httpbin-vs.yaml
    Copy to Clipboard Toggle word wrap
  8. 为了进行验证,请运行以下命令为 curl 客户端创建一个命名空间:

    $ oc create namespace curl
    Copy to Clipboard Toggle word wrap
  9. 运行以下命令来部署 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
  10. 运行以下命令,使用 curl pod 的名称设置 CURL_POD 变量:

    $ CURL_POD=$(oc get pods -n curl -l app=curl -o jsonpath='{.items[*].metadata.name}')
    Copy to Clipboard Toggle word wrap
  11. 使用 curl 客户端,通过入口网关服务资源向 httpbin 应用程序的 /headers 端点发送请求。将请求的 Host 标头设置为 httpbin.example.com,以匹配 Istio 网关和 VirtualService 资源指定的主机。运行以下 curl 命令来发送请求:

    $ oc exec $CURL_POD -n curl -- \
      curl -s -I \
        -H Host:httpbin.example.com \
        <gateway_name>.<gateway_namespace>.svc.cluster.local/headers
    Copy to Clipboard Toggle word wrap
  12. 响应应具有 200 OK HTTP 状态,表示请求成功。

    HTTP/1.1 200 OK
    server: istio-envoy
    ...
    Copy to Clipboard Toggle word wrap
  13. 运行以下命令,将 curl 请求发送到在 httpbin VirtualService 中定义的对应 URI 前缀匹配的端点:

    $ oc exec $CURL_POD -n curl -- \
      curl -s -I \
        -H Host:httpbin.example.com \
        <gateway_name>.<gateway_namespace>.svc.cluster.local/get
    Copy to Clipboard Toggle word wrap

    响应应返回 404 Not Found 状态。这是正常的,因为 /get 端点在 httpbin VirtualService 资源中没有匹配的 URI 前缀。

    HTTP/1.1 404 Not Found
    server: istio-envoy
    ...
    Copy to Clipboard Toggle word wrap
  14. 通过将 Service 类型设置为 LoadBalancer,将网关代理公开给集群外的流量:

    $ oc patch service <gateway_name> -n <gateway_namespace> -p '{"spec": {"type": "LoadBalancer"}}'
    Copy to Clipboard Toggle word wrap
    注意

    网关也可以使用 OpenShift 路由公开给集群外部的流量。如需更多信息,请参阅"使用 OpenShift 路由向集群外的流量扩展网关"。

  15. 使用网关服务资源的外部主机名或 IP 地址,验证可以从集群外部访问 httpbin 服务。确保为集群在其中运行的环境正确设置了 INGRESS_HOST 变量。

    1. 如果集群在 AWS 上运行,请运行以下命令设置 INGRESS_HOST 变量:

      $ INGRESS_HOST=$(oc get service <gateway_name> -n <gateway_namespace> -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
      Copy to Clipboard Toggle word wrap
    2. 如果集群在 GCP 或 Azure 上运行,请运行以下命令设置 INGRESS_HOST 变量:

      $ INGRESS_HOST=$(oc get service <gateway_name> -n <gateway_namespace> -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
      Copy to Clipboard Toggle word wrap
    3. 运行以下命令,使用网关的主机向 httpbin 服务发送 curl 请求:

      $ curl -s -I -H Host:httpbin.example.com http://$INGRESS_HOST/headers
      Copy to Clipboard Toggle word wrap
  16. 验证响应是否具有 HTTP/1.1 200 OK 状态,这表示请求是否成功。
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat