现在我正在尝试使用kubernetes托管简单的网站 . 我的应用程序有一个简单的php文件在前端和后端运行 . 我的前端php文件想要访问后端php文件,我正在创建一个ajax请求来做同样的事情 . 但是我无法弄清楚在我的ajax调用中需要指定什么base-url(对于kubernetes)才能访问后端 .
我目前的设置:
-
创建了两个容器映像,一个用于前端代码,另一个用于后端 .
-
将这些图像推送到我的gcr .
-
开始了Kubernetes集群 . 为前端RC和服务以及后端RC和服务设置yaml文件
-
通过运行kubectl命令,我们可以使用外部IP独立访问这两种服务 .
-
但我们的前端无法与后端服务进行通信 .
-
不确定我们是否需要一个DNS服务器?如果你认为我们需要它,如何设置它 .
后端服务yaml文件
apiVersion: v1
kind: Service
metadata:
`labels:
name: mytestapp-be
name: mytestapp-be-service
spec:
ports:
- port: 80
targetPort: 80
protocol: TCP
selector:
app: mytestapp-be
tier: backend
我用上面的文件创建了一个服务 . 我的前端应用程序代码有一个ajax代码段,它带有一个url,用于使用服务名称和端口名称访问后端文件 .
url: "http://mytestapp-be-service:80",
2 回答
通常,在一个完全配置的kubernetes集群上,你应该让dns开箱即用 . 如果您在同一名称空间中前后部署,则您的pod应该只能通过服务名称进行通信 . 您可能在这里遇到的问题是,当您在浏览器上打开页面并尝试从其发出请求时,只需指向您的后端服务,您就会尝试发出不在kubernetes集群内的请求 from the browser ,并且可以没有通过in-kubernetes网络到达其他 beans 荚 .
如果是这种情况,您需要公开前端和后端,因此浏览器都可以访问它们(实际上有几种方法可以实现,从nodePort服务开始,通过LB服务到Ingress .
如果你在这里发布你的yamls,将更容易找出你的问题 . 但这里有一些一般信息:
内部服务发现的便利性是kubernetes的优势之一 . 对于从容器内部到k8s中的另一个服务的通信,您可以使用内置的DNS或环境变量 . DNS的工作方式如下:服务名称可用,并解析为服务的集群IP . 因此,如果您的服务名称是
backendservice
,您应该能够在群集内通过该名称访问其群集IP(如果您选择了一个,则在指定的命名空间下,例如backendservice.my-namespace
) . 服务端口应转发到作为服务一部分的pod的已定义目标端口 . 例如:将您的前端指向
http://backendservice:80
即可使用该服务有关更多信息,请阅读this和this .
要解决问题,请运行
kubectl get svc
并仔细检查所有服务是否已分配了clusterIP . 如果您未在服务yaml中指定clusterIP: None
,则应该是这种情况 .