Kubernetes 带有Traefik和HAP的K8S无法在POD上获得真正的客户端IP
我有一个使用HAProxy的外部LB,以便拥有一个HA k8s群集。我的集群是Rancher的K3s,它在内部使用Traefik LB。 我目前面临一个问题,在我的pod中,我得到的是Traefik IP,而不是真正的客户端IP HAP配置: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
# 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到集群,集群在某个地方拒绝流量
有什么线索我在这里遗漏了什么吗
谢谢你有两个选择
这还要求要连接到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