没有 X-Forwarded-For 在具有 ClusterIP 服务和 kube-keepalive-vip 的裸机 Kubernetes 上使用 Traefik 2
no X-Forwarded-For with Traefik 2 on bare metal Kubernetes with ClusterIP Service and kube-keepalive-vip
我的设置是一个裸机集群 运行 Kubernetes 1.17。我正在使用 Traefik 2(.3.2) 作为反向代理并为我使用 kube-keepalive-vip
[1].
的机器进行故障转移
---
apiVersion: v1
kind: ConfigMap
metadata:
name: kube-keepalived-vip-config
namespace: kube-system
data:
172.111.222.33: kube-system/traefik2-ingress-controller
因此我的 traefik 服务是默认类型的集群 IP 并引用 kube-keepalive-vip
服务提供的外部 IP:
---
apiVersion: v1
kind: Service
metadata:
name: traefik2-ingress-controller
namespace: kube-system
spec:
selector:
app: traefik2-ingress-controller
ports:
- protocol: TCP
name: web
port: 80
- protocol: TCP
name: webs
port: 443
externalIPs:
- 172.111.222.33
这是按原样工作的。现在我想限制我的一些应用程序只能从我网络中的特定子网访问。由于我的请求由 kube-keepalive-vip
和 kube-proxy
处理,因此我请求中的客户端 IP 不再是实际客户端之一。但据我得到的文档 kube-proxy
是在 X-Forwarded-For
header 中设置真实 ip。所以我的中间件看起来像这样:
internal-ip-whitelist:
ipWhiteList:
sourceRange:
- 10.0.0.0/8 # my subnet
- 60.120.180.240 # my public ip
ipStrategy:
depth: 2 # take second entry from X-Forwarded-For header
现在每个对这个中间件附加的入口的请求都被拒绝了。我检查了 Traefik 日志并看到,请求包含一些 X-Forwarded-*
headers,但是没有 X-Forwarded-For
:(
有没有人对此有任何经验并可以指出我的错误?我的 Kubernetes 设置可能有问题吗?还是我的 kube-keepalive-vip
配置中缺少某些内容?
提前致谢!
对于遇到这个问题的每个人,我同时设法解决了我的问题。
主要问题是kube-proxy
。默认情况下,所有服务都通过它进行路由。而且,根据您的 CNI 提供商(我使用 flannel
),您的调用客户端的信息会丢失。
K8s 通过将 .spec.externalTrafficPolicy
设置为 Local
(https://kubernetes.io/docs/concepts/services-networking/service/#aws-nlb-support) 提供了一种解决方法。但这不支持 ClusterIP
服务。
所以我通过使用 MetalLB (https://metallb.universe.tf/) 解决了这个问题,它为 裸机 集群提供负载平衡。在使用之前分配给 keepalived 容器的虚拟 IP 进行设置后,我配置了类型为 LoadBalancer
的 traefik 服务,并请求了我在 MetalLB 中拥有的一个 IP。
我的设置是一个裸机集群 运行 Kubernetes 1.17。我正在使用 Traefik 2(.3.2) 作为反向代理并为我使用 kube-keepalive-vip
[1].
---
apiVersion: v1
kind: ConfigMap
metadata:
name: kube-keepalived-vip-config
namespace: kube-system
data:
172.111.222.33: kube-system/traefik2-ingress-controller
因此我的 traefik 服务是默认类型的集群 IP 并引用 kube-keepalive-vip
服务提供的外部 IP:
---
apiVersion: v1
kind: Service
metadata:
name: traefik2-ingress-controller
namespace: kube-system
spec:
selector:
app: traefik2-ingress-controller
ports:
- protocol: TCP
name: web
port: 80
- protocol: TCP
name: webs
port: 443
externalIPs:
- 172.111.222.33
这是按原样工作的。现在我想限制我的一些应用程序只能从我网络中的特定子网访问。由于我的请求由 kube-keepalive-vip
和 kube-proxy
处理,因此我请求中的客户端 IP 不再是实际客户端之一。但据我得到的文档 kube-proxy
是在 X-Forwarded-For
header 中设置真实 ip。所以我的中间件看起来像这样:
internal-ip-whitelist:
ipWhiteList:
sourceRange:
- 10.0.0.0/8 # my subnet
- 60.120.180.240 # my public ip
ipStrategy:
depth: 2 # take second entry from X-Forwarded-For header
现在每个对这个中间件附加的入口的请求都被拒绝了。我检查了 Traefik 日志并看到,请求包含一些 X-Forwarded-*
headers,但是没有 X-Forwarded-For
:(
有没有人对此有任何经验并可以指出我的错误?我的 Kubernetes 设置可能有问题吗?还是我的 kube-keepalive-vip
配置中缺少某些内容?
提前致谢!
对于遇到这个问题的每个人,我同时设法解决了我的问题。
主要问题是kube-proxy
。默认情况下,所有服务都通过它进行路由。而且,根据您的 CNI 提供商(我使用 flannel
),您的调用客户端的信息会丢失。
K8s 通过将 .spec.externalTrafficPolicy
设置为 Local
(https://kubernetes.io/docs/concepts/services-networking/service/#aws-nlb-support) 提供了一种解决方法。但这不支持 ClusterIP
服务。
所以我通过使用 MetalLB (https://metallb.universe.tf/) 解决了这个问题,它为 裸机 集群提供负载平衡。在使用之前分配给 keepalived 容器的虚拟 IP 进行设置后,我配置了类型为 LoadBalancer
的 traefik 服务,并请求了我在 MetalLB 中拥有的一个 IP。