kubernetes - 在 Kubernetes 上使用 nginx 入口注释进行多次重写?
问题描述
我相信我必须创建多个Ingress
资源才能达到预期的效果,但必须问,是否可以为同一主机使用 nginx(社区)控制器进行多个 rewrite annotations?
我有以下内容,但据我了解,它不起作用,因为无法将重写规则显式链接到路径。在这种情况下,我想它可以使用捕获组数量不同的事实,但情况并非总是如此。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: api-ingress
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: https://staging.example.com/keyword-lnk/badnewsbears/$1/$2
nginx.ingress.kubernetes.io/rewrite-target: https://staging.example.com/lnk/$2
certmanager.k8s.io/cluster-issuer: staging-letsencrypt-prod
spec:
rules:
- host: staging.example.com
http:
paths:
- path: /
backend:
serviceName: api-service
servicePort: http
- host: badnewsbears.example.com
http:
paths:
- backend:
serviceName: api-service
servicePort: http
path: ^(/a/)(.*)$
- backend:
serviceName: api-service
servicePort: http
path: ^/([tbc])/(.*)
tls:
- hosts:
- staging.example.com
- badnewsbears.example.com
secretName: letsencrypt-prod-issuer-account-key
# ^ must be set to the key matching the annotation
# certmanager.k8s.io/cluster-issuer above
目标是请求staging.example.com
不进行重写,但请求badnewsbears.example.com/t/soup
重写为https://staging.example.com/keyword-lnk/badnewsbears/t/soup
,而
badnewsbears.example.com/a/soup
产量https://staging.example.com/lnk/$2
有没有办法在(或其他地方)指定重写目标->路径的映射Ingress
,或者我是否必须将同一主机的不同重写规则分成不同的
解决方案
您可以使用相同的主机和不同的路径创建多个应用注释的入口。所以这将是您首先怀疑的解决方案。
您可以考虑尝试基于 Nginx Plus 的 Ingress。
要配置 URI 重写,您需要将
nginx.org/rewrites
注释添加到 Ingress 资源定义中。注释语法如下:
nginx.org/rewrites: "serviceName=service1 rewrite=rewrite1[;serviceName=service2 rewrite=rewrite2;...]"
这是官方的例子。
请让我知道这是否有帮助。
推荐阅读
- c# - 如果 OnClientClick="return false",LinkButton OnCommand 函数仅在首次单击时触发
- r - R - csv 写/读更改小数分隔符
- ios - UICollectionViewDropDelegate:在删除图标上拖动单元格
- package - 在 La/TeX 中重新创建 KaTeX 仿真?
- python - 如何将默认值写入列,其中默认值是从使用另一个列的函数创建的值?
- c - 使用 for 循环分配内存
- powerbi - 此 SQL 窗口函数的 PowerBI/DAX 查询等效项是什么
- google-apps-script - 用于根据复选框移动行的 Google 脚本 - Google 工作表
- node.js - react-boilerplate yarn start:prod 无法访问此站点 localhost 拒绝连接。http://localhost:3000 => https://localhost/
- typescript - TS1183:无法在 Typescript 的环境上下文中声明实现