【问题标题】:Kubernetes Internal Service Axios NuxtJSKubernetes 内部服务 Axios NuxtJS
【发布时间】:2021-07-28 20:41:36
【问题描述】:

我正在尝试学习 Kubernetes,目前我正在尝试部署我制作的测试应用程序。

我有 3 个容器,每个容器都在自己的 pod 上运行

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

对于前端容器,我配置了一个运行良好的外部服务 (LoadBalancer)。我可以毫无问题地从浏览器访问该应用程序。

对于后端 API 和 MongoDB,我为每个配置了一个内部服务。后端 API 和 MongoDB 之间的通信正在工作。我遇到的问题是前端与后端 API 通信。

我在 Nuxtjs 和 nuxtjs.config.js 文件中使用 Axios 组件,我已将 Axios 基本 URL 设置为 http://service-name:portnumber/。但这不起作用,我猜是因为 url 是从客户端(浏览器)端调用的,而不是从服务器端调用的。如果我将后端 API 的服务类型更改为 LoadBalancer 并配置 IP 地址和端口号,并将其用作我的 axios URL,那么它可以工作。不过,我有点希望将 BackEnd-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

【问题讨论】:

    标签: kubernetes axios nuxtjs


    【解决方案1】:

    什么是 ingress 以及如何安装

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

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

    这将推动您前进,并且需要更改应用程序的某些配置,例如 URL,因为应用程序将暴露于“互联网”(不是真的,但您可以使用云来完成​​)。

    ingress是什么:

    Ingress 是一个 api 对象,它将集群外部的 HTTP 和 HTTPS 路由暴露给集群内的服务。流量路由由 Ingress 资源上定义的规则控制。

    最常见的选项是nginx ingress - 他们的页面NGINX Ingress Controller

    安装取决于集群类型,但我建议使用helm。 (如果你不熟悉helm,它是一个使用图表来安装和设置应用程序的模板引擎。已经创建了很多图表,例如ingress-nginx

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

    如何使用 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 主机名内的不同 paths 上有两个不同的服务可用,并且这两个服务都在集群内。无需将它们暴露在集群之外,因为流量将通过ingress 引导。

    实际解决方案(如何接近)

    This is very similar configuration 已修复并按预期开始工作。这是我的答案,可以放心分享:)

    正如您所见,当前端可访问时,OP 面临同样的问题,而后端则不能。

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

    【讨论】:

    • 嗨@moonkotte,感谢您提供非常详细和完整的答案。我将看看 Ingress 并尝试按照您解释的方式实现它。太感谢了。消费电子展
    猜你喜欢
    • 2020-03-24
    • 1970-01-01
    • 2019-01-04
    • 2020-09-15
    • 2021-10-27
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    • 2021-11-14
    相关资源
    最近更新 更多