文章转载自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247484594&idx=1&sn=becbe567b4a1e72ca731ee084b266ea2&chksm=fdb90bafcace82b9457337b6669deebb8da4922c840a89d882cfd52779e8dfe5402b784f92f3&scene=178&cur_album_id=1319287026209947648#rd

k8s版本:1.20.12

traefik版本:2.4.8

根据实践操作,部分内容跟原文对比有删改

比如我们现在在 Kubernetes 集群中部署了一个 Nexus 应用,和其他应用一样,我们通过 IngressRoute 来暴露服务,对应的资源清单如下所示:(nexus.yaml)

apiVersion: apps/v1
kind: Deployment
metadata:
name: nexus
namespace: test
labels:
app: nexus
spec:
selector:
matchLabels:
app: nexus
template:
metadata:
labels:
app: nexus
spec:
containers:
- image: sonatype/nexus3:3.37.3
imagePullPolicy: IfNotPresent
name: nexus
ports:
- containerPort: 8081
---
apiVersion: v1
kind: Service
metadata:
labels:
app: nexus
name: nexus
namespace: test
spec:
ports:
- name: nexusport
port: 8081
targetPort: 8081
selector:
app: nexus
---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: nexus
namespace: test
spec:
entryPoints:
- web
routes:
- kind: Rule
match: Host(`www.aaa.com`)
services:
- kind: Service
name: nexus
port: 8081

dashboard面板使用的网址是www.daniel.com,在这里还是用的话访问报错404,因此换一个网址,本机hosts文件里添加解析

执行查看

kubectl apply -f nexus.yaml
kubectl get ingressroute -n test
kubectl get deployment -n test
kubectl get svc -n test
kubectl get pod -n test

部署完成后,我们根据 IngressRoute 对象中的配置,只需要将域名 www.aaa.com 解析到 Traefik 的节点即可访问:

同样的现在我们有一个需求是目前我们只有一个域名可以使用,但是我们有很多不同的应用需要暴露,这个时候我们就只能通过 PATH 路径来进行区分了,比如我们现在希望当我们访问 http:/www.daniel.com/nexus 的时候就是访问的我们的 Nexus 这个应用,当路径是 /foo 开头的时候是其他应用,这种需求是很正常的,这个时候我们就需要来做 URL Rewrite 了。

首先我们使用 StripPrefix这个中间件,这个中间件的功能是在转发请求之前从路径中删除前缀,在使用中间件的时候我们只需要理解中间件操作的都是我们直接的请求即可,并不是真实的应用接收到请求过后来进行修改。

现在我们添加一个如下的中间件:

apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
name: strip-foo-path
namespace: test # 注意中间件所在命名空间
spec:
stripPrefix:
prefixes:
- /nexus

创建中间件

然后现在我们就需要从 http:/www.aaa.com/nexus 请求中去匹配 /nexus 的请求,把这个路径下面的请求应用到上面的中间件中去,因为最终我们的 Nexus 应用接收到的请求是不会带有 /nexus 路径的,所以我们需要在请求到达应用之前将这个前缀删除,更新 IngressRoute 对象:

注意:这一步是修改www.aaa.com的IngressRoute 对象,也就是上一步创建的

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: nexus
namespace: test
spec:
entryPoints:
- web
routes:
- kind: Rule
match: Host(`www.aaa.com`) && PathPrefix(`/nexus`)
middlewares:
- name: strip-foo-path
services:
- kind: Service
name: nexus
port: 8081

更新完成上面的 IngressRoute 对象后,这个时候我们前往浏览器中访问 http:/www.aaa.com/nexus,这个时候发现我们的页面任何样式都没有了:

通过 Chrome 浏览器的 Network 可以查看到 /nexus路径的请求是200状态码,但是其他的静态资源对象确全都是404了,这是为什么呢?我们仔细观察上面我们的 IngressRoute 资源对象,我们现在是不是只匹配了 /nexus的请求,而我们的静态资源是 /static 路径开头的,当然就匹配不到了,所以就出现了404,所以我们只需要加上这个 /static 路径的匹配就可以了,同样更新 IngressRoute 对象:

---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: nexus
namespace: test
spec:
entryPoints:
- web
routes:
- kind: Rule
match: Host(`www.aaa.com`) && PathPrefix(`/nexus`)
middlewares:
- name: strip-foo-path
services:
- kind: Service
name: nexus
port: 8081
- kind: Rule
match: Host(`www.aaa.com`) && PathPrefix(`/static`)
services:
- kind: Service
name: nexus
port: 8081

然后更新 IngressRoute 资源对象,这个时候再次去访问应用,可以发现页面样式已经正常了,也可以正常访问应用了,但进入应用后发现还是有错误提示信息,通过 Network 分析发现还有一些 /service 开头的请求是404,当然我们再加上这个前缀的路径即可:

---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: nexus
namespace: test
spec:
entryPoints:
- web
routes:
- kind: Rule
match: Host(`www.aaa.com`) && PathPrefix(`/nexus`)
middlewares:
- name: strip-foo-path
services:
- kind: Service
name: nexus
port: 8081
- kind: Rule
match: Host(`www.aaa.com`) && PathPrefix(`/static`) || PathPrefix(`/service`)
services:
- kind: Service
name: nexus
port: 8081

更新后,再次访问应用就已经完全正常了

Traefik2.X 版本 中 URL Rewrite 的使用的更多相关文章

  1. Windows10中的IIS10安装php manager和IIS URL Rewrite 2.0组件的方法

    Windows10中自带的Server:Microsoft-IIS/10.0,然后这个10却让原本支持组件无法安装了,php manager组件安装时提示“必须安装IIS7以上才可以安装”.那是不是真 ...

  2. 在ASP.NET MVC中使用IIS级别的URL Rewrite

    原文 在ASP.NET MVC中使用IIS级别的URL Rewrite 大约一年半前,我在博客上写过一系列关于URL Rewrite的文章(2.3.4),把ASP.NET平台上进行URL Rewrit ...

  3. Windows Server 2016中,安装PHP Manager,ARR3.0或者URL Rewrite 2.0无法成功的解决办法

    如图: 无法安装原因都是这几个工具无法识别10.0这个版本,可以修改注册表来先完成安装,然后再改回去 PHPManager的修改方法如下: 打开注册表工具(运行Regedt32),找到:HKEY_LO ...

  4. resin中关于url rewrite来传递jsessionid的问题

    最近两天在项目中碰到,一个很奇怪的问题.同一个账号多次切换登录时,会出现这个账号的信息在session中找不到,虽然可以登录成功,但是之后这个用户信息好像没有保存到session中一样,或者是被改变了 ...

  5. ASP.NET Core中怎么实现Url rewrite功能

    我们可以使用ASP.NET Core的中间件来实现Url rewrite功能,下面我们定义一个中间件ReplaceQueryStringMiddleware来替换Http请求中的Url参数即Query ...

  6. 在IIS 中如何配置URL Rewrite,并且利用出站规则保持被重写的Cookie的域

    Url Rewrite配置 xx.aa.com/bb/test1.aspx 会重写到 bb.aa.com/test1.aspx 具体怎么配置入站 出站规则 结果:

  7. 翻译:为 URL Rewrite 模块创建重写规则

    原文名称:Creating Rewrite Rules for the URL Rewrite Module 原文地址:http://www.iis.net/learn/extensions/url- ...

  8. IIS URL Rewrite Module防盗链规则配置方法

    IIS版本:IIS 7.5 URL Rewrite组件:IIS URL Rewrite Module(http://www.iis.net/downloads/microsoft/url-rewrit ...

  9. IIS7伪静态化URL Rewrite模块

    原文 IIS7伪静态化URL Rewrite模块 在Win7安装了IIS7.5之后,搭建一些网站或者博客,但是IIS7.5本身没有URL Rewrite功能,也就是无法实现网址的伪静态化. 从网上找了 ...

随机推荐

  1. 类似Tower的而故事还没结束

    我对于SaaS一种有一种英雄主义的情怀在里面,无论是早期的推事本,还是后面我去调研的麦客CRM,国内的SaaS都在努力生长,在后疫情时代剩下的都是平台级的钉钉.飞书,或者垂直领域的王炸app了. 我早 ...

  2. 使用supervisor设置应用开机自启

    安装supervisor: sudo apt install supervisor -y 创建配置文件: sudo vim /etc/supervisor/conf.d/frpc.conf frpc. ...

  3. CMP0065警告问题

    参考链接: https://cmake.org/cmake/help/latest/policy/CMP0065.html https://cmake-developers.cmake.narkive ...

  4. $\mathcal{A\,F\,O}$

    突然间,告诉我不用学计算机了 真的有点像是做梦 回忆自己的OI生涯 真的不知从何说起 小学的时候 被家长哄着报名了当时很热门的 logo语言 在炎热的夏天,电脑里小海龟的步伐从未停歇 那时的自己很骄傲 ...

  5. javascript引用"bug"带来的"继承"

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  6. YII自定义小部件

    案例如下 common/widgets/TopMenu.php(地址可以自定义位置,命名空间一定要对应) <?php /** * Created by PhpStorm. * Date: 201 ...

  7. Win10系统下搭建Go lang开发环境更换国内源并且体验宇宙最快框架Iris

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_156 最近有同学开始尝试接触Go lang,拥抱新技术永远都会是一个好习惯,之前的一篇文章介绍了如何在Mac os系统下配置Go ...

  8. C#静态类、静态成员、静态方法

    一.作用 静态类和非静态类重要的区别是在于静态类不能被实例化,也就是说不能使用  new 关键字创建静态类类型的变量,防止程序员写代码来实例化该静态类或者在类的内部声明任何实例字段或方法. 用于存放不 ...

  9. 【AGC】增长服务1-远程配置示例

    ​ [AGC]增长服务1-远程配置示例 前言:上一次笔者给大家带来了AGC领域的性能管理服务的学习.这次我们再继续深化学习AGC的相关知识.在文章开始之前,再给读者简单介绍一下AGC,以免第一次来的读 ...

  10. 原生js也可以自定义组件

    Web Components 是一套不同的技术,允许您创建可重用的定制元素(它们的功能封装在您的代码之外)并且在您的web应用中使用它们. 它由三项主要技术组成,它们可以一起使用来创建封装功能的定制元 ...