在带有 ClusterIP 服务和 kube-keepalive-vip 的裸机 Kubernetes 上没有使用 Traefik 2 的 X-Forwarded-For

Posted

技术标签:

【中文标题】在带有 ClusterIP 服务和 kube-keepalive-vip 的裸机 Kubernetes 上没有使用 Traefik 2 的 X-Forwarded-For【英文标题】:no X-Forwarded-For with Traefik 2 on bare metal Kubernetes with ClusterIP Service and kube-keepalive-vip 【发布时间】:2021-02-10 01:25:11 【问题描述】:

我的设置是一个运行 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-vipkube-proxy 处理,因此我的请求中的客户端IP 不再是实际客户端之一。但就我得到的文档而言,kube-proxyX-Forwarded-For 标头中设置了真实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-* 标头,但没有 X-Forwarded-For :(

有没有人有这方面的经验,可以指出我的错误?我的 Kubernetes 设置可能有问题吗?或者我的kube-keepalive-vip 配置中缺少什么?

提前致谢!

[1]https://github.com/aledbf/kube-keepalived-vip

【问题讨论】:

【参考方案1】:

对于遇到此问题的每个人,我同时设法解决了我的问题。

主要问题是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/) 解决了这个问题,它为 bare metal 集群提供负载平衡。在使用之前分配给 keepalived 容器的虚拟 IP 进行设置后,我将 traefik 服务配置为 LoadBalancer 类型并请求我在 MetalLB 中拥有的一个 IP。

【讨论】:

以上是关于在带有 ClusterIP 服务和 kube-keepalive-vip 的裸机 Kubernetes 上没有使用 Traefik 2 的 X-Forwarded-For的主要内容,如果未能解决你的问题,请参考以下文章

Kubernetes进阶之路(九)Service系列之ClusterIP&NodePort

K8S中如何跨namespace 访问服务?为什么ping不通ClusterIP?

[CKA备考实验][Service] 3.1 创建ClusterIP和NodePort类型的Service

[CKA备考实验][Service] 3.1 创建ClusterIP和NodePort类型的Service

容器服务 TKE 上服务暴露的几种方式

k8s 使用 traefik 将clusterIP的 svc 暴露服务的方法