NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

实践示例:从一个域名跳转到另一个域名,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:073115

评论

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

每日一题:LeetCode-129. 求根节点到叶节点数字之和

半亩房顶

面试 算法 LeetCode 二叉树 DFS

解锁数字化时代的软件包管理利器—华为云CodeArts Artifact.docx

YG科技

昇腾AI开发者创享日·广州站成功举办 四大仪式激发人工智能产业创新活力

彭飞

华为云耀云服务器L实例,数字化竞争的制胜法宝

YG科技

1688商品详情接口在电商行业中的重要性及实时数据获取实现

Noah

当代数据库领域先驱者 Mohan 教授、ASF 成员 Julian 博士莅临天谋科技参观指导

Apache IoTDB

Wireshark使用技巧

小魏写代码

K8s容器debug高级技巧

SEAL安全

容器 Kubernetes 集群

文件夹和文件比较工具 VisualDiffer免激活最新版

mac大玩家j

Mac软件 对比软件 文件夹对比工具

浅谈SQL优化小技巧 | 京东云技术团队

京东科技开发者

MySQL 数据库 sql 性能优化

Blackmagic Fusion Studio 18 mac v18.6.4正式激活版

影影绰绰一往直前

华为云CodeArts Artifact:数字化时代软件包管理的领航者

YG科技

低代码开发到底是补品还是垃圾食品?

伤感汤姆布利柏

轻松建网站,一键部署,华为云不止省时还省心

YG科技

华为云 CodeArts Artifact:开启企业管理新模式

YG科技

安卓设备解锁工具 FonesGo Android Unlocker激活中文版

胖墩儿不胖y

Mac软件 安卓设备解锁工具

驱动优化做盾,性能提升为矛,看英特尔锐炫GPU如何破壁生态与创新

E科讯

第12期 | 用友BIP项目云,助力施工项目全过程、全要素创新发展

用友BIP

项目管理

软件测试/人工智能丨关系运算符

测试人

人工智能 软件测试

Premiere Pro 2024 mac v24.1中文激活版

影影绰绰一往直前

华为云助力企业引领数字化时代

YG科技

极狐GitLab 与 Flux 集成实现 GitOps

极狐GitLab

开源 DevOps gitlab gitops Flux

京东商品详情接口在电商行业中的重要性及实时数据获取实现

Noah

HashData:大数据时代的“追光者”

酷克数据HashData

Redis 也支持全文搜索 了?这也太强了

越长大越悲伤

redis Jedis redisearch

使用Flink完成流数据统计 | 京东云技术团队

京东科技开发者

大数据 flink stream 数据统计

app开发

Geek_8da502

用友与上海国家会计学院联合主办第六届智能财务高峰论坛

用友BIP

智能会计

《公立医院成本核算指导手册》印发 公立医院应该如何做好成本核算

用友BIP

成本管理

大数据离在线混部资源调度的演进和选型

KubeData

大数据 云原生 云原生大数据

2024 年最值得推荐的 7 个 Vue3 组件库

Kagol

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