写点什么

实践示例:从一个域名跳转到另一个域名,ingress-nginx 经历了什么

  • 2020-05-18
  • 本文字数:2329 字

    阅读完需:约 8 分钟

实践示例:从一个域名跳转到另一个域名,ingress-nginx经历了什么

由于 nginx 的优秀性能表现,所以很多企业在 Kubernetes 中选择 Ingress Controller 的时候依然会选择基于 nginx 的 ingress-nginx。但它的配置比较麻烦,一些复杂的需求需要通过 Ingress 的 annotation 来实现,比如在本文中我们需要实现一个 url rewrite 的功能,简单来说就是我们之前的应用在 todo.qikqiak.com 下面,现在我们需要通过 todo.qikqiak.com/app/ 来进行访问。


本次测试使用的集群为 Kubernetes v1.16.2(Rancher 2.3.3 已默认支持),ingess-nginx 镜像版本为 0.26.1


最原始的 Ingress 对象如下所示:


apiVersion: extensions/v1beta1kind: Ingressmetadata:  name: fe  namespace: default  annotations:    kubernetes.io/ingress.class: "nginx"spec:  rules:  - host: todo.qikqiak.com    http:      paths:      - backend:          serviceName: fe          servicePort: 3000        path: /
复制代码


就是一个很常规的 Ingress 对象,部署该对象后,将域名解析后就可以正常访问到应用:



按照需求我们需要对访问的 URL 路径做一个 Rewrite,在 ingress-nginx 官方文档中也给出了说明:


https://kubernetes.github.io/ingress-nginx/examples/rewrite/



按照要求我们需要在 path 中匹配前缀 app,然后通过 rewrite-target 指定目标,修改后的 Ingress 对象如下所示:


apiVersion: extensions/v1beta1kind: Ingressmetadata:  name: fe  namespace: default  annotations:    kubernetes.io/ingress.class: "nginx"    nginx.ingress.kubernetes.io/rewrite-target: /$2spec:  rules:  - host: todo.qikqiak.com    http:      paths:      - backend:          serviceName: fe          servicePort: 3000        path: /app(/|$)(.*)

复制代码


更新后,我们可以遇见到直接访问域名肯定是不行了,因为我们没有匹配 / 的 path 路径:



但是我们带上 app 的前缀再去访问:



我们可以看到已经可以访问到页面内容了,这是因为我们在 path 中通过正则表达式 /app(/|$)(.*) 将匹配的路径设置成了 rewrite-target 的目标路径了,所以我们访问 todo.qikqiak.com/app 的时候实际上相当于访问的就是后端服务的 / 路径,但是我们也可以发现现在页面的样式没有了:



这是因为应用的静态资源路径是在 /stylesheets 路径下面的,现在我们做了 url rewrite 过后,要正常访问也需要带上前缀才可以:http://todo.qikqiak.com/stylesheets/screen.css,对于图片或者其他静态资源也是如此,当然我们去更改页面引入静态资源的方式为相对路径也是可以的,但是毕竟要修改代码,这个时候我们可以借助 ingress-nginx 中的 configuration-snippet 来对静态资源做一次跳转,如下所示:


apiVersion: extensions/v1beta1kind: Ingressmetadata:  name: fe  namespace: default  annotations:    kubernetes.io/ingress.class: "nginx"    nginx.ingress.kubernetes.io/rewrite-target: /$2    nginx.ingress.kubernetes.io/configuration-snippet: |      rewrite ^/stylesheets/(.*)$ /app/stylesheets/$1 redirect;  # 添加 /app 前缀      rewrite ^/images/(.*)$ /app/images/$1 redirect;  # 添加 /app 前缀spec:  rules:  - host: todo.qikqiak.com    http:      paths:      - backend:          serviceName: fe          servicePort: 3000        path: /app(/|$)(.*)
复制代码


更新 Ingress 对象后,这个时候我们刷新页面可以看到已经正常了:



要解决我们访问主域名出现 404 的问题,我们可以给应用设置一个 app-root 的注解,这样当我们访问主域名的时候会自动跳转到我们指定的 app-root 目录下面,如下所示:


apiVersion: extensions/v1beta1kind: Ingressmetadata:  name: fe  namespace: default  annotations:    kubernetes.io/ingress.class: "nginx"    nginx.ingress.kubernetes.io/app-root: /app/    nginx.ingress.kubernetes.io/rewrite-target: /$2    nginx.ingress.kubernetes.io/configuration-snippet: |      rewrite ^/stylesheets/(.*)$ /app/stylesheets/$1 redirect;  # 添加 /app 前缀      rewrite ^/images/(.*)$ /app/images/$1 redirect;  # 添加 /app 前缀spec:  rules:  - host: todo.qikqiak.com    http:      paths:      - backend:          serviceName: fe          servicePort: 3000        path: /app(/|$)(.*)

复制代码


这个时候我们更新应用后访问主域名 http://todo.qikqiak.com 就会自动跳转到 http://todo.qikqiak.com/app/ 路径下面去了。但是还有一个问题是我们的 path 路径其实也匹配了 /app 这样的路径,可能我们更加希望我们的应用在最后添加一个 / 这样的 slash,同样我们可以通过 configuration-snippet 配置来完成,如下 Ingress 对象:


apiVersion: extensions/v1beta1kind: Ingressmetadata:  name: fe  namespace: default  annotations:    kubernetes.io/ingress.class: "nginx"    nginx.ingress.kubernetes.io/app-root: /app/    nginx.ingress.kubernetes.io/rewrite-target: /$2    nginx.ingress.kubernetes.io/configuration-snippet: |      rewrite ^(/app)$ $1/ redirect;      rewrite ^/stylesheets/(.*)$ /app/stylesheets/$1 redirect;      rewrite ^/images/(.*)$ /app/images/$1 redirect;spec:  rules:  - host: todo.qikqiak.com    http:      paths:      - backend:          serviceName: fe          servicePort: 3000        path: /app(/|$)(.*)
复制代码


更新后我们的应用就都会以 / 这样的 slash 结尾了。这样就完成了我们的需求,如果你原本对 nginx 的配置就非常熟悉的话应该可以很快就能理解这种配置方式了,当然如果你还是喜欢更加简单明了的方式的话可以推荐使用 Traefik 。


2020-05-18 18:073922

评论

发布
暂无评论
发现更多内容

探索AI,拥抱未来,欢迎加入魔乐世界!

天翼云开发者社区

人工智能 云计算

数据出境安全必知:22项政策为你指明出境之路!(附下载)

极盾科技

区块链行业低迷的原因及未来发展展望

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 NFT开发 公链开发

谈一谈 Netty 的内存管理 —— 且看 Netty 如何实现 Java 版的 Jemalloc

bin的技术小屋

Netty 内存管理 netty jemalloc管理器 Java.

掌握数据,赢得市场 —— 淘宝商品详情API让电商运营更精准

技术冰糖葫芦

API 接口 API 测试 API 策略 pinduoduo API

鸿蒙网络编程系列37-基于TCP套接字的TLS通讯客户端示例

长弓三石

DevEco Studio 开发实例 HarmonyOS NEXT 网络与连接

洞见数据未来,StarRocks Summit Asia 2024 即将启幕!

StarRocks

小试牛刀 - Kubernetes 上搭建 TiDB 集群

TiDB 社区干货传送门

实践案例

简洁至上——探索产品与技术的优雅原则

京东科技开发者

低代码平台如何通过AI赋能,实现更智能的业务自动化?

天津汇柏科技有限公司

低代码 AI 人工智能

鸿蒙网络编程系列36-固定包头可变包体解决TCP粘包问题

长弓三石

DevEco Studio 开发实例 HarmonyOS NEXT 网络与连接

AI时代云动力:新一代弹性计算云主机开启智能计算新纪元!

天翼云开发者社区

云计算 云服务 云主机 弹性计算 天翼云

亚马逊详情API接口的获取与应用

科普小能手

API 接口 API 测试 亚马逊API 亚马逊商品详情数据接口 亚马逊商品详情API

TiDB替换Starrocks:业务综合宽表迁移的性能评估与降本增效决策

TiDB 社区干货传送门

8.x 实践

运维成本降低 90%,存储成本降低 3 倍:多点利用 TiDB 资源管控功能将 100+ 套 MySQL 集合到一个 TiDB 实践

TiDB 社区干货传送门

性能调优 实践案例 版本升级 数据库架构选型 7.x 实践

TiCDC 同步 SQL_MODE 相关

TiDB 社区干货传送门

6.x 实践 TiCDC 源码解读

测试人生 | 被裁员后人生低谷到绝处逢生,薪资怒涨近40%

测试人

软件测试

taobao.item_get_desc API返回值中的促销信息与活动标签

技术冰糖葫芦

API 接口 API 测试 API 策略 pinduoduo API

案例分析——HyperWorks练习做模型简化

智造软件

案例分析 仿真软件 Hypermesh

鸿蒙开发案例:垃圾分类

zhongcx

鸿蒙

重构商业生态:DApp创新玩法与盈利模式的深度剖析

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 公链开发 代币开发

实践示例:从一个域名跳转到另一个域名,ingress-nginx经历了什么_文化 & 方法_Rancher_InfoQ精选文章