Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >Kubernetes + metallb + traefik:如何获得真正的客户端ip?

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

Stack Overflow用户
提问于 2018-05-29 05: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 02: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

复制
相关文章
Traefik 企业实战:部署生产级Traefik篇
Traefik 是一款开源的边缘路由器,它可以让发布服务变得轻松有趣。它代表您的系统接收请求,并找出负责处理这些请求的组件。与众不同之处在于,除了它的许多特性之外,它还可以自动为您的服务发现正确的配置。当 Traefik 检查您的基础设施时,它会发现相关信息,并发现哪个服务为哪个请求提供服务。Traefik 与每个主要的集群技术都是原生兼容的,比如 Kubernetes、Docker、Docker Swarm、AWS、Mesos、Marathon 等等;并且可以同时处理多个。(它甚至适用于运行在裸机上的遗留软件。) 使用 Traefik,不需要维护和同步单独的配置文件:所有事情都是实时自动发生的(没有重启,没有连接中断)。使用 Traefik,只需要花费时间开发和部署新功能到您的系统,而不是配置和维护其工作状态。项目地址:https://github.com/traefik/traefik官网文档:https://doc.traefik.io/traefik/
用户1107783
2023/09/11
1.4K0
Traefik 企业实战:部署生产级Traefik篇
Kubernetes的负载均衡方案:MetalLB
在Kubernetes部署完成服务后,我们经常需要将服务开放给到外部用户访问 。如果是使用云平台(阿里云、腾讯云、AWS等)的话,这个需求处理起来非常简单,可以通过云平台的LoadBalancer来实现。
西岸Alex
2022/10/31
6.8K0
Kubernetes的负载均衡方案:MetalLB
Kubernetes 私有集群负载均衡器终极解决方案 MetalLB
私有云裸金属架构(这是相对云上环境来说,不是说无操作系统)上部署的 Kubernetes 集群,通常是无法使用 LoadBalancer 类型的 Service 的。因为 Kubernetes 本身没有为裸机群集提供网络负载均衡器的实现。
iMike
2020/05/24
7.6K1
Kubernetes开源LoadBalancer—Metallb(BGP)
最近一年为了迎接亚运会,单位开发了很多大屏展示界面,这些大屏展示页面需要提供给外部门访问,起初使用Ingress方式,但是需要外部门配置DNS,所以我们准备使用NodePort,但是领导想用LoadBalancer,众所周知,LoadBalancer大部分情况下只能在提供了外部负载均衡器的云提供商上使用,而我们是裸机集群,没办法,我们只能找开源的LoadBalancer解决方案。
没有故事的陈师傅
2022/09/15
1.1K0
Kubernetes开源LoadBalancer—Metallb(BGP)
在 Kubernetes Pod 中如何获取客户端的真实 IP
这里选择 containous/whoami 作为后端服务镜像。在 Dockerhub 的介绍页面,可以看到访问其 80 端口时,会返回客户端的相关信息。在代码中,我们可以在 Http 头部中拿到这些信息。
CNCF
2021/03/15
4.8K0
在 Kubernetes Pod 中如何获取客户端的真实 IP
一文浅析 Kubernetes 入口网络体系
为了了解 Kubernetes 网络的不同方面,我们首先描述在 Pod 中创建服务一直到在公共云和私有云中访问该服务时会发生什么。同时,我们强调了对 Ingress 的需求以及它如何适应整个 Kubernetes 集群网络模型。
Luga Lee
2022/04/18
9951
一文浅析 Kubernetes 入口网络体系
Kubernetes 中数据包的生命周期 -- 第 4 部分
本文是 Kubernetes 中数据包的生命周期系列文章的第 4 部分,我们将会介绍 Kubernetes 中的 Ingress 资源对象和 Ingress Controller。Ingress Controller 是一个控制器,它监视 Kubernetes API Server 对 Ingress 资源的变更并相应地更新负载均衡器的配置。
Se7en258
2022/06/24
8450
Kubernetes 中数据包的生命周期 -- 第 4 部分
java如何获得本机IP
public String getLocalIp(){ InetAddress inetAddress=InetAddress.getLocalHost(); String ip=inetAddress.getHostAddress().toString();//获得本机Ip return ip; }
爱明依
2019/03/12
2K0
数据包在Kubernetes中的一生(四)- 完结
这是的数据包在Kubernetes中的一生系列的第四篇,如果你还没看过前几篇,那建议你阅读一下前几篇内容:
公众号: 云原生生态圈
2021/11/15
6800
数据包在Kubernetes中的一生(四)- 完结
[译]数据包在 Kubernetes 中的一生(4)
原文:Life of a Packet in Kubernetes — Part 4
CNCF
2021/07/07
6170
Kubernetes Traefik集成Pilot
基础环境:centos8+kubeadm1.20.5+cilium+hubble环境搭建,Kubernetes 1.20.5 安装traefik在腾讯云下的实践。当然了中间有一次事故。跳过了1.20.5升级1.21了。重新初始化了kubeadm搭建了v1.21.3的版本。偶然看到阳明大佬的文章:Traefik 发布控制面板 SaaS 服务 Pilot就想体验一下自定义的中间件!当然了自己现在还不会写这些插件。就先拿一个demo练练手吧!
对你无可奈何
2021/08/17
6740
Kubernetes 中 traefik ingress 的使用
简单的说,ingress就是从kubernetes集群外访问集群的入口,将用户的URL请求转发到不同的service上。Ingress相当于nginx、apache等负载均衡反向代理服务器,其中还包括规则定义,即URL的路由信息。
kubernetes中文社区
2019/06/24
1.7K0
Kubernetes 中 traefik ingress 的使用
Traefik 企业实战:路由规则篇
首先,当部署完后启动 Traefik 时,定义了入口点(端口号和对应的端口名称),然后 Kubernetes 集群外部就可以通过访问 Traefik 服务器地址和配置的入口点对 Traefik 服务进行访问,在访问时一般会带上 “域名” + “入口点端口”,然后 Traefik 会根据域名和入口点端口在 Traefik 路由规则表中进行匹配,如果匹配成功,则将流量发送到 Kubernetes 内部应用中与外界进行交互。这里面的域名与入口点与对应后台服务关联的规则,即是 Traefik 路由规则。Traefik 创建路由规则有多种方式:
用户1107783
2023/09/11
5020
Traefik 企业实战:路由规则篇
Traefik 2.0 Now GA! Traefik V2真正来了!
没错,Traefik V2已经GA了,代表着Traefik v2已经在生产环境使用。进入官网https://traefik.io/ ,可以看到醒目的Traefik 2.0 Now GA。
用户3013098
2022/05/31
5440
Traefik 2.0 Now GA! Traefik V2真正来了!
BGP 模式下 Calico 与 MetalLB 如何结合
最近我司业务扩展在机房新开了一个区域,折腾了一段时间的 Calico BGP,为了能将整个过程梳理得更简单明了,我还是决定将这个过程记录下来。不管是对当下的总结还是未来重新审视方案都是值得的。大家都知道,云原生下的网络架构在 Kubernetes 里可以算是百花齐放,各有所长,这无形中也导致网络始终是横在广大 K8S 爱好者面前迈向高阶管理的几座大山之一。通常大家在公有云上使用厂家提供的 CNI 组件可能还感受不到其复杂,但一旦要在 IDC 自建集群时,就会面临 Kubernetes 网络架构选型的问题。Calico 作为目前 Kubernetes 上用途最广的 Kubernetes CNI 之一,自然也有很多追随者。而本篇便是在自建机房内 BGP 组网下的一次总结。
云原生小白
2022/06/06
2K0
BGP 模式下 Calico 与 MetalLB 如何结合
Traefik - Kubernetes 配置TCP/HTTP服务
本文主要介绍 Kubernetes采用Traefik做ingress代理服务时,TCP服务和HTTP服务的最基础代理方式。
用户3013098
2022/06/01
2K0
kubernetes 安装Traefik Ingress Controller
首先,需要为Traefik创建一个专用的Kubernetes命名空间。可以使用kubectl create namespace命令创建命名空间,例如:
堕落飞鸟
2023/03/30
1.1K0
k8s loadbalancer与ingress实践
k8s可以通过三种方式将集群内服务暴露到外网,分别是NodePort、LoadBalancer、Ingress,其中NodePort作为基础通信形式我们在《k8s网络模型与集群通信》中进行了介绍,这里我们主要关注LoadBalancer和Ingress
你大哥
2022/01/10
1.7K0
k8s loadbalancer与ingress实践
Kubernetes 集群部署 Ingress Traefik
Traefik 是一个开源的可以使服务发布变得轻松有趣的边缘路由器。它负责接收你系统的请求,然后使用合适的组件来对这些请求进行处理。
高楼Zee
2021/12/15
2K0
Kubernetes 集群部署 Ingress Traefik
Kubernetes traefik tls证书到期替换
ssl证书都是一年签发的。到了六月份了一年一度的证书替换的日子到了.......。过去的方法一直都是先delete secret,然后继续创建一个新的。这次就突发奇想的,还有其他方法吗......百度了一下还真的搜索到了:
对你无可奈何
2021/06/21
5.1K5

相似问题

如何使用Traefik+MetalLB公开Kubernetes API (apiserver)

111

Kubernetes - traefik外部ip被挂起

10

Kubernetes traefik通过特定的内部IP

10

FastAPI (starlette)获得客户端真正的IP

1124

MetalLB在Kubernetes是如何工作的

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文