kubernetes Nginx入口重写目标为308,服务正在运行

svmlkihl  于 2023-03-01  发布在  Kubernetes
关注(0)|答案(2)|浏览(494)

我有一个应用程序设置,可以通过服务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错了吗?

w9apscun

w9apscun1#

首先,您需要更改:

  • 发件人:nginx.ingress.kubernetes.io/rewrite-target: /$0
  • 至:nginx.ingress.kubernetes.io/rewrite-target: /$2

说明:

重写目标

备注

Captured groups按时间顺序保存在编号的占位符中,格式为$1、$2 ... $n。这些占位符可用作rewrite-target注解中的参数。
创建带有重写注解的入口规则:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/use-regex: "true"
     nginx.ingress.kubernetes.io/rewrite-target: /$2
  name: rewrite
  namespace: default
spec:
  ingressClassName: nginx
  rules:
  - host: rewrite.bar.com
    http:
      paths:
      - path: /something(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: http-svc
            port: 
              number: 80

在此入口定义中,(.*)捕获的任何字符都将分配给占位符$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 my.host.net/myapp/path/

您将收到一个308 Permanent Redirect
默认情况下,curl不遵循重定向。请尝试使用curl -L
设置与您类似的示例:

❯ curl kruklabs.internal/myapp/      
<html>
<head><title>308 Permanent Redirect</title></head>
<body>
<center><h1>308 Permanent Redirect</h1></center>
<hr><center>nginx</center>
</body>
</html>

❯ curl kruklabs.internal/myapp/ -L -k  
Here is the nginx container!

旁注!
您也可以尝试直接通过HTTPSIngress联系。

bvk5enib

bvk5enib2#

问题是我甚至不需要做任何重定向,因为我的应用程序正在监听端点/myapp/,所以任何到达我的服务器/myapp/path的请求都已经有了正确的URL。
curl -L显示重定向循环时,我发现了这一点(正如@dawik-kruk所指出的)

相关问题