xiaods / k8e

K8E - Kubernetes Easy Engine
https://getk8e.com
Apache License 2.0
387 stars 25 forks source link

目前主流的几款cni插件都不支持proxyProtocol,无法获取客户端源ip #327

Closed w7team closed 8 months ago

w7team commented 10 months ago

Calico、Cilium、Flannel目前都不支持proxyProtocol,没办法把真实的客户端ip加到头部信息里。有没有比较好的方案,或者有解决这方面问题的cni插件

xiaods commented 10 months ago

第三方反向代理么:https://github.com/flomesh-io/pipy 这块很容易的。和 cni 没啥关系

w7team commented 10 months ago

你研究一下就知道了,cni会把外部ip中转一次到内部的pod,导致客户端源ip被隐藏掉

xiaods commented 10 months ago

你研究一下就知道了,cni会把外部ip中转一次到内部的pod,导致客户端源ip被隐藏掉

Cilium 使用直接服务器返回(DSR)模式: DSR模式的另一个优点是可以保留客户端的源IP地址。 https://docs.cilium.io/en/v1.12/gettingstarted/kubeproxy-free/#direct-server-return-dsr

xiaods commented 10 months ago

https://blog.getambassador.io/externaltrafficpolicy-local-on-kubernetes-e66e498212f9
几种解决方案。

w7team commented 10 months ago

https://blog.getambassador.io/externaltrafficpolicy-local-on-kubernetes-e66e498212f9 几种解决方案。

这篇文章我也看过,多节点时不友好,没有直接支持proxyProtocol效果最好。目前这个属性,只有公有云自己搞的cni插件才支持

xiaods commented 10 months ago

https://blog.getambassador.io/externaltrafficpolicy-local-on-kubernetes-e66e498212f9 几种解决方案。

这篇文章我也看过,多节点时不友好,没有直接支持proxyProtocol效果最好。目前这个属性,只有公有云自己搞的cni插件才支持

你是这个方案吗:https://www.ssgeek.com/post/k8s-sheng-chan-shi-jian-zhi-huo-qu-ke-hu-duan-zhen-shi-ip/#4-%E7%8E%AF%E5%A2%83%E5%87%86%E5%A4%87

w7team commented 10 months ago

我目前ingress用的traefik,traefik是支持proxyProtocol的,他可以把tcp头部信息中的源ip信息转成x-forwarded-for输出。但是前提是需要第一跳支持proxyProtocol。一般公有云自己的负载均衡器会支持这个,如果不外接负载均衡器,直通k8s的话,就需要k8s的cni插件支持这个。

xiaods commented 10 months ago

https://github.com/cilium/cilium/issues/21438 @w7team 看你也在社区加了标记,那就等等这个特性吧。

xiaods commented 10 months ago

@w7team https://getk8e.zhubai.love/posts/2310032131440984064 使用 k8e 玩转 kube-vip with Cilium's Egress Gateway 特性, 我把 kubevip 的特性重新摸了一把,他的 ServiceLB 和 VIP 都能支持,还是很方便。

但是你需要的 Source IP 的特性,要等到 cilium cni 支持携带 proxyProtocol,我在更新。

xiaods commented 10 months ago

if you use ingress service, it also support ProxyProtocol, see this commit: https://github.com/chaunceyjiang/cilium/commit/24911b03cf4c3f06481394b12e1a06762dce5d2a

xiaods commented 9 months ago

@w7team 告诉你一个好消息,cilium 支持了 Proxy 协议,可以用了。

https://github.com/cilium/cilium/pull/28194

w7team commented 9 months ago

我看cilium好像连ingressController都做了,这就不需要安装nginx-ingress或者traefik了吧?

xiaods commented 8 months ago

我看cilium好像连ingressController都做了,这就不需要安装nginx-ingress或者traefik了吧?

是的,但是我还没有时间去实验。你可以尝试。