Kubernetes 无法使用xmlhttprequest对象从另一个pod访问服务

Kubernetes 无法使用xmlhttprequest对象从另一个pod访问服务,kubernetes,kubernetes-service,Kubernetes,Kubernetes Service,因此,我编写了一个API,它正在路径/API/v1/books上侦听,并作为部署部署部署在我的k8s集群上,创建了服务(restapi service),以便我们可以从另一个pod调用它。 现在我创建了另一个部署(restapi-ui-deployment),它只有一个.html页面,并部署在nginx上,最终调用我们之前创建的服务以获得响应。 现在的问题是,当我执行到restapi ui部署的pod中时,我能够成功地卷曲http://restapi-service:8081/api/v1/bo

因此,我编写了一个API,它正在路径
/API/v1/books
上侦听,并作为部署部署部署在我的k8s集群上,创建了服务(
restapi service
),以便我们可以从另一个pod调用它。 现在我创建了另一个部署(
restapi-ui-deployment
),它只有一个
.html
页面,并部署在nginx上,最终调用我们之前创建的服务以获得响应。 现在的问题是,当我执行到
restapi ui部署的pod中时,我能够成功地卷曲
http://restapi-service:8081/api/v1/books
。但如果我们试图从部署的.html页面执行相同的操作,我会得到

GET http://restapi-service:8081/api/v1/books net::ERR_NAME_NOT_RESOLVED
下面是作为
restapi ui部署部署的代码

if (xmlObj != null){
      xmlObj.open("GET", "http://restapi-service:8081/api/v1/books", true)
      xmlObj.onreadystatechange = processResponse;
      xmlObj.send(null)
    }
    else{
      console.log("There was an error getting the object.")
    }
    function processResponse(){
      if (xmlObj.status == 200 && xmlObj.readyState == 4){
        console.log("Got the response successfully")
        response = xmlObj.responseText
      }
      else{
        console.log("There was an issue getting the response.")
      }
    }


恐怕您对应用程序的工作方式感到困惑。XmlHttpRequest源于webbrowser,因此在kubernetes集群之外,而不是集群内的nginx。(nginx提供html页面) kubernetes dns在kubernetes之外不可用,从外部连接到ClusterIP也不起作用。
解决方案:创建一个合适的入口,并从前端调用该入口,或者在交付前端的nginx上提供一个代理。(这将导致真正获得作为您的nginx的请求来源)

您是否正确定义了
restapi服务。还有
kubectl get svc
的输出是否正确创建。@mchawre,如果我能够从另一个pod中卷曲该服务,则表示该服务定义正确且可访问。是的,但这取决于卷曲的方式
net::ERR\u NAME\u NOT\u RESOLVED
表示服务名称解析有问题。请尝试从另一个pod中
nslookup restapi service.namespace.svc
。@mchawre nslookup似乎正在工作``nslookup restapi-service.webapp.svc服务器:10.96.0.10地址:10.96.0.10#53名称:restapi-service.webapp.svc.cluster.local地址:10.107.244.184``所以我同意你关于ingress解决方案的意见,这对我来说很好。我在想,如果我能够从一个pod中卷曲到一个服务,并且nginx部署在同一个pod上,那么我也应该能够使用
xmlhttprequest
查询该服务。好的,所以发出的请求不是来自该pod中的nginx,请求是从浏览器发出的,我认为您所说的,然后是的,我想这解决了我的困惑。让我写一些正在nginx中运行的服务器端,然后我也可以这样做,对吗?如果你在pod中运行浏览器,它会工作,因为这样内部集群dns就会工作。如果不是在pod中而是在本地计算机上运行curl,那么它实际上与浏览器中的xmlhttp请求相同