发布
社区首页 >问答首页 >库伯奈特斯内部服务Axios NuxtJS

库伯奈特斯内部服务Axios NuxtJS
EN

Stack Overflow用户
提问于 2021-07-28 20:41:36
回答 1查看 512关注 0票数 0

我正在努力学习Kubernetes,目前我正在尝试部署我开发的测试应用程序。

我有3个集装箱,每个集装箱都在各自的吊舱上运行。

  • 前端应用程序(使用Nuxtjs)
  • 后端API (Nodejs)
  • MongoDB

对于前端容器,我配置了一个运行良好的外部服务(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文件

代码语言:javascript
代码运行次数:0
复制
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文件

代码语言:javascript
代码运行次数:0
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-29 08:34:38

什么是入口以及如何安装它

你的猜测是正确的。前端运行在浏览器中,浏览器“不知道”后端在哪里,以及如何触及它。你在这里有两个选择:

  • 正如您在集群之外公开后端时所做的那样
  • 使用高级解决方案,如ingress

这将推动您的前进,并将需要更改您的应用程序的一些配置,如URL,因为应用程序将暴露在“互联网”(不完全,但您可以使用云)。

什么是ingress

Ingress是api对象,它将HTTP和HTTPS路由从集群外部公开到集群内的服务。流量路由由入侵资源上定义的规则控制。

最常见的选项是nginx ingress --他们的页面NGINX进位控制器

安装取决于集群类型,但是我建议使用helm。(如果您不熟悉helm,它是一个使用图表安装和安装应用程序的模板引擎。已经创建了相当多的图表,例如进气口-

例如,如果您使用的是minikube,那么它已经内置了nginx-ingress,并且可以作为附件启用。

如何使用入口公开服务

一旦你有了工作入口,它就是为它创建规则的类型。

你需要的是有入口,这将能够沟通与前端和后端以及。

摘自kubernetes官方文件的例子:

代码语言:javascript
代码运行次数:0
复制
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在前端是可访问的时候也面临着同样的问题,而后端则不是。

请随意使用该答案/存储库中的任何内容。

有用的链接:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68567115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档