如何使Lua Envoy过滤器在istio群集上工作?

时间:2019-04-09 14:20:21

标签: istio envoyproxy

我试图使一个lua envoy过滤器可以与istio网关一起使用,但是我已添加到群集中,并且它似乎在不存在该过滤器的情况下工作。

我已使用本指南https://istio.io/docs/setup/kubernetes/install/kubernetes/在GKE上配置了istio群集。

有人遇到过同样的问题吗?

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: edge-lua-filter
spec:
  workloadLabels:
    app: httpbin-gateway
  filters:
  - listenerMatch:
      listenerType: GATEWAY
    filterName: envoy.lua
    filterType: HTTP
    filterConfig:
      inlineCode: |
        -- Called on the request path.
        function envoy_on_request(request_handle)
            request_handle:headers():add("foo", "bar")
        end
        -- Called on the response path.
        function envoy_on_response(response_handle)
            body_size = response_handle:body():length()
            response_handle:headers():add("response-body-size", tostring(body_size))
        end
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: httpbin-gateway
  namespace: foo
spec:
  selector:
    istio: ingressgateway # use Istio default gateway implementation
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: httpbin
  namespace: foo
spec:
  hosts:
  - "*"
  gateways:
  - httpbin-gateway
  http:
  - route:
    - destination:
        port:
          number: 8000
        host: httpbin.foo.svc.cluster.local

4 个答案:

答案 0 :(得分:0)

您正在将过滤器应用于GATEWAY。入口网关的“应用”名称是“ istio-ingressgateway”,而不是“ httpbin-gateway”

您有2个选择:

  1. 更改工作负载标签
  workloadLabels:
    app: istio-ingressgateway

  1. 删除工作量标签。 Istio会将更改自动应用到GATEWAY窗格

答案 1 :(得分:0)

我同意 larsitto ,您可能对 workloadLabels 有疑问-尝试将其保留为空或指定在您的Deployment> spec> template> labels中指定的一些标签[]

例如,此代码对我有用:

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: hello_world
spec:
  workloadLabels:
  filters:
  - listenerMatch:
      listenerType: SIDECAR_INBOUND
      listenerProtocol: HTTP
    filterName: envoy.lua
    filterType: HTTP
    filterConfig:
      inlineCode: |
        ...

答案 2 :(得分:0)

我有完全相同的问题。我想将EnvoyFilter应用于 GATEWAY listenerType。

我的问题是,此过滤器将应用于部署在群集上的每个istio网关,这不是我想要的。

例如,我有2个网关:一个用于bookinfo示例,另一个用于MyOwnService

现在,如果我部署具有 GATEWAY listenerType的EnvoyFilter,它将在bookinfo网关和MyOwnService网关上执行。

因此,我打算使用EnvoyFilter的spec.workloadLabels属性仅将其应用于MyOwnService网关,但是我不知道必须在此处分配什么标签。因为我处于GATEWAY级别,所以如果指定目标部署的标签,则永远不会应用过滤器。

如果我将listenerType更改为SIDECAR_INBOUND,则它可以按预期工作,因为在边车级别,特使代理“知道”其自己pod的标签,并且可以将过滤器相应地应用于(或不应用于)工作负载标签。

但是在GATEWAY级别上,如何告诉或不应用过滤器? spec.workloadLabels是否真的与GATEWAY listenerType兼容?

答案 3 :(得分:0)

如果使用filterType HTTP,则还需要使用值HTTP定义listenerProtocol属性。

另请参阅:

https://istio.io/docs/reference/config/networking/v1alpha3/envoy-filter/

注3:对于filterType:HTTP的过滤器,必须包含带有listenerProtocol的listenerMatch部分:HTTP或过滤器无效。