Istio 和自定义 HTTP 方法

Istio and the custom HTTP method

如何使 Istio 路由自定义 HTTP 方法?

$ curl -v -X MYMETHOD https://myapp.com
< HTTP/2 400 
< content-length: 11
< content-type: text/plain
< date: Wed, 29 Dec 2021 08:24:36 GMT
< server: envoy
< x-envoy-upstream-service-time: 1
< 
* Connection #0 to host myapp.com left intact
Bad Request
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: myapp
spec:
  gateways:
    - gw
  hosts:
    - 'myapp.com'
  http:
    - name: myapp
      route:
        - destination:
            host: myapp
            port:
              number: 8000

Kubernetes:1.22.4 Istio:1.12.1

Envoy 不支持自定义 HTTP 方法。 Envoy 实现了 H/1 编解码器,它有一个它接受的 HTTP 方法的硬编码列表(参见 RFC

Envoy 上有一个未解决的问题 Github:https://github.com/envoyproxy/envoy/issues/18819

所以你无法通过 HTTP 路由实现你想要的。但是你可以让它与 TCP/TLS 路线一起工作。

为此,请执行以下操作:

  1. service istio-ingressgateway 上设置正确的协议:
ports:
 - name: tcp
    nodePort: 8000
    port: 8000
    protocol: TCP
  1. 更改网关端口上的协议
port:
  name: tcp-gateway
  number: 8000
  protocol: TCP
  1. 为 TCP 流量配置虚拟服务:
spec:
  gateways:
  - example-gateway
  hosts:
  - myapp.com
  tcp:
  - match:
    - port: 8000
    route:
    - destination:
        host: myapp.svc.cluster.local
        port:
          number: 8000

对于 TCP 端点,您必须考虑到无法应用 host/path-based 路由。因此,请确保您的 myappp VirtualService 是为该端口提供服务的唯一服务。