【问题标题】:Kubernetes ingress gives 404 error for a particular serviceKubernetes 入口为特定服务提供 404 错误
【发布时间】:2019-11-18 10:07:17
【问题描述】:

我已经在 Azure 上使用 nginx 入口建立了一个 kubernetes 集群。导航到特定路径时出现 404 错误。

我设置了一些示例应用程序,这些应用程序返回一个简单的回声,效果非常好。我的 ban api 应用程序总是返回 404 错误。

当我导航到入口路径时,例如

http://51.145.17.105/apple

它工作正常。但是,当我导航到 api 应用程序时,使用 URL 时出现 404 错误:

http://51.145.17.105/ban-simple

如果我登录集群并 curl 禁止简单服务(不是入口 ip),例如

curl -L 10.1.1.40

我得到了正确的回应。当我使用 nginx 入口尝试它时,我得到了 404 错误。

入口映射对我来说很合适。这是包含路径的入口 yaml 的副本。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: fruit-ingress
  namespace: ban
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    nginx.ingress.kubernetes.io/rewrite-target: /$
spec:
  rules:
  - http:
      paths:
        - path: /apple
          backend:
            serviceName: apple-service
            servicePort: 5678
        - path: /ban-simple
          backend:
            serviceName: ban-service
            servicePort: 80

“好”服务的副本是:

kind: Pod
apiVersion: v1
metadata:
  name: apple-app
  namespace: ban
  labels:
    app: apple
spec:
  containers:
    - name: apple-app
      image: hashicorp/http-echo
      args:
        - "-text=apple"

---

kind: Service
apiVersion: v1
metadata:
  name: apple-service
  namespace: ban
spec:
  selector:
    app: apple
  ports:
    - port: 5678 # Default port for image

不起作用的服务是:

kind: Pod
apiVersion: v1
metadata:
  name: ban-simple
  namespace: ban
  labels:
    app: ban-simple
spec:
  containers:
    - name: ban-simple
      image: xxxxx.azurecr.io/services/ban

---

kind: Service
apiVersion: v1
metadata:
  name: ban-simple-service
  namespace: ban
spec:
  selector:
    app: ban-simple
  ports:
    - port: 80 # Default port for image

我已经在本地运行了容器,它可以在我的机器上运行。如果有影响,它会重定向到 localhost/index.html。

欢迎提出任何建议。

【问题讨论】:

  • 我不明白,你的应用程序返回 404,你得到一个 404,不知何故你觉得应该发生其他事情?无论哪种方式,如果您无法弄清楚,请先查看入口日志并将其发布在此处
  • 这个问题有什么更新吗?它对你有用吗?

标签: nginx kubernetes kubernetes-ingress nginx-ingress azure-aks


【解决方案1】:

正如我在您的 yaml 文件中看到的,您将 pod ban-simple 的服务名称设置为 ban-simple-service

kind: Service
apiVersion: v1
metadata:
  name: ban-simple-service
  namespace: ban
spec:
  selector:
    app: ban-simple
  ports:
    - port: 80 # Default port for image

但是你在 ingress 中将服务名称设置为 ban-service

    - path: /ban-simple
      backend:
        serviceName: ban-service
        servicePort: 80

我认为这是可能的原因。因此,您需要更改其中一个服务名称以使其相同。

在我看来,我会建议您使用部署而不是 pod。因为如果 pod 宕机了,那么它就宕机了。但是使用部署,它会为你重新创建一个新的。另外,我认为如果你在容器中暴露端口,yaml 文件的可读性会更好。

【讨论】:

  • 查尔斯,非常感谢您抽出宝贵时间。这不是服务名称,而是 ``` nginx.ingress.kubernetes.io/rewrite-target: /$ ``` 导致了问题。我把它注释掉了,它起作用了。另外,感谢您对部署的建议。我只是在用 Pod 进行测试。测试完成后肯定会进行部署。
【解决方案2】:

nginx.ingress.kubernetes.io/rewrite-target: /$ 导致了这个问题。我把它注释掉了,它解决了这个问题。

【讨论】:

    猜你喜欢
    • 2018-10-04
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    • 2018-03-06
    • 2020-05-22
    • 1970-01-01
    • 2016-06-26
    • 1970-01-01
    相关资源
    最近更新 更多