如何解决Ingress - 简单的扇出配置不起作用
我使用的是 Ubuntu 20.04.2 LTS。我安装了 microk8s 1.20.6 rev 2143 并尝试了 ingress。我一定遗漏了一些东西 - 但它并没有像我期望的那样工作。我将奇怪的行为归结为以下配置:
ingress.yaml:
apiVersion: networking.k8s.io/v1
kind: Ingress
Metadata:
name: my-ubuntu
annotations:
Nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: my-ubuntu
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: Nginx
port:
number: 80
- path: /Nginx
pathType: Prefix
backend:
service:
name: Nginx
port:
number: 80
Nginx-service.yaml:
apiVersion: v1
kind: Service
Metadata:
name: Nginx
spec:
ports:
- port: 80
name: http
- port: 443
name: https
type: ClusterIP
selector:
app: Nginx
现在
curl my-ubuntu/ # this returns Welcome page,as expected
curl my-ubuntu/Nginx # this returns Welcome page,as expected
curl my-ubuntu/bad-page.html # this returns 404 Not Found,as expected
curl my-ubuntu/Nginx/bad-page.html # this returns Welcome page. WHY?
my-ubuntu/Nginx/* 下的任何请求都会返回欢迎页面,即使 url 是正确的并且应该返回不同的内容。我配置错了吗?
我能够使用 Docker for Windows + WSL2 + Ubuntu + ingress 来重现同样的奇怪行为:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-Nginx/controller-v0.41.2/deploy/static/provider/cloud/deploy.yaml
编辑
我使用的Nginx-deployment.yaml:
apiVersion: apps/v1
kind: Deployment
Metadata:
name: Nginx
labels:
app: Nginx
spec:
replicas: 1
revisionHistoryLimit: 0
selector:
matchLabels:
app: Nginx
template:
Metadata:
labels:
app: Nginx
spec:
containers:
- image: Nginx
imagePullPolicy: Always
name: Nginx
当我像@HarshManvar 建议的那样尝试 /Nginx/
而不是 /Nginx
时,我得到了这种行为:
curl my-ubuntu/ # this returns Welcome page,as expected
curl my-ubuntu/Nginx # this returns 404 Not Found
curl my-ubuntu/Nginx/ # this returns Welcome page
curl my-ubuntu/Nginx/bad-page.html # this returns Welcome page
Kubernetes Ingress documentation about Simple fanout 也确实使用了 /Nginx
模式,但不能按上述方式工作。
解决方法
https://kubernetes.github.io/ingress-nginx/examples/rewrite/ 解释了如何使用 rewrite-target
注释。我能够使用以下 ingress.yaml 使其工作:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ubuntu
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
rules:
- host: localhost
http:
paths:
- path: /(.*)
pathType: Prefix
backend:
service:
name: nginx
port:
number: 80
- path: /nginx($|/.*)
pathType: Prefix
backend:
service:
name: nginx
port:
number: 80
每个path
用( )
定义正则表达式,产生$1
、$2
等,也就是。正则表达式捕获组变量。现在您使用这些变量放置 rewrite-target
,这将是传递到处理请求的服务容器的实际 URL。
也许还有另一种方法,但这是我能够让它发挥作用的唯一方法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。