Kubernetes 带有Traefik和HAP的K8S无法在POD上获得真正的客户端IP

Kubernetes 带有Traefik和HAP的K8S无法在POD上获得真正的客户端IP,kubernetes,haproxy,traefik,high-availability,k3s,Kubernetes,Haproxy,Traefik,High Availability,K3s,我有一个使用HAProxy的外部LB,以便拥有一个HA k8s群集。我的集群是Rancher的K3s,它在内部使用Traefik LB。 我目前面临一个问题,在我的pod中,我得到的是Traefik IP,而不是真正的客户端IP HAP配置: # Ansible managed defaults maxconn 1000 mode http log global option dontlognull log stdout local0 debug option

我有一个使用HAProxy的外部LB,以便拥有一个HA k8s群集。我的集群是Rancher的K3s,它在内部使用Traefik LB。 我目前面临一个问题,在我的pod中,我得到的是Traefik IP,而不是真正的客户端IP

HAP配置:

# Ansible managed

defaults
  maxconn 1000
  mode http
  log global
  option dontlognull    
  log stdout local0 debug
  option httplog
  timeout http-request 5s
  timeout connect 5000
  timeout client 2000000
  timeout server 2000000

frontend k8s
  bind *:6443
  bind *:80
  bind *:443
  mode tcp
  option tcplog

  use_backend masters-k8s
    
backend masters-k8s
  mode tcp
  balance roundrobin

  server master01 master01.k8s.int.ntw
  server master02 master02.k8s.int.ntw
  
# end Ansible managed
Traefik服务:

apiVersion: v1
kind: Service
metadata:
  annotations:
    meta.helm.sh/release-name: traefik
    meta.helm.sh/release-namespace: kube-system
    service.beta.kubernetes.io/do-loadbalancer-enable-proxy-protocol: "true"
  labels:
    app: traefik
    app.kubernetes.io/managed-by: Helm
    chart: traefik-1.81.0
    heritage: Helm
    release: traefik
spec:
  clusterIP: 10.43.250.142
  clusterIPs:
  - 10.43.250.142
  externalTrafficPolicy: Local
  ports:
  - name: http
    nodePort: 32232
    port: 80
    protocol: TCP
    targetPort: http
  - name: https
    nodePort: 30955
    port: 443
    protocol: TCP
    targetPort: https
  selector:
    app: traefik
    release: traefik
  sessionAffinity: None
  type: LoadBalancer
status:
  loadBalancer:
    ingress:
    - ip: 10.0.1.1
    - ip: 10.0.1.11
    - ip: 10.0.1.12
    - ip: 10.0.1.2
通过这种配置,我从未在POD上获得真正的IP,在一些研究中,我发现人们建议在HAP中使用send proxy,如下所示:

  server master01 master01.k8s.int.ntw check send-proxy-v2
  server master02 master02.k8s.int.ntw check send-proxy-v2
但当我这样做时,所有集群通信都返回ERR_CONNECTION_CLOSED。 如果我看对了,这意味着它从HAP到集群,集群在某个地方拒绝流量

有什么线索我在这里遗漏了什么吗


谢谢你有两个选择

  • 使用代理协议
  • 使用X-Forwarded-For标头
  • 选项1:代理协议

    此选项要求HAProxy和Traefik站点都使用代理协议,这就是人们推荐“send-proxy-v2”的原因。
    这还要求要连接到Traefik的所有其他客户端也必须使用代理协议,如果客户端不使用代理协议,则您将收到通信错误。
    当您在TCP模式下配置HAProxy时,这是将客户端ip发送到Traefik的唯一选项

    选项2:X-Forwarded-For

    我个人会使用此选项,因为它可以使用任何http(s)客户端连接到traefik。
    这需要在haproxy中使用HTTP模式和其他一些参数,如

    文件“/etc/haproxy/letsencryptoauthorityx3.pem”中是后端的CA,目录“/etc/ssl/haproxy/”中是前端的证书。
    请查看有关关键字的文档。
    您还必须配置traefik以允许来自haproxy的标头

    # Ansible managed
    
    defaults
      maxconn 1000
      mode http
      log global
      option dontlognull    
      log stdout local0 debug
      option httplog
      timeout http-request 5s
      timeout connect 5s
      timeout client 200s
      timeout server 200s
      # send client ip in the x-forwarded-for header
      option forwardfor
    
    frontend k8s
      bind *:6443 v4v6 alpn h2,http/1.1 ssl ca-file /etc/haproxy/letsencryptauthorityx3.pem crt /etc/ssl/haproxy/
      bind *:80   v4v6 alpn h2,http/1.1 ssl ca-file /etc/haproxy/letsencryptauthorityx3.pem crt /etc/ssl/haproxy/
      bind *:443  v4v6 alpn h2,http/1.1 ssl ca-file /etc/haproxy/letsencryptauthorityx3.pem crt /etc/ssl/haproxy/
    
      use_backend masters-k8s
    
    backend masters-k8s
    
      balance roundrobin
    
      server master01 master01.k8s.int.ntw check
      server master02 master02.k8s.int.ntw check
    
    # end Ansible managed