使用主机和路径的Nginx入口错误404
我在Azure云上使用Kubernetes,我已经安装了zipkin。 我已经安装了nginx入口,如果我使用以下主机规则,它可以正常工作:使用主机和路径的Nginx入口错误404,nginx,kubernetes-ingress,azure-aks,Nginx,Kubernetes Ingress,Azure Aks,我在Azure云上使用Kubernetes,我已经安装了zipkin。 我已经安装了nginx入口,如果我使用以下主机规则,它可以正常工作: apiVersion: extensions/v1beta1 kind: Ingress metadata: name: test-ingress annotations: ingress.kubernetes.io/rewrite-target: / kubernetes.io/ingress.class: nginx na
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test-ingress
annotations:
ingress.kubernetes.io/rewrite-target: /
kubernetes.io/ingress.class: nginx
namespace: nginx-ingress
spec:
- host: zipkin.hostname.com
http:
paths:
- backend:
serviceName: zipkin
servicePort: 9411
但这不是我想要的。我想要的是类似hostname.com/zipkin的东西
我尝试过这个,但我得到了一个404错误:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test-ingress
annotations:
ingress.kubernetes.io/rewrite-target: /
kubernetes.io/ingress.class: nginx
namespace: nginx-ingress
spec:
rules:
- http:
paths:
- path: /zipkin
backend:
serviceName: zipkin
servicePort: 9411
我该怎么办
编辑:
我尝试添加主机,在执行descripe命令后,我得到了这个
Name: NAME
Namespace: NAMESPACE
Address:
Default backend: default-http-backend:80 (<none>)
Rules:
Host Path Backends
---- ---- --------
hostname.com
/zipkin zipkin:9411 (10.244.0.63:9411)
这是因为您没有在此处提到主机:
spec:
rules:
- host: hostname.com // here
http:
paths:
- path: /zipkin
backend:
serviceName: zipkin
servicePort: 9411
首先,前面的答案是错误的,您不需要指定
host
,除非您想设置DNS,否则它不是强制性的
其次,后端zipkin
需要/zipkin
URI响应,对吗?如果是这种情况,则重写注释将删除URI。因此,您需要像这样更改yaml以将/zipkin
传递到后端
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test-ingress
annotations:
kubernetes.io/ingress.class: nginx
namespace: nginx-ingress
spec:
rules:
- http:
paths:
- path: /zipkin
backend:
serviceName: zipkin
servicePort: 9411
只是为了澄清OP的问题 有不同的 注: 创建入口时,应使用适当的ingress.class注释每个入口,以指示如果集群中存在多个入口控制器,则应使用哪个入口控制器 如果未定义类,云提供商可能会使用默认入口控制器 理想情况下,所有入口控制器都应符合本规范,但不同入口控制器的操作略有不同 使用此注释:
nginx.org/rewrites: >
serviceName=zipkin rewrite=/;
看起来您正在使用nginxinc提供的NGINX入口控制器
您可以找到有关提供的NGINX Ingress Controller的重写支持的更多信息
例如:
nginx.org/rewrites: "serviceName=service1 rewrite=rewrite1[;serviceName=service2 rewrite=rewrite2;...]"
这与当时的库伯内特斯社区不同。
不同的入口控制器具有不同的配置和注释
所以对于这个例子:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
nginx.org/rewrites: "serviceName=my-nginx rewrite=/"
name: test-ingress
namespace: default
spec:
rules:
- host: hostname.com
http:
paths:
- backend:
serviceName: my-nginx
servicePort: 80
path: /zipkin
status:
loadBalancer:
ingress:
- ip: xx.xxx.xxx.xx
测试它:
curl -vH 'Host:hostname.com' xx.xxx.xxx.xx/zipkin
* Connected to xx.xxx.xxx.xx (xx.xxx.xxx.xx) port 80 (#0)
> GET /zipkin HTTP/1.1
> Host:hostname.com
> User-Agent: curl/7.52.1
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: nginx/1.17.5
< Date: Mon, 28 Oct 2019 12:21:48 GMT
< Content-Type: text/html
< Content-Length: 612
< Connection: keep-alive
< Last-Modified: Tue, 22 Oct 2019 14:30:00 GMT
< ETag: "5daf1268-264"
< Accept-Ranges: bytes
<
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
curl-vH'Host:hostname.com'xx.xxx.xxx.xx/zipkin
*已连接到xx.xxx.xxx.xx(xx.xxx.xxx.xx)端口80(#0)
>GET/zipkin HTTP/1.1
>主机:hostname.com
>用户代理:curl/7.52.1
>接受:*/*
>
我已经试过了。但如果我访问hostname.com/zipkin,我会看到一个404白标签错误页面,我试图对入口进行描述,得到了这个名称:Name Namespace:Namespace Address:Default backend:Default http backend:80()规则:主机路径后端-----hostname.com/zipkin-zipkin:9411(10.244.0.63:9411)我用描述命令的格式化结果编辑了我的原始问题您想使用什么DNS?您自己的DNS或任何人?不,我想要的是/zipkin将在后端重写。我使用这个注释nginx.org/rewrites解决了我的问题:>serviceName=zipkin rewrite=/;我要补充我的问题
curl -vH 'Host:hostname.com' xx.xxx.xxx.xx/zipkin
* Connected to xx.xxx.xxx.xx (xx.xxx.xxx.xx) port 80 (#0)
> GET /zipkin HTTP/1.1
> Host:hostname.com
> User-Agent: curl/7.52.1
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: nginx/1.17.5
< Date: Mon, 28 Oct 2019 12:21:48 GMT
< Content-Type: text/html
< Content-Length: 612
< Connection: keep-alive
< Last-Modified: Tue, 22 Oct 2019 14:30:00 GMT
< ETag: "5daf1268-264"
< Accept-Ranges: bytes
<
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>