【问题标题】:Add Custom Header to HTTP request in Load Balancer在负载均衡器中向 HTTP 请求添加自定义标头
【发布时间】:2021-04-08 04:00:33
【问题描述】:

我有一个容器化的应用程序/服务部署在带有 istio 服务网格的 openshift 容器平台中。在 istio 虚拟服务 yaml 中,我想验证 http 请求是否具有标头(例如:版本)和值 v1。我在验证标头的虚拟服务 yaml 中添加了以下配置。 但我正在寻找可用的选项来使用 loadbalancer/ingress/openshif 路由等在 HTTP 请求中注入此标头。 因为我的 istio-ingressgateway 服务是使用 ClusterIp 部署的。我已经使用 openshift 路由将外部流量发送到 ingressgateway。 请分享向 http 请求添加标头的可能方法

  http:
    - match:
        - headers: # Match header
            version: # header that we decided for dark release
              exact: v1 # exact match


 

【问题讨论】:

    标签: routes openshift redhat istio servicemesh


    【解决方案1】:

    您可以使用envoy filter 来执行此操作。

    在 envoy 过滤器下方,将名为 customer-id 的请求标头添加到带有 alice 值的所有通过 istio 入口网关的请求。如果有人想使用它,我还注释了响应标头的代码。

    apiVersion: networking.istio.io/v1alpha3
    kind: EnvoyFilter
    metadata:
      name: lua-filter
      namespace: istio-system
    spec:
      workloadSelector:
        labels:
          istio: ingressgateway
      configPatches:
      - applyTo: HTTP_FILTER
        match:
          context: GATEWAY
          listener:
            filterChain:
              filter:
                name: "envoy.http_connection_manager"
                subFilter:
                  name: "envoy.router"
        patch:
          operation: INSERT_BEFORE
          value:
           name: envoy.lua
           typed_config:
             "@type": "type.googleapis.com/envoy.config.filter.http.lua.v2.Lua"
             inlineCode: |
                function envoy_on_request(request_handle)
                    request_handle:headers():add("customer-id", "alice")
                end
               # function envoy_on_response(response_handle)
               #     response_handle:headers():add("customer-id", "alice")
               # end
    

    我用过一些 yaml 来测试它,它可能对测试上述过滤器很有用。

    • 如果您使用上述带有 alice 标头的过滤器,那么所有请求都会转到 nginx-v1
    • 如果您使用上述带有 bob 头的过滤器,那么所有请求都会转到 nginx-v2
    • 如果删除此过滤器,则 nginx-v1 和 nginx-v2 之间的比例为 50/50

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-v1
    spec:
      selector:
        matchLabels:
          run: nginx1
      replicas: 1
      template:
        metadata:
          labels:
            run: nginx1
            app: frontend
        spec:
          containers:
          - name: nginx1
            image: nginx
            ports:
            - containerPort: 80
            lifecycle:
              postStart:
                exec:
                  command: ["/bin/sh", "-c", "echo Hello nginx1 > /usr/share/nginx/html/index.html"]
    
    ---
    
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-v2
    spec:
      selector:
        matchLabels:
          run: nginx2
      replicas: 1
      template:
        metadata:
          labels:
            run: nginx2
            app: frontend
        spec:
          containers:
          - name: nginx2
            image: nginx
            ports:
            - containerPort: 80
            lifecycle:
              postStart:
                exec:
                  command: ["/bin/sh", "-c", "echo Hello nginx2 > /usr/share/nginx/html/index.html"]
    
    
    
    ---
    
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx
      labels:
        app: frontend
    spec:
      ports:
      - name: http-front
        port: 80
        protocol: TCP
      selector:
        app: frontend
    
    ---
    
    apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      name: gatewayx
    spec:
      selector:
        istio: ingressgateway # use istio default controller
      servers:
      - port:
          number: 80
          name: http
          protocol: HTTP
        hosts:
        - "*"
    
    ---
    
    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: nginxvirt
    spec:
      hosts:
      - '*'
      gateways:
      - gatewayx
      http:
      - name: "route-1"
        match:
        - headers:
            customer-id:
              exact: alice
        route:
        - destination:
            host: nginx
            subset: v1
      - name: "route-2"
        match:
        - headers:
            customer-id:
              exact: bob
        route:
        - destination:
            host: nginx
            subset: v2
      - route:
        - destination:
            host: nginx
    
    ---
    
    apiVersion: networking.istio.io/v1alpha3
    kind: DestinationRule
    metadata:
      name: nginxdest
    spec:
      host: nginx
      subsets:
      - name: v1
        labels:
          run: nginx1
      - name: v2
        labels:
          run: nginx2
    

    【讨论】:

    • @terrasson marc 你可能会觉得这很有用。
    【解决方案2】:

    应该可以像使用virtualService一样

    spec:  
      hosts:  
      - "example.com"  
      gateways:  
      - your-gateway  
      http:  
      -   
        name: remove-headers  
        headers:  
          request:  
            remove:  
            - yourHeader  
    
    

    但我不能让它工作。 如果可以的话,请分享:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-05
      • 1970-01-01
      • 1970-01-01
      • 2020-03-27
      • 2015-01-22
      相关资源
      最近更新 更多