首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Kubernetes + metallb + traefik:如何获得真正的客户端ip?

Kubernetes + metallb + traefik:如何获得真正的客户端ip?
EN

Stack Overflow用户
提问于 2018-05-29 13:27:32
回答 1查看 10.6K关注 0票数 6

traefik.toml

代码语言:javascript
代码运行次数:0
运行
复制
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]

traefik服务

代码语言:javascript
代码运行次数:0
运行
复制
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

代码语言:javascript
代码运行次数:0
运行
复制
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

为集群创建入口:

代码语言:javascript
代码运行次数:0
运行
复制
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

clusterip.staging ip: 192.168.0.69

来自ip: 192.168.0.100:的其他pc机

代码语言:javascript
代码运行次数:0
运行
复制
wget -qO - clusterip.staging

并获得结果:

代码语言:javascript
代码运行次数:0
运行
复制
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-

kubectl获得svc -全名称空间

代码语言:javascript
代码运行次数:0
运行
复制
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

如何在我的安装中获得真正的ip (192.168.0.100)?为什么x-Real-IP10.5.64.0?我在文档中找不到答案.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-30 10:03:26

kube-proxy使用iptables模式时,它使用NAT将数据发送到有效负载工作的节点,在这种情况下,您将丢失原始SourceIP地址。

正如我所理解的,您在Matallb入侵服务后面使用了Traefik (因为它的类型是LoadBalancer)。这意味着从客户端到后端的流量是这样的:

Client -> Metallb -> Traefik LB -> Traefik Service -> Backend pod

Traefik工作正常,并添加了头部x-*,包括包含假地址的x-forwarded-forx-real-ip,这就是为什么:

来自Metallb 文档

MetalLB理解服务的externalTrafficPolicy选项,并根据您选择的策略和公告协议实现不同的公告模式。

  • Layer2 此策略的结果是在服务中的所有吊舱之间实现统一的流量分布。然而,当kube-proxy进行负载平衡时,会模糊连接的源IP地址,因此您的pod日志将显示外部流量似乎来自集群的领先节点。
  • BGP

使用默认群集流量策略的

代码语言:javascript
代码运行次数:0
运行
复制
- **“Cluster” traffic policy**

,集群中的每个节点都将为服务IP吸引流量。在每个节点上,业务受到第二层负载平衡(由kube提供),该层将业务定向到单个吊舱。

.

“集群”策略的另一个缺点是,当kube-proxy进行负载平衡时,会模糊连接的源IP地址,因此您的结束符日志将显示外部通信似乎来自集群的节点。

-“本地”交通政策

使用本地流量策略,节点只有在本地运行一个或多个服务荚时才会吸引流量。BGP路由器将只在当前承载该服务的节点之间负载平衡传入的通信量。在每个节点上,仅由kube代理将业务转发到本地的豆荚,节点之间没有“水平”的业务流。

此策略为您的服务提供了最有效的流量。此外,由于kube-proxy不需要在集群节点之间发送通信量,所以您的可以看到传入连接的真正源IP地址

最后,获得真实源IP地址的唯一途径是使用TrafficPolicy的“本地”模式。

如果你设置了它,你就会得到你想要的。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50585616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档