我有一个应用程序设置,可以通过服务IP联系,但不使用入口规则。
考虑以下进入清单:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: myapp
namespace: default
annotations:
kubernetes.io/ingress.class: public
cert-manager.io/cluster-issuer: letsencrypt-prod
nginx.ingress.kubernetes.io/rewrite-target: /$0
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
spec:
tls:
- secretName: letsencrypt-prod
hosts:
- my.host.net
rules:
- host: my.host.net
http:
paths:
- path: /myapp(/|$)(.*)
pathType: Prefix
backend:
service:
name: myapp
port:
number: 1234
相关的服务已经启动并正在运行,使用10.152.183.91
作为服务IP执行curl 10.152.183.91/myapp/path/
可以得到所需的结果。
然而,当我通过curl my.host.net/myapp/path/
时,我得到了一个308 Permanent Redirect
。同一集群上的其他应用程序正在按预期运行,因此集群本身以及nginx-ingress和CoreDNS正在做他们的工作。
我哪里做错了?是nginx.ingress.kubernetes.io/rewrite-target: /$0
错了吗?
2条答案
按热度按时间w9apscun1#
首先,您需要更改:
nginx.ingress.kubernetes.io/rewrite-target: /$0
nginx.ingress.kubernetes.io/rewrite-target: /$2
说明:
重写目标
备注
Captured groups按时间顺序保存在编号的占位符中,格式为$1、$2 ... $n。这些占位符可用作
rewrite-target
注解中的参数。创建带有重写注解的入口规则:
在此入口定义中,
(.*)
捕获的任何字符都将分配给占位符$2
,然后将其用作rewrite-target
注解中的参数。例如,上述入口定义将导致以下重写:
rewrite.bar.com/something
重写为rewrite.bar.com/
rewrite.bar.com/something/
重写为rewrite.bar.com/
rewrite.bar.com/something/new
重写为rewrite.bar.com/new
至于
curl
部分,通过与您完全相同的方式运行:curl my.host.net/myapp/path/
您将收到一个
308 Permanent Redirect
。默认情况下,
curl
不遵循重定向。请尝试使用curl -L
。设置与您类似的示例:
旁注!
您也可以尝试直接通过
HTTPS
与Ingress
联系。bvk5enib2#
问题是我甚至不需要做任何重定向,因为我的应用程序正在监听端点
/myapp/
,所以任何到达我的服务器/myapp/path
的请求都已经有了正确的URL。当
curl -L
显示重定向循环时,我发现了这一点(正如@dawik-kruk所指出的)