Kubernetes 在同一个子域部署两个微服务导致频繁和随机的 404 错误

Posted

技术标签:

【中文标题】Kubernetes 在同一个子域部署两个微服务导致频繁和随机的 404 错误【英文标题】:Kubernetes deployment of two microservices at same subdomain resulting in frequent and random 404 errors 【发布时间】:2020-12-02 08:33:37 【问题描述】:

我们有一个由 nodejs 前端和 nginx 后端组成的 Kubernetes 部署。我们发现这两个部署分别在 Kubernetes 中运行良好,但是当它们都部署到前端时,几乎 50% 的时间都返回 404。

假设我们的虚拟服务存在问题是很自然的,但事实似乎并非如此,基于 vs/gateway 的部署不足以导致问题的事实。似乎如果我们在后端部署一个不同的、不相关的图像,前端会继续工作而不会出现 404 错误。

该应用最初是通过 JHipster 生成的,我们手动分离了前端和后端组件。前端是nodejs,后端是Java/nginx。该应用在本地运行,但在 k8s 部署中失败。

另外,我们的 Kubernetes 部署在 Rancher 中。

实验似乎表明它与我们后端部署中的某些东西有关,所以我在下面包含了我们的后端 deployement.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: ourapp-be-custom-mount
spec:
  revisionHistoryLimit: 3
  replicas: 1
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25%
  template:
    spec:
      containers:
        - name: ourapp-be-custom-mount
          image: "IMAGE_SET_BY_OVERLAYS_KUSTOMIZATION"
          envFrom:
            - configMapRef:
                name: ourapp-be-config
          ports:
          - name: http
            containerPort: 8080
          resources:
            limits:
              cpu: "0.5"
              memory: "2048Mi"
            requests:
              cpu: "0.1"
              memory: "64Mi"
          imagePullPolicy: IfNotPresent
          volumeMounts:
            - mountPath: /usr/share/h2/data
              name: ourapp-db-vol01-custom-mount

          securityContext:
            runAsNonRoot: true
            runAsUser: 1000
      imagePullSecrets:
        - name: regcred-nexus
      volumes:
      - name: ourapp-db-vol01-custom-mount
        persistentVolumeClaim:
          claimName: ourapp-db-pvc-volume01-custom-mount
      terminationGracePeriodSeconds: 30

【问题讨论】:

您将前端与 java 后端分开,这很好。不幸的是,您在运行npm start 时使用的 webpack 开发服务器不打算在生产中使用,您的包应该部署到像 nginx 这样的 web 服务器或 JHipster 网关。需要说明的是,你的前端不是 nodejs,它使用的是 nodejs 开发工具。 你检查后端使用的资源了吗? 请显示相关的服务、入口和前端资源定义。很难从提供的信息中推断出任何东西。 【参考方案1】:

每个服务都需要指向不同的应用。您可以在 Rancher 中验证每个服务指向不同的应用程序。检查你的 yaml。如果使用 Kustomize,commonLabels:app 可能会绊倒你。确保它指向不同的前端和后端应用。

【讨论】:

以上是关于Kubernetes 在同一个子域部署两个微服务导致频繁和随机的 404 错误的主要内容,如果未能解决你的问题,请参考以下文章

Kubernetes 上微服务之间集群间通信的最佳方式?

如何在Kubernetes上进行微服务部署

当我们需要部署微服务的时候,哪个更好?

kubernetes部署spring cloud微服务项目

SpringCloud微服务电商系统在Kubernetes集群中上线详细教程

如何从 IntelliJ 运行/部署 Spring Boot 微服务到本地 Kubernetes 集群?