无法阻止 Kubernetes Ingress 将路径向下发送到目标 pod
Can't prevent Kubernetes Ingress to send path down to target pod
这可能看起来像 duplicate 但它不是,因为链接线程中的解决方案对我不起作用。
我将 Ingress 配置为根据路径将请求分派到不同的 pods
期望的行为:
public_ip/app1 -> pod1_ip:container1_port/
public_ip/app2 -> pod2_ip:container2_port/
public_ip/app3 -> pod3_ip:container3_port/
实际行为:
public_ip/app1 -> pod1_ip:container1_port/app1
public_ip/app2 -> pod2_ip:container2_port/app2
public_ip/app3 -> pod3_ip:container3_port/app3
所以我们在 app1、app2、app3 上得到 404
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: some_name
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
acme.cert-manager.io/http01-edit-in-place: "true"
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/use-regex: "true"
spec:
ingressClassName: "nginx"
tls:
- hosts:
- some.host
secretName: tls-cafe-ingress
rules:
- host: some.host
http:
paths:
- path: /app1(/|$)(.*)
backend:
serviceName: app1
servicePort: 1234
- path: /app2(/|$)(.*)
backend:
serviceName: app2
servicePort: 2345
- path: /app3(/|$)(.*)
backend:
serviceName: app3
servicePort: 3456
问题是 Ingress 忽略路径规范,一旦其中有正则表达式。这个可以通过查看Ingress的日志看出:
k logs -n nginx-ingress ingress-pod-name
这里我们可以看到 hat nginx 在日志中有对 /appX 的请求,并尝试从本地 html 文件夹为它们提供服务,换句话说,yaml 中定义的路径被忽略。
如果正则表达式从它工作的路径中删除,但随后路径被发送到下游的目标 pod,这会破坏应用程序
有两个流行的使用 Nginx 的 K8s Ingress 控制器:
- 一个由开源社区维护
(kubernetes/ingress-nginx)
我们习惯称它为
community ingress controller
- 第二个由 NGINX 维护,其名称为
nginxinc/kubernetes-ingress
适用于这种情况的主要区别在于注释的使用。对于您使用的社区入口控制器:
nginx.ingress.kubernetes.io/<annotation_type>
对于 nginxinc 使用:
nginx.org/<annoation_type>
要查看更多差异,请访问 this 文档。
这可能看起来像 duplicate 但它不是,因为链接线程中的解决方案对我不起作用。
我将 Ingress 配置为根据路径将请求分派到不同的 pods
期望的行为:
public_ip/app1 -> pod1_ip:container1_port/
public_ip/app2 -> pod2_ip:container2_port/
public_ip/app3 -> pod3_ip:container3_port/
实际行为:
public_ip/app1 -> pod1_ip:container1_port/app1
public_ip/app2 -> pod2_ip:container2_port/app2
public_ip/app3 -> pod3_ip:container3_port/app3
所以我们在 app1、app2、app3 上得到 404
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: some_name
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
acme.cert-manager.io/http01-edit-in-place: "true"
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/use-regex: "true"
spec:
ingressClassName: "nginx"
tls:
- hosts:
- some.host
secretName: tls-cafe-ingress
rules:
- host: some.host
http:
paths:
- path: /app1(/|$)(.*)
backend:
serviceName: app1
servicePort: 1234
- path: /app2(/|$)(.*)
backend:
serviceName: app2
servicePort: 2345
- path: /app3(/|$)(.*)
backend:
serviceName: app3
servicePort: 3456
问题是 Ingress 忽略路径规范,一旦其中有正则表达式。这个可以通过查看Ingress的日志看出:
k logs -n nginx-ingress ingress-pod-name
这里我们可以看到 hat nginx 在日志中有对 /appX 的请求,并尝试从本地 html 文件夹为它们提供服务,换句话说,yaml 中定义的路径被忽略。
如果正则表达式从它工作的路径中删除,但随后路径被发送到下游的目标 pod,这会破坏应用程序
有两个流行的使用 Nginx 的 K8s Ingress 控制器:
- 一个由开源社区维护
(kubernetes/ingress-nginx)
我们习惯称它为
community ingress controller
- 第二个由 NGINX 维护,其名称为 nginxinc/kubernetes-ingress
适用于这种情况的主要区别在于注释的使用。对于您使用的社区入口控制器:
nginx.ingress.kubernetes.io/<annotation_type>
对于 nginxinc 使用:
nginx.org/<annoation_type>
要查看更多差异,请访问 this 文档。