当前位置: 首页 > 知识库问答 >
问题:

如何使用kubernetes服务从Google网络负载均衡器获取客户端IP

翟鸿振
2023-03-14

我在GKE中创建了一个类型为LoadBalancer的kubernetes服务。

apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  type: LoadBalancer
  ports:
  - name: http
    port: 80
    targetPort: http
  selector:
    app: nginx

这是一个nginx服务,尝试获取源html" target="_blank">客户端IP。喜欢

        location / {
            echo $remote_addr;
            echo $http_x_forwarded_for;   
        }

但结果将是:

10.140.0.97

$remote_addr就像在kubernetes IP中一样。

$http_x_forwarded_for为空。

我不知道为什么这和文件上说的不一样。

https://cloud.google.com/load-balancing/docs/network

网络负载平衡是一种直通负载均衡器,这意味着您的防火墙规则必须允许来自客户端源IP地址的流量。

https://cloud.google.com/kubernetes-engine/docs/concepts/network-overview#ext-lb

如果您的服务需要从集群外部和专有网络外部访问,您可以在定义服务时将服务的类型字段设置为LoadBalancer,将服务配置为LoadBalancer。然后,GKE在服务前面提供一个网络负载平衡器。网络负载平衡器了解群集中的所有节点,并配置专有网络的防火墙规则,以允许使用服务的外部IP地址从专有网络外部连接到服务。您可以为服务分配静态外部IP地址。有关详细信息,请访问使用静态IP地址配置域名。

共有2个答案

耿珂
2023-03-14

因为网络负载均衡器处理所有传入流量并重定向到您的GKE集群。在k8s集群中,一切都在虚拟IP网络下运行,因此您会得到10.140.0.97

第一个文档说,您需要设置防火墙以接受来自客户端源IP的流量,否则GCP默认情况下,您将无法获得任何传入流量。但第二份文件表明,GKE将自动为您设置。你所需要做的就是找出你的外部IP并尝试一下。您应该能够看到您的nginx欢迎页面。

附言:默认外部IP是动态的,如果您想要静态IP,您可以通过控制台或gcloud CLI获得一个。

胡弘毅
2023-03-14

只需添加外部流量策略:本地

spec:
  externalTrafficPolicy: Local
  type: LoadBalancer

默认情况下,使用Type=LoadBalancer发送到Services的数据包是源NAT'd,因为处于就绪状态的所有可调度库伯内特斯节点都有资格获得负载平衡流量。因此,如果数据包到达没有endpoint的节点,系统会将其代理到具有endpoint的节点,用节点的IP替换数据包上的源IP(如上一节所述)。

  • https://kubernetes.io/docs/tutorials/services/source-ip/#source-ip-for-services-with-typeloadbalancer
  • https://github.com/kubernetes/kubernetes/issues/10921
 类似资料:
  • 我一直在尝试使用Zuul和Eureka连接微服务,除了通过基于ServiceID的Zuul重新路由之外,大部分都成功了。我拥有的是Spring Boot Zuul和Eureka应用程序,以及一个在Eureka注册的基于节点的微服务。Zuul和微服务都在Eureka注册,并显示在Eureka控制面板上,但是,当我试图通过Zuul路由到微服务时,我会遇到以下异常: 通过IP路由似乎有效,但我不需要它。

  • 我计划在谷歌云平台上为1700多个域(不同的网站)设置HTTP/HTTPS负载平衡(https://cloud.google.com/compute/docs/load-balancing/http/);所有人都将拥有TLS/SSL。但是,每个负载均衡器最多只能添加10个SSL证书,如下所示:https://cloud.google.com/compute/docs/load-balancing/

  • 试图自学如何使用库伯内特斯,但有一些问题。 我的下一步是尝试使用LoadBalancer类型的服务来访问nginx。 我建立了一个新的集群并部署了nginx映像。 然后,我为LoadBalancer设置服务 设置完成后,我尝试使用LoadBalancer入口(我在描述LoadBalancer服务时发现)访问nginx。我收到一个此页面无法工作的错误。 不太确定我哪里出错了。 kubectl获得sv

  • 当我试图通过Zuul网关访问服务时,Zuul无法将请求转发到相应的服务。以下是我面临的错误: nettflix.zuul.exception.ZuulExc0019:转发错误 导致:com.netflix.client.ClientExc0019:负载均衡器没有可用的服务器为客户端:会议 让我分享一下这个应用程序。yml服务,尤里卡和祖尔网关。 EurekaClient: Zulgateway:

  • lvs Linux Virtual Server (lvs) 是Linux内核自带的负载均衡器,也是目前性能最好的软件负载均衡器之一。lvs包括ipvs内核模块和ipvsadm用户空间命令行工具两部分。 在lvs中,节点分为Director Server和Real Server两个角色,其中Director Server是负载均衡器所在节点,而Real Server则是后端服务节点。当用户的请求到

  • 我试图获得一个简单的微服务注册到尤里卡服务器,然后有Zuul代理到微服务。我得到了微服务注册到尤里卡服务器。然而,每当我打开Zuul服务时,我看到它没有注册到Eureka服务器。每当我试图路由到微服务时,我会得到以下异常: 负载均衡器没有可用于客户端的服务器:微服务 微服务组件 microserviceapplication.java bootstrap.yml eureKaserverAppli