我正在部署一个简单的Web应用程序。我将其分为3个Pod:前端,后端和postgres数据库。每个都有服务。我为前端和后端分别创建了LoadBalancer服务。我的postgres db pod的ClusterIP服务。我的前端是html / javascript / angularjs / jquery。后端是基于Jersey的Java Web服务。后端和postgres之间的连接运行良好,因为我是通过浏览器对其进行测试的。请看下面。但是当我尝试从前端访问相同的登录Web服务调用时,它不起作用。请参阅下文。我的后端和前端日志中没有错误消息。在我的本地计算机(Eclispe Jee + Tomcat)中,由于前端和后端位于同一台Tomcat服务器上,所以一切正常。所以我的问题是我可以从Google kubernetes的另一个负载均衡服务中调用LoadBalancer服务吗?在我的前端后端Pod上抛出了某些错误,但是它突然弹出,而不是在我的Web服务调用之后。在这里,我放置了部署信息postgres pod。后端和前端部署与此非常相似,只添加了LoadBalancer作为类型。 How to access postgresql pod/service in google kubernetes
//The following call on browser to my web service works.
http://23.34.23.34:8080/LocWebService/rest/authorize/admin1
//The following call from my front end does not work on google kubernetes
$http.get("http://23.34.23.34:8080/LocWebService/rest/
authorize/"+$scope.Name)
//The following spontaneous error is thrown on my front end and back end
pods.
[http-nio-8080-exec-3] org.apache.coyote.http11.Http11Processor.service
Error parsing HTTP request header
Note: further occurrences of HTTP request parsing errors will be logged
at DEBUG level.
java.lang.IllegalArgumentException: Invalid character found in method
name. HTTP method names must be token
答案 0 :(得分:0)
从技术上讲,您的前端Pod应该能够调用后端Pod的外部IP,并且应该能够到达它们。但是,更好的选择是让前端Pod使用服务的ClusterIP调用后端Pod(与后端调用DB的方式相同)。如果您希望后端直接公开,您仍然可以将服务类型保留为LoadBalancer。
关于您的特定情况为何不起作用的原因,我们将需要更多日志或错误消息以查看数据包发生了什么情况。
理论上,应该发生的是:
Pod => LB外部IP =>到达节点IP表=>转发到后端Pod
现在,数据包实际上将不会越过本地节点的iptables,它将立即被DNATed并转发到正确的后端Pod。 我以前见过的一个可能的问题是,后端Pod期望来自外部源的流量,并且由于流量实际上没有达到外部LB IP,因此未使用外部IP作为源,因此应用程序不会使用它