我正在努力学习Kubernetes,目前我正在尝试部署我开发的测试应用程序。
我有3个集装箱,每个集装箱都在各自的吊舱上运行。
对于前端容器,我配置了一个运行良好的外部服务(LoadBalancer)。我可以从我的浏览器访问应用程序,没有任何问题。
对于后端API和MongoDB,我为每个用户配置了一个内部服务。后端API和MongoDB之间的通信工作正常。我遇到的问题是如何与后端API进行前端通信。
我在Nuxtjs中使用Axios组件,并在nuxtjs.config.js文件中将Axios设置为http://service-name:portnumber/。但这不起作用,我猜是因为url是从客户机(浏览器)端调用的,而不是从服务器调用的。如果我将后端API的服务类型更改为LoadBalancer,并配置一个IP地址和端口号,并将其用作我的axios,那么它就能工作了。然而,我希望将后端API服务保持在内部。是否可以从服务器端而不是客户端调用Axios基URL。
如有任何帮助/指导,将不胜感激。
这是我的前端YML文件
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: mhov-ipp
name: mhov-ipp
namespace: mhov
spec:
replicas: 1
selector:
matchLabels:
app: mhov-ipp
template:
metadata:
labels:
app: mhov-ipp
spec:
containers:
- image: mhov-ipp:1.1
name: mhov-ipp
ports:
- containerPort: 8080
env:
- name: NODE_ENV
value: "development"
- name: PORT
value: "8080"
- name: TITLE
value: "MHOV - IPP - K8s"
- name: API_URL
value: "http://mhov-api-service:4000/"
---
apiVersion: v1
kind: Service
metadata:
name: mhov-ipp-service
spec:
selector:
app: mhov-ipp
type: LoadBalancer
ports:
- protocol: TCP
port: 8082
targetPort: 8080
nodePort: 30600
这是后端的YML文件
apiVersion: apps/v1
kind: Deployment
metadata:
name: mhov-api-depl
labels:
app: mhov-api
spec:
replicas: 1
selector:
matchLabels:
app: mhov-api
template:
metadata:
labels:
app: mhov-api
spec:
containers:
- name: mhov-api
image: mhov-api:1.0
ports:
- containerPort: 4000
env:
- name: mongoURI
valueFrom:
configMapKeyRef:
name: mhov-configmap
key: database_url
---
apiVersion: v1
kind: Service
metadata:
name: mhov-api-service
spec:
selector:
app: mhov-api
ports:
- protocol: TCP
port: 4000
targetPort: 4000
发布于 2021-07-29 08:34:38
什么是入口以及如何安装它
你的猜测是正确的。前端运行在浏览器中,浏览器“不知道”后端在哪里,以及如何触及它。你在这里有两个选择:
ingress
这将推动您的前进,并将需要更改您的应用程序的一些配置,如URL,因为应用程序将暴露在“互联网”(不完全,但您可以使用云)。
什么是ingress
?
Ingress是api对象,它将HTTP和HTTPS路由从集群外部公开到集群内的服务。流量路由由入侵资源上定义的规则控制。
最常见的选项是nginx ingress
--他们的页面NGINX进位控制器。
安装取决于集群类型,但是我建议使用helm
。(如果您不熟悉helm
,它是一个使用图表安装和安装应用程序的模板引擎。已经创建了相当多的图表,例如进气口-。
例如,如果您使用的是minikube
,那么它已经内置了nginx-ingress
,并且可以作为附件启用。
如何使用入口公开服务
一旦你有了工作入口,它就是为它创建规则的类型。
你需要的是有入口,这将能够沟通与前端和后端以及。
摘自kubernetes官方文件的例子:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: simple-fanout-example
spec:
rules:
- host: foo.bar.com
http:
paths:
- path: /foo
pathType: Prefix
backend:
service:
name: service1
port:
number: 4200
- path: /bar
pathType: Prefix
backend:
service:
name: service2
port:
number: 8080
在本例中,在不同的paths
上,foo.bar.com
主机名中有两个不同的服务可用,这两个服务都在集群中。不需要将它们公开到集群之外,因为通信将通过ingress
定向。
实际解决方案(如何接近)
这是非常相似的配置。被修复并开始按预期工作。这是我的答案,可以安全地分享:)
正如您所看到的,OP在前端是可访问的时候也面临着同样的问题,而后端则不是。
请随意使用该答案/存储库中的任何内容。
有用的链接:
https://stackoverflow.com/questions/68567115
复制相似问题