Kubernetes 内部服务 Axios NuxtJS

Kubernetes Internal Service Axios NuxtJS

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

我有 3 个容器,每个容器 运行 在自己的容器中

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