502 错误网关:无法通过 Ingress NGINX 访问 Kubernetes Pod

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

我正在尝试在本地 Kubernetes 集群上设置 Ingress NGINX(使用启用了 Kubernetes 的 Windows 版 Docker Desktop)来公开多个微服务,但我遇到了“502 Bad Gateway”错误和“connect() failed (111)” :连接被拒绝)”和“服务‘default/auth-cluster-ip’在入口 NGINX 日志中没有任何活动端点”。

Kubernetes 对象配置是使用 YAML 文件完成的。

这是我的 Ingress NGINX 配置 yaml:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-service
  annotations:
    nginx.ingress.kubernetes.io/use-regex: "true"
spec:
  ingressClassName: nginx
  rules:
    - host: instagram-clone.dev
      http:
        paths:
          - path: /v1/auth/?(.*)
            pathType: ImplementationSpecific
            backend:
              service:
                name: auth-cluster-ip
                port:
                  number: 3000
          - path: /v1/profile/?(.*)
            pathType: ImplementationSpecific
            backend:
              service:
                name: profile-cluster-ip
                port:
                  number: 3000

这是 auth 部分的部署和服务配置,供参考

apiVersion: apps/v1
kind: Deployment
metadata:
  name: auth-depl
spec:
  replicas: 1
  selector:
    matchLabels:
      app: auth
  template:
    metadata:
      labels:
        app: auth
    spec:
      containers:
        - name: auth
          image: instagram-clone/auth
          env:
            - name: JWT_SECRET
              valueFrom:
                secretKeyRef:
                  name: jwt-secret
                  key: JWT_SECRET
---
apiVersion: v1
kind: Service
metadata:
  name: auth-cluster-ip
spec:
  selector:
    app: auth
  ports:
    - name: auth
      protocol: TCP
      port: 3000
      targetPort: 3000

我还用这一行更新了主机文件:127.0.0.1 instagram-clone.dev

这是我的node.js auth微服务index.js:

export const app = express();

app.use(json());

app.use("/", authRouter);

采取的调试步骤

  • 当我对 pod 执行直接端口转发时,我验证了 auth-cluster-ip 服务处于活动状态并正确响应。
  • 尽管如此,Ingress 似乎无法连接到后端服务,即使 auth-cluster-ip 似乎已正确配置。
kubernetes kubernetes-ingress ingress-nginx
1个回答
0
投票

该错误与我在微服务中定义路径的方式有关。我最初认为与入口文件中定义的基本 URL 匹配的每个请求都会被转发到正确的 pod,而 URL 的其余部分则由微服务本身处理。我只是误解了入口配置中的路由定义实际上是如何工作的。 挂载路由的正确路径定义是:

app.use("/v1/auth", authRouter);

就像 Ingress 配置文件中定义的那样。

希望这对某人有帮助。

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