前端和后端之间的Kubernetes通信
为了当地的发展,我有一个工作的minikube。在那里,我们部署了不同的服务。现在我想连接前端和后端 前端是一个有角度的应用程序,它提供自己的服务。 后端是node.js应用程序,也使用单独的服务,并使用DNS连接到其他内部服务,如mongodb 现在我想从前端与后端进行通信。DNS不工作,因为前端不知道如何解析命名路由。问题是告诉前端应该使用哪个后端URL和端口向其发送请求 当我第一次启动类型为NodePort的后端服务并将url和端口复制到前端目标url时,就接近了唯一的工作状态。我觉得这对我很不干净。是否有其他方法将后端请求的url获取到前端 我知道,当我们使用type=“LoadBalancer”在生产系统上部署服务时,该服务是由外部IP公开的,我可以从那里访问该服务。在pod更新时,外部IP将是永久的,等等。我还看到的问题是,后端IP需要通过额外的提交注入docker容器 编辑(1):后端服务前端和后端之间的Kubernetes通信,kubernetes,Kubernetes,为了当地的发展,我有一个工作的minikube。在那里,我们部署了不同的服务。现在我想连接前端和后端 前端是一个有角度的应用程序,它提供自己的服务。 后端是node.js应用程序,也使用单独的服务,并使用DNS连接到其他内部服务,如mongodb 现在我想从前端与后端进行通信。DNS不工作,因为前端不知道如何解析命名路由。问题是告诉前端应该使用哪个后端URL和端口向其发送请求 当我第一次启动类型为NodePort的后端服务并将url和端口复制到前端目标url时,就接近了唯一的工作状态。我觉得这对
apiVersion: v1
kind: Service
metadata:
name: backend
labels:
app: some-app
tier: backend
spec:
type: NodePort
ports:
- port: 3000
selector:
app: some-app
tier: backend
编辑(2):当我从具有fqn的客户端请求时,也会得到此响应:
OPTIONS http://backend.default.svc.cluster.local:3000/signup/ net::ERR_NAME_NOT_RESOLVED
我建议使用Kubernetes自己的方式,通过Ingress/IngressController灵活地摄入tarffic。在集群中部署了入口控制器之后,您可以轻松创建入口定义,告诉控制器在特定URL下公开服务。然后,您需要做的就是将DNS中的名称指向入口控制器loadbalancer(在大多数云设置中,将CNAME指向LB fqdn)
首先,我将尝试回答您的具体问题 当我第一次启动后端时,唯一的工作状态已经接近 类型为NodePort的服务,并将url和端口复制到 前端目标URL。我觉得这对我很不干净。有 另一种将后端请求的url获取到 前端 这里有两个选项1)如您所说,使用type=“LoadBalancer”。或者2)通过前端服务器代理所有后端调用 我知道在生产系统上部署服务时 type=“LoadBalancer”表示服务由外部IP公开,并且 我可以从那里访问服务。而外部IP 在pod更新时将是永久性的,等等。我也看到的问题是 后端IP需要通过以下方式注入docker容器: 额外的提交
只是好奇-什么服务于您的前端(哪种服务器技术将index.html交付给用户的浏览器)?是像nginx或apachehttpd这样的静态服务器,还是您在这里使用nodejs?我们使用了一种不同于随机dude(这是一个不错的解决方案)的方法:我们让后端服务器为前端文件服务。我们已经为这两个单独的docker图像,但只使用一个pod。前端作为init容器运行,并将文件复制到emptydir卷。后端还装载该卷并在
/
上提供服务(所有后端资源都在其他路径上提供)。这样,前端和后端服务于同一主机
您可以使用window.location.protocol+'/'+window.location.host
在Angular代码中获取当前主机(现在也是后端主机)
在本地开发人员机器上进行开发期间,我们在其各自独立的服务器上运行前端和后端。因此,我们有一个小助手函数,用于在所有情况下获取正确的后端url:
public getBackendUrl(): string {
return this.getBackendUrlInternal(window.location.protocol, window.location.host);
}
private getBackendUrlInternal(protocol: string, host: string): string {
if (host === 'localhost:3000') {
// running in local dev server, connect to local dev backend
return 'http://localhost:8585';
} else {
// running in docker compose or on k8s, backend is on same host and port as we are
return protocol + '//' + host;
}
}
(有两种方法,因为我们对第二种方法进行了一些测试)这就是我如何配置Ingress以使用服务名称将前端应用程序连接到后端的方法 Bankend
apiVersion: v1
kind: Service
metadata:
name: student-app-api
spec:
selector:
app: student-app-api
ports:
- port: 8080
protocol: TCP
targetPort: 8080
const get = id => {
return http.get(`api/students/`);
};
apiVersion: networking.k8s.io/v1beta1 # for versions before 1.14 use extensions/v1beta1
kind: Ingress
metadata:
name: student-app-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
rules:
- http:
paths:
- path: /?(.*)
backend:
serviceName: student-app-client-service
servicePort: 80
- path: /api/?(.*) //Redirect all request to backend (backend service name)
backend:
serviceName: student-app-api
servicePort: 8080