Next.js 使用 Kind 在本地部署 - 错误 502 Bad Gateway NGINX

问题描述 投票:0回答:1

我正在本地测试对 Next.js 应用程序的某种集群的部署,Ingress 似乎存在问题,我只是找不到收到错误 502 Bad Gateway NGINX 的原因。

这是我的文件:

Dockerfile

FROM node:21-alpine as base

# Install dependencies
FROM base AS deps

RUN apk add --no-cache libc6-compat
WORKDIR /app

COPY package.json package-lock.json* ./
RUN npm ci

# Build
FROM base as builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .

RUN npm run build

# Runner
FROM base AS runner
WORKDIR /app

ENV NODE_ENV production
ENV NEXT_TELEMETRY_DISABLED 1

RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs

USER nextjs

COPY --from=builder /app/public ./public

COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static

EXPOSE 3000

ENV PORT 3000

CMD ["node", "server.js"]

部署:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nextjs-app
  labels:
    app: nextjs-app
spec:
  selector:
    matchLabels:
      app: nextjs-app
  replicas: 2
  template:
    metadata:
      labels:
        app: nextjs-app
    spec:
      containers:
        - name: nextjs-app
          image: myImage
          imagePullPolicy: Always
          ports:
            - containerPort: 3000
          resources:
            limits:
              memory: "100Mi"
              cpu: "100m"

集群IP服务:

apiVersion: v1
kind: Service
metadata:
  name: nextjs-app-service
spec:
  type: ClusterIP
  selector:
    app: nextjs-app
  ports:
    - name: nextjs-app-service
      port: 80
      targetPort: 3000
      protocol: TCP

入口:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
spec:
  rules:
    - http:
        paths:
          - pathType: Exact
            path: /
            backend:
              service:
                name: nextjs-app-service
                port:
                  number: 80
          - path: /api
            pathType: Prefix
            backend:
              service:
                name: python-django-service
                port:
                  number: 80

我已经检查了所有的 pod 和服务,它们似乎都很好,并且我已经使用 kubectl port-forward 进行了测试,并且该应用程序与 ClusterIP 服务一起运行。所以问题似乎出在 Ingress 步骤上。

pod 的日志也没有问题,只是没有任何可能表明有流量重定向到它们的日志。

此外,我有一个 Django 应用程序在不同的路径中运行,该应用程序在本地主机上与 Ingress 一起使用。我还使用一个非常简单的 FastAPI 服务进行了测试,并且这个 Ingress 路由设置有效(这意味着我可以像我想要的那样在不同的路径上提供不同的服务)。

所以对我来说问题似乎在于 Next.js 应用程序与 Ingress 的连接。

这是 ingress-nginx pod 日志中出现的错误:

2024/03/13 12:14:34 [error] 308#308: *730 connect() failed (111: Connection refused) while connecting to upstream, client: 172.27.0.1, server: _, request: "GET / HTTP/1.1", upstream: "http://10.244.3.2:3000/", host: "localhost"
next.js kubernetes-ingress kind
1个回答
0
投票

这并不是真正的解决方案,但这种结构适用于新的应用程序。所有的 kubernetes 文件和 dockerfile 都工作得很好,也许有一些配置被关闭了。

我刚刚构建了一个新的 create-next-app@latest 并将所有文件从旧版本转移到新版本并且它有效。如果应用程序不太复杂,这可能是一个可行的解决方案。

PS:它可能不是 Next.js 版本,因为我的旧应用程序是最新的。

© www.soinside.com 2019 - 2024. All rights reserved.