Kubernetes+metallb+traefik:如何获得真正的客户端ip?
traefik.toml: traefik服务: 然后: 群集ip:192.168.0.69 来自ip为192.168.0.100的其他pc: 并获得以下结果: kubectl get svc-所有名称空间 如何在我的安装中获得真正的ip 192.168.0.100?为什么是x-real-ip 10.5.64.0?我在文档中找不到答案。当kube代理使用iptables模式时,它使用NAT将数据发送到负载工作的节点,在这种情况下,您将丢失原始的SourceIP地址 据我所知,您在Traefik入口服务后面使用Matallb,因为它的类型是LoadBalancer。这意味着从客户端到后端的流量是这样的: 客户端->Metallb->Traefik LB->Traefik服务->后端pod Traefik工作正常,添加了x-*头,包括x-forwarded-for和x-real-ip,其中包含假地址,这就是为什么: 从Metallb: MetalLB了解服务的externalTrafficPolicy选项,并根据您选择的策略和公告协议实施不同的公告模式 第二层 此策略可在服务中的所有POD上实现统一的流量分布。但是,kube proxy在进行负载平衡时会隐藏连接的源IP地址,因此pod日志将显示外部流量似乎来自集群的leader节点 BGP “群集”流量策略 使用默认集群流量策略,集群中的每个节点都将吸引服务IP的流量。在每个节点上,流量受到kube代理提供的第二层负载平衡的影响,该层将流量定向到各个POD “群集”策略的另一个缺点是,kube proxy在进行负载平衡时会掩盖连接的源IP地址,因此pod日志将显示外部流量似乎来自群集的节点 “本地”交通政策 使用本地流量策略,节点只有在本地运行一个或多个服务吊舱时才会吸引流量。BGP路由器将仅在当前承载服务的节点之间对传入流量进行负载平衡。在每个节点上,流量仅通过kube代理转发到本地POD,节点之间没有“水平”流量 此策略为您的服务提供最有效的流量。此外,因为kube代理不需要在集群节点之间发送流量,所以您的POD可以看到传入连接的真实源IP地址 最后,获得真实源IP地址的唯一方法是使用本地模式的流量策略Kubernetes+metallb+traefik:如何获得真正的客户端ip?,kubernetes,traefik,Kubernetes,Traefik,traefik.toml: traefik服务: 然后: 群集ip:192.168.0.69 来自ip为192.168.0.100的其他pc: 并获得以下结果: kubectl get svc-所有名称空间 如何在我的安装中获得真正的ip 192.168.0.100?为什么是x-real-ip 10.5.64.0?我在文档中找不到答案。当kube代理使用iptables模式时,它使用NAT将数据发送到负载工作的节点,在这种情况下,您将丢失原始的SourceIP地址 据我所知,您在Traefik入
如果您设置了它,您将得到您想要的。非常感谢。我还在metallb的文档中找到了。我第一次在阅读时错过了它:有一个k8s文档关于这一点:k8s文档中提到的这一潜在不利因素的含义是什么:Local保留了客户端源IP,避免了LoadBalancer和NodePort类型服务的第二跳,但存在潜在的不平衡流量传播的风险。?只有运行服务的节点才能获得流量,这听起来不错。那么什么是不平衡呢?
defaultEntryPoints = ["http", "https"]
[entryPoints]
[entryPoints.http]
address = ":80"
[entryPoints.http.forwardedHeaders]
trustedIPs = ["0.0.0.0/0"]
[entryPoints.http.redirect]
entryPoint = "https"
[entryPoints.https]
address = ":443"
[entryPoints.https.tls]
[entryPoints.https.forwardedHeaders]
trustedIPs = ["0.0.0.0/0"]
[api]
kind: Service
apiVersion: v1
metadata:
name: traefik-ingress-service
namespace: kube-system
spec:
selector:
k8s-app: traefik-ingress-lb
ports:
- protocol: TCP
port: 80
name: http
- protocol: TCP
port: 443
name: https
type: LoadBalancer
kubectl run source-ip-app --image=k8s.gcr.io/echoserver:1.4
deployment "source-ip-app" created
kubectl expose deployment source-ip-app --name=clusterip --port=80 --target-port=8080
service "clusterip" exposed
kubectl get svc clusterip
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
clusterip ClusterIP 10.5.55.102 <none> 80/TCP 2h
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: clusterip-ingress
namespace: default
annotations:
kubernetes.io/ingress.class: traefik
spec:
rules:
- host: clusterip.staging
http:
paths:
- backend:
serviceName: clusterip
servicePort: 80
wget -qO - clusterip.staging
CLIENT VALUES:
client_address=10.5.65.74
command=GET
real path=/
query=nil
request_version=1.1
request_uri=http://clusterip.staging:8080/
SERVER VALUES:
server_version=nginx: 1.10.0 - lua: 10001
HEADERS RECEIVED:
accept=text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
accept-encoding=gzip, deflate, br
accept-language=ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
cache-control=max-age=0
host=clusterip.staging
upgrade-insecure-requests=1
x-forwarded-for=10.5.64.0
x-forwarded-host=clusterip.staging
x-forwarded-port=443
x-forwarded-proto=https
x-forwarded-server=traefik-ingress-controller-755cc56458-t8q9k
x-real-ip=10.5.64.0
BODY:
-no body in request-
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default clusterip NodePort 10.5.55.102 <none> 80:31169/TCP 19h
default kubernetes ClusterIP 10.5.0.1 <none> 443/TCP 22d
kube-system kube-dns ClusterIP 10.5.0.3 <none> 53/UDP,53/TCP 22d
kube-system kubernetes-dashboard ClusterIP 10.5.5.51 <none> 443/TCP 22d
kube-system traefik-ingress-service LoadBalancer 10.5.2.37 192.168.0.69 80:32745/TCP,443:30219/TCP 1d
kube-system traefik-web-ui NodePort 10.5.60.5 <none> 80:30487/TCP 7d