在 Istio 中禁用集群内通信的代理协议

问题描述 投票:0回答:1

我在具有代理协议的 LoadBalancer 后面设置了 istio,因此我必须设置以下 EnvoyProxy:

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: proxy-protocol
  namespace: istio-system
spec:
  workloadSelector:
    labels:
      istio: ingressgateway
  configPatches:
    - applyTo: LISTENER
      patch:
        operation: MERGE
        value:
          listener_filters:
            - name: envoy.filters.listener.proxy_protocol
            - name: envoy.filters.listener.tls_inspector
---
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: ingressgateway-settings
  namespace: istio-system
spec:
  configPatches:
    - applyTo: NETWORK_FILTER
      match:
        listener:
          filterChain:
            filter:
              name: envoy.http_connection_manager
      patch:
        operation: MERGE
        value:
          name: envoy.http_connection_manager
          typed_config:
            "@type": type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager
            skip_xff_append: false
            use_remote_address: true
            xff_num_trusted_hops: 1

一切正常,但问题是它也会影响集群内的通信。在集群内部通信时,我不想使用代理协议。它会影响我的用例,我想设置 VirtualService,然后将请求路由到相关服务,这些服务也是 istio 实体(特别是 Istio VirtualService/knative 服务):

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: "app-virtual-service"
spec:
  gateways:
    - knative-serving/knative-local-gateway
    - "app-gateway"
  hosts:
    - hub.example.com
  http:
    # GraphQL API
    - match:
        - uri:
            prefix: "/graphql"
      rewrite:
        authority: app-api.app.svc.cluster.local
      route:
        - destination:
            host: app-api.app.svc.cluster.local
          weight: 100
    # Hall service
    - match:
        - uri:
            prefix: "/hall"
      rewrite:
        authority: app-hall.app.svc.cluster.local
      route:
        - destination:
            host: app-hall.app.svc.cluster.local
          weight: 100
    # Manager frontend
    - match:
        - uri:
            exact: /
        {{- range .Values.manager.paths }}
        - uri:
            prefix: {{ . | quote }}
        {{- end }}
      rewrite:
        authority: app-manager.app.svc.cluster.local
      route:
        - destination:
            host: app-manager.app.svc.cluster.local
          weight: 100

例如,每当我尝试查询

http://hub.example.com/graphql
时,它都会尝试在没有代理协议的情况下查询
app-api.app.svc.cluster.local
(即 Istio VirtualService)(当由于规则而预期时,或者至少我是这么理解的)。因此失败并出现此错误:

upstream connect error or disconnect/reset before headers. reset reason: connection termination

如果我禁用代理规则,一切都可以正常工作,如果我尝试直接从 LoadBalancer 访问 knative 服务,它也可以工作。

不起作用的是每当某个 VirtualService 尝试将请求转发到另一个 VirtualService 时。所以我的方案是这样的

外部 LoadBalancer -> Istio Ingress LoadBalancer - 网关 - VirtualService(接受代理协议负载) -> 终端服务 VirtualService(也接受代理协议负载,但之前的服务正在发送原始查询)

有什么方法可以避免在集群通信中使用代理协议吗?我考虑过的可能的解决方案是创建多个网关,但我不确定应该如何处理并在过滤器内使用它。

kubernetes istio knative
1个回答
0
投票

在这个官方 Istio 文档中,他们解释了如何绕过特定 IP 范围的代理,

global.proxy.includeIPRanges
global.proxy.excludeIPRanges
选项将帮助您绕过 Envoy 代理。在文档中,他们解释了如何绕过外部服务的代理,您需要执行相反的操作。检查集群的内部 IP 范围并使用
global.proxy.excludeIPRanges
选项并将内部 IP 范围传递给此命令。正如下面的命令中提到的

kubectl describe pod kube-apiserver -n kube-system | grep 'service-cluster-ip-range' 
#command for getting the IP range of the cluster
istioctl manifest apply <the flags you used to install Istio> --set values.global.proxy.excludeIPRanges="IP range"
#command for bypassing the internal IP range from envoy proxy
© www.soinside.com 2019 - 2024. All rights reserved.