Kubernetes 内部服务 Axios NuxtJS
Kubernetes Internal Service Axios NuxtJS
我正在努力学习 Kubernetes,目前我正在尝试部署我制作的测试应用程序。
我有 3 个容器,每个容器 运行 在自己的容器中
- 前端应用程序(使用 Nuxtjs)
- 后端API (Nodejs)
- MongoDB
对于前端容器,我配置了一个运行良好的外部服务 (LoadBalancer)。我可以从我的浏览器访问该应用程序,没有任何问题。
对于后端 API 和 MongoDB 我为每个配置了一个内部服务。后端 API 和 MongoDB 之间的通信正常。我遇到的问题是前端与后端的通信 API.
我在 Nuxtjs 中使用 Axios 组件,在 nuxtjs.config.js 文件中我将 Axios Base URL 设置为 http://service-name:portnumber/。但这不起作用,我猜是因为 url 是从客户端(浏览器)端调用的,而不是从服务器端调用的。如果我将后端 API 的服务类型更改为 LoadBalancer 并配置 IP 地址和端口号,并将其用作我的 axios URL 那么它就可以工作了。然而,我有点希望将 BackEnd-API 服务保留在内部。是否可以从服务器端而不是客户端调用 Axios 基础 URL。
任何 help/guidance 将不胜感激。
这是我的前端 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
什么是 ingress 以及如何安装它
你猜对了。前端在浏览器中 运行,浏览器“不知道”后端在哪里以及如何访问它。您在这里有两个选择:
- 就像您在集群外部公开后端所做的那样
- 使用高级解决方案,例如
ingress
这将推动您前进,并且需要更改您的应用程序的某些配置,例如 URL,因为应用程序将暴露于“互联网”(不是真的,但您可以使用云来实现)。
什么是ingress
:
Ingress is api object which exposes HTTP and HTTPS routes from outside the cluster to services within the cluster. Traffic routing is controlled by rules defined on the Ingress resource.
最常见的选项是 nginx ingress
- 他们的页面 NGINX Ingress Controller。
安装取决于集群类型,但我建议使用 helm
。 (如果你不熟悉 helm
,它是一个使用图表来安装和设置应用程序的模板引擎。已经有很多已经创建的图表,例如 ingress-nginx.
如果您正在使用 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
在此示例中,foo.bar.com
主机名中的不同 paths
上有两个不同的服务可用,并且这两个服务都在集群中。无需将它们暴露在集群之外,因为流量将通过 ingress
.
定向
实际解决方案(如何处理)
已修复并按预期开始工作。这是我的答案,可以安全地分享:)
如您所见,当前端可访问时,OP 面临同样的问题,而后端则不可访问。
随意使用其中的任何东西 answer/repository。
有用的链接:
我正在努力学习 Kubernetes,目前我正在尝试部署我制作的测试应用程序。
我有 3 个容器,每个容器 运行 在自己的容器中
- 前端应用程序(使用 Nuxtjs)
- 后端API (Nodejs)
- MongoDB
对于前端容器,我配置了一个运行良好的外部服务 (LoadBalancer)。我可以从我的浏览器访问该应用程序,没有任何问题。
对于后端 API 和 MongoDB 我为每个配置了一个内部服务。后端 API 和 MongoDB 之间的通信正常。我遇到的问题是前端与后端的通信 API.
我在 Nuxtjs 中使用 Axios 组件,在 nuxtjs.config.js 文件中我将 Axios Base URL 设置为 http://service-name:portnumber/。但这不起作用,我猜是因为 url 是从客户端(浏览器)端调用的,而不是从服务器端调用的。如果我将后端 API 的服务类型更改为 LoadBalancer 并配置 IP 地址和端口号,并将其用作我的 axios URL 那么它就可以工作了。然而,我有点希望将 BackEnd-API 服务保留在内部。是否可以从服务器端而不是客户端调用 Axios 基础 URL。
任何 help/guidance 将不胜感激。
这是我的前端 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
什么是 ingress 以及如何安装它
你猜对了。前端在浏览器中 运行,浏览器“不知道”后端在哪里以及如何访问它。您在这里有两个选择:
- 就像您在集群外部公开后端所做的那样
- 使用高级解决方案,例如
ingress
这将推动您前进,并且需要更改您的应用程序的某些配置,例如 URL,因为应用程序将暴露于“互联网”(不是真的,但您可以使用云来实现)。
什么是ingress
:
Ingress is api object which exposes HTTP and HTTPS routes from outside the cluster to services within the cluster. Traffic routing is controlled by rules defined on the Ingress resource.
最常见的选项是 nginx ingress
- 他们的页面 NGINX Ingress Controller。
安装取决于集群类型,但我建议使用 helm
。 (如果你不熟悉 helm
,它是一个使用图表来安装和设置应用程序的模板引擎。已经有很多已经创建的图表,例如 ingress-nginx.
如果您正在使用 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
在此示例中,foo.bar.com
主机名中的不同 paths
上有两个不同的服务可用,并且这两个服务都在集群中。无需将它们暴露在集群之外,因为流量将通过 ingress
.
实际解决方案(如何处理)
如您所见,当前端可访问时,OP 面临同样的问题,而后端则不可访问。
随意使用其中的任何东西 answer/repository。