Kubernetes 入口为特定服务提供 404 错误
Kubernetes ingress gives 404 error for a particular service
我已经在 Azure 上使用 nginx 入口设置了一个 kubernetes 集群。导航到特定路径时出现 404 错误。
我已经设置了一些示例应用程序,return 一个简单的 echo,工作得很好。我的禁令 api 应用总是 return 出现 404 错误。
当我导航到入口路径时,例如
http://51.145.17.105/apple
它工作正常。但是,当我导航到 api 应用程序时,使用 URL:
出现 404 错误
http://51.145.17.105/ban-simple
如果我登录集群并卷曲 ban-simple 服务(不是入口 ip),例如
curl -L 10.1.1.40
我得到了正确的回应。当我尝试使用 nginx ingress 时,出现 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
"good" 服务的副本是:
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 如果这有所不同。
如有任何建议,我们将不胜感激。
正如我在您的 yaml 文件中看到的,您将服务名称设置为 ban-simple-service
用于您的 pod ban-simple:
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: /$
导致了这个问题。我将其注释掉并解决了问题。
我已经在 Azure 上使用 nginx 入口设置了一个 kubernetes 集群。导航到特定路径时出现 404 错误。
我已经设置了一些示例应用程序,return 一个简单的 echo,工作得很好。我的禁令 api 应用总是 return 出现 404 错误。
当我导航到入口路径时,例如
http://51.145.17.105/apple
它工作正常。但是,当我导航到 api 应用程序时,使用 URL:
出现 404 错误http://51.145.17.105/ban-simple
如果我登录集群并卷曲 ban-simple 服务(不是入口 ip),例如
curl -L 10.1.1.40
我得到了正确的回应。当我尝试使用 nginx ingress 时,出现 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
"good" 服务的副本是:
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 如果这有所不同。
如有任何建议,我们将不胜感激。
正如我在您的 yaml 文件中看到的,您将服务名称设置为 ban-simple-service
用于您的 pod ban-simple:
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: /$
导致了这个问题。我将其注释掉并解决了问题。