我正在本地测试对 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"
这并不是真正的解决方案,但这种结构适用于新的应用程序。所有的 kubernetes 文件和 dockerfile 都工作得很好,也许有一些配置被关闭了。
我刚刚构建了一个新的 create-next-app@latest 并将所有文件从旧版本转移到新版本并且它有效。如果应用程序不太复杂,这可能是一个可行的解决方案。
PS:它可能不是 Next.js 版本,因为我的旧应用程序是最新的。