【Host Rewrite】重写请求Authority和Host标头

ASM支持在HTTP请求发往具体的服务主机前,重写请求的Authority和Host标头。如果通过虚拟服务将请求重定向到其它服务,还需要配置重写Host与Authority标头使目标服务接受请求。本文介绍如何配置重写请求的Authority和Host标头。

前提条件

已完成准备工作,并部署httpbin服务、sleep服务和nginx服务。具体操作,请参见准备工作

操作步骤

  1. 使用istioctl工具,执行以下命令,为nginx服务部署Waypoint代理。

    istioctl x waypoint apply --service-account nginx

    预期输出:

    waypoint default/nginx applied
  2. 为nginx服务配置虚拟服务,将发往nginx服务的请求转发至httpbin服务,同时配置重写Host和Authority标头为httpbin:8000

    1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理

    2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择流量管理中心 > 虚拟服务,然后单击创建

    3. 创建页面,进行如下配置,单击预览,确认YAML内容无误后,单击确认,然后单击创建

      image.png

      展开查看预览YAML

      apiVersion: networking.istio.io/v1beta1
      kind: VirtualService
      metadata:
        name: nginx
        namespace: default
      spec:
        hosts:
          - nginx.default.svc.cluster.local
        http:
          - rewrite:
              authority: 'httpbin:8000'
            route:
              - destination:
                  host: httpbin.default.svc.cluster.local
  3. 执行以下命令,验证标头重写是否生效。

    kubectl exec -it deploy/sleep -- curl nginx:8000/headers

    预期输出:

    {
      "headers": {
        "Accept": "*/*", 
        "Host": "httpbin:8000", 
        "User-Agent": "curl/8.1.2"
      }
    }

    可以看到在sleep容器内部访问nginx服务的/headers路径,请求被转发到httpbin服务的/headers路径上(即请求发往http://httpbin:8000/headers)。该路径会返回接收到的请求标头,您可以看到请求的Host标头被修改为httpbin:8000

    重要

    在Ambient模式下,若您需要重写请求的Authority和Host标头,将发往目标服务1的请求转发到目标服务2,则目标服务2不能部署Waypoint代理。