第 2 章 将流量进入网格


使用 Istio API,您可以配置使用网关注入安装的网关代理,以接受来自网格外部的流量,并将该流量路由到网格中的服务。

您可以使用 LoadBalancer 类型 Service 或 OpenShift Routes 将网关代理公开给集群外的流量。

2.1. 关于配置使用网关注入安装的网关,以接受入口流量

当使用网关注入安装网关时,您可以将其配置为使用 Istio 网关和 VirtualService 资源接收入口流量。Istio 网关资源 描述了在网格边缘运行的负载均衡器,接收传入或传出的 HTTP/TCP 连接。Gateway 规格描述了应公开的一组端口、要使用的协议类型以及负载均衡器的 Server Name Indication (SNI)配置。VirtualServices 定义应用到 Istio 网关的 路由规则,类似于您可以使用 VirtualServices 为内部网格流量定义路由规则。

在以下示例中,Istio 网关资源 将网关代理配置为充当外部流量的入口点。此配置会为主机公开端口 443 (HTTPS )。示例配置适用于带有 istio: ingressgateway 标签的 pod。tls 模式配置为 SIMPLE,它使用示例提供的证书和私钥来终止传入的 HTTPS 流量。

配置示例

apiVersion: networking.istio.io/v1
kind: Gateway
metadata:
  name: info-gateway
  namespace: info
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 443
      name: https-443
      protocol: HTTPS
    hosts:
    - info.com
    tls:
      mode: SIMPLE
      serverCertificate: /etc/certs/servercert.pem
      privateKey: /etc/certs/privatekey.pem

以下 VirtualService 绑定到上例配置中显示的 Istio 网关资源。该规范定义将带有 /reviews/ 路径前缀的流量路由到 info 命名空间中的 reviews 服务的规则。VirtualService 明确引用前面显示的 网关资源。这样可确保路由规则仅应用于通过指定网关进入的流量。

配置示例

kind: VirtualService
metadata:
  name: info-rule
  namespace: info
spec:
  hosts:
  - info.com
  gateways:
  - info/bookinfo-gateway
  http:
  - match:
    - uri:
        prefix: /reviews/
    route:
    - destination:
        port:
          number: 9080
        host: reviews.info.svc.cluster.local

其他资源

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

此流程使用 Istio 网关和 VirtualService 资源来配置使用网关注入部署的网关。资源配置网关,将网格中的服务公开给网格外的流量。然后,您可以通过将网关设置为类型为 LoadBalancerService,将网关公开给集群外的流量。

先决条件

  • 已使用网关注入安装了 Istio 网关。

流程

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

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

    $ oc label namespace httpbin istio-injection=enabled
    注意

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

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

      $ oc get istiorevisions.sailoperator.io

      输出示例:

      NAME              TYPE    READY   STATUS    IN USE   VERSION   AGE
      default-v1-23-0   Local   True    Healthy   True    v1.23.0   3m33s

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

      $ oc label namespace httpbin istio.io/rev=default-v1-23-0
  3. 运行以下命令,部署名为 httpbin 的示例服务:

    $ oc apply -n httpbin -f https://raw.githubusercontent.com/openshift-service-mesh/istio/refs/heads/master/samples/httpbin/httpbin.yaml
  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
    1
    选择器 设置为网关代理 Deployment 的 pod 模板中指定的唯一标签或一组标签。默认情况下,Istio 网关资源 配置适用于所有命名空间中的匹配网关 pod。
    2
    使用 hosts 字段,指定在尝试访问关联端口上网格服务时客户端可以使用的地址列表。
  5. 运行以下命令来应用 YAML 文件:

    $ oc apply -f httpbin-gw.yaml
  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
    1
    指定 VirtualService 的路由规则应用到 的主机指定的主机 必须由 Istio 网关资源 公开。
    2
    通过将 网关名称添加到网关 列表中,将 VirtualService 绑定到上一步中创建的 Istio 网关资源。
    3
    通过定义包含 httpbin 服务 的主机和端口 的目的地,将匹配流量路由到之前部署的 httpbin 服务。
  7. 运行以下命令来应用 YAML 文件:

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

    $ oc create namespace curl
  9. 运行以下命令来部署 curl 客户端:

    $ oc apply -n curl -f https://raw.githubusercontent.com/openshift-service-mesh/istio/refs/heads/master/samples/curl/curl.yaml
  10. 运行以下命令,使用 curl pod 的名称设置 CURL_POD 变量:

    $ CURL_POD=$(oc get pods -n curl -l app=curl -o jsonpath='{.items[*].metadata.name}')
  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
  12. 响应应具有 200 OK HTTP 状态,表示请求成功。

    输出示例

    HTTP/1.1 200 OK
    server: istio-envoy
    ...

  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

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

    输出示例

    HTTP/1.1 404 Not Found
    server: istio-envoy
    ...

  14. 通过将 Service 类型设置为 LoadBalancer,将网关代理公开给集群外的流量:

    $ oc patch service <gateway_name> -n <gateway_namespace> -p '{"spec": {"type": "LoadBalancer"}}'
    注意

    网关也可以使用 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}')
    2. 如果集群在 GCP 或 Azure 上运行,请运行以下命令设置 INGRESS_HOST 变量:

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

      $ curl -s -I -H Host:httpbin.example.com http://$INGRESS_HOST/headers
  16. 验证响应是否具有 HTTP/1.1 200 OK 状态,这表示请求是否成功。

VirtualService API 参考

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.