Kubernetes入口为特定服务给出404错误

时间:2019-07-08 21:09:12

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

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

我已经建立了一些示例应用程序,这些应用程序返回一个运行良好的简单回声。我的禁令api应用程序始终返回404错误。

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

http://51.145.17.105/apple

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

http://51.145.17.105/ban-simple

如果我登录到群集并卷曲禁止简单服务(而不是入口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。

任何建议都值得赞赏。

2 个答案:

答案 0 :(得分:2)

正如我在您的yaml文件中看到的那样,您将Pod禁令简单的服务名称设置为 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

但是您在入口处将服务名称设置为 ban-service

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

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

在我看来,我建议您使用部署而不是Pod。因为如果吊舱处于关闭状态,则它处于关闭状态。但是使用部署,它将为您重新创建一个新的。另外,我认为,如果您在容器中公开端口,则yaml文件将更具可读性。

答案 1 :(得分:0)

是由nginx.ingress.kubernetes.io/rewrite-target: /$引起的。我将其注释掉并解决了该问题。