【问题标题】:Ingress unable to find backend service in Kubernetes v1.21.5Ingress 在 Kubernetes v1.21.5 中找不到后端服务
【发布时间】:2021-10-25 12:44:50
【问题描述】:

我在 docker 上使用 Kubernetes v1.21.5。以下是我的入口 YAML 文件

kind: Ingress
metadata:
  name: ingress-service
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/use-regex: "true"
spec:
  rules:
    - host: triver.dev  
      http:
        paths:
          - path: /service/account/?(.*)
            pathType: Prefix
            backend:
              service:
                name: auth-srv
                port:
                  number: 3000

我正在运行一个 auth srv 图像,下面是它的 YAML 文件

kind: Deployment
metadata:
  name: auth-depl
spec:
  replicas: 1
  selector:
    matchLabels:
      app: auth
  template:
    metadata:
      labels:
        app: auth
    spec:
      containers:
        - name: auth
          image: triver/auth
          env:
            - name: MONGO_URI
              value: 'mongodb://mongo-srv:27017/auth'
            - name: JWT_KEY
              valueFrom:
                secretKeyRef:
                  name: jwt-secret
                  key: JWT_KEY
---
apiVersion: v1
kind: Service
metadata:
  name: auth-srv
spec:
  selector:
    app: auth
  ports:
    - name: auth
      protocol: TCP
      port: 3000
      targetPort: 3000

但是当我尝试向我在身份验证服务中创建的任何路由发送请求时,例如我创建了一个 triver.dev/service/account/signup 后快速路由器供用户注册。当我尝试通过 Postman 向路由发送发布请求时,它会给出 ECONNRefused 的错误 (404)。无法发送请求。为什么会这样? (我的邮递员工作正常。这不是邮递员端的问题。)

我做错了什么

该应用程序有效,但我无法访问该路线。这绝对是一个入口问题。有人能帮助我吗?这是一个非常重要的项目。

This is what show up when I use the command 'kubectl get ingress'

Everything works fine when I run the application using skaffold dev.

【问题讨论】:

  • 您的入口仅将 /api/users/?(.*) 形式的请求定向到您的后端,因此在 Postman 中您需要将您的请求发送到 triver.dev/api/users/service/account/signup,或者更好的是,将您的入口路径更改为只需/api/
  • 对不起,@code_monk 那是我的错。我更新了问题。我将请求发送到正确的 URL 路径,但它返回了 404 错误。
  • 如果 ECONNRefused 出现 404 错误,我敢打赌入口工作正常,但 Express 服务器和 mongoDB 服务器之间的连接出现故障

标签: express kubernetes kubernetes-ingress skaffold


【解决方案1】:

这是由于你没有在入口中提到主机名,还要确保你的入口控制器正在运行

示例入口

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
    - host: hello-world.info
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: web
                port:
                  number: 8080

主机:hello-world.info

参考:https://kubernetes.io/docs/tasks/access-application-cluster/ingress-minikube/

您也可以结帐:https://kubernetes.io/docs/concepts/services-networking/ingress/

如果您在 ingress 中设置了默认后端并且 host 没有问题

确保您通过 HTTP 而不是 HTTPS

发送请求
nginx.ingress.kubernetes.io/ssl-redirect: "false"

因为您使用证书 SSL/TLS,所以请尝试使用 HTTP

的 URL

【讨论】:

  • 感谢您的回复。我在主机中添加并尝试使用 HTTP 而不是 HTTPS 发送请求。但错误没有变化。它仍然说 ECONN 拒绝
  • 您是否尝试通过端口转发来调试与端口转发一起使用的问题? kubectl port-forward svc/auth-srv 3000:3000
  • 我还是不明白这个问题。这在我以前从未发生过。我在 2 个月前使用完全相同的代码运行了这个项目。它当时可以工作,但现在将入口更新到networking.k8s.io/v1后它无法工作。所以我认为这是一个入口问题。但是我检查了 GitHub 问题,这个问题显然在 2021 年 4 月得到了解决。
  • 我尝试了你提到的端口转发,但同样的问题仍然存在。
  • 检查应用程序的日志,希望没有关闭请求,如果不需要,您可以从入口配置中删除正则表达式。
猜你喜欢
  • 2019-05-30
  • 2019-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-16
  • 2021-10-26
  • 1970-01-01
相关资源
最近更新 更多