写点什么

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

评论

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

Khronos: 面向万亿规模时间线的性能监控引擎建设实践

阿里技术

性能监控 Khronos 时序数据管理

Mac电脑专业思维导图软件 ConceptDraw MINDMAP最新激活版

胖墩儿不胖y

Mac软件 思维导图软件

故障解析丨Clone节点导致主从故障

GreatSQL

语音识别技术在智能客服领域的应用与挑战

数据堂

大模型训练中CPU与GPU使用率的优化策略

百度开发者中心

训练 大模型

VideoProc Converter 4K for mac(视频转换软件)

展初云

Mac 格式转换 Mac软件 视频格式

与创新者同行,Doris Summit Asia 2023 线下技术峰会圆满落幕!

SelectDB

数据库 大数据 数据分析 实时数仓 apache doris

概念回顾:负载均衡、四层负载均衡、七层负载均衡

NGINX开源社区

负载均衡 四层负载均衡 七层负载均衡

ConceptDraw PROJECT 14 for Mac(项目管理软件)

展初云

项目管理 Mac软件

【iOS逆向与安全】原生程序与WebView交互

小陈

逆向 iOS逆向 ios安全 逆向分析 逆向技术

3种方法,用Java找出两个List中的重复元素

华为云开发者联盟

Java 开发 华为云 华为云开发者联盟

18万奖金!开放原子开源大赛OpenCloudOS赛题征集开启

开放原子开源基金会

开源 大赛

Topaz Video AI for Mac:视频增强和修复工具

彩云

Topaz Video AI 视频增强修复工具

1024程序员节,飞桨星河社区开发者们一起闯关升级、玩转Prompt应用赢大奖~

飞桨PaddlePaddle

飞桨 大模型 Prompt 一言插件

ps插件:alpaca增效工具 v2.8.1 中文版

彩云

ps插件 Alpaca插件

火山引擎 LAS Spark 升级:揭秘 Bucket 优化技术

字节跳动数据平台

数据库 大数据 火山引擎 企业号10月PK榜 Spark Bucket

【万字长文】基于阿里云PAI平台搭建知识库检索增强的大模型对话系统

阿里云大数据AI技术

人工智能

基于大模型训练的中文自然语言处理平台

百度开发者中心

自然语言处理 模型训练 大模型

语音识别技术在移动设备上的应用与优化

数据堂

「我在淘天做技术」双11背后的营销技术体系

阿里技术

营销 淘天 营销技术

为何在中国 Navicat 远比 DBeaver 流行

Bytebase

数据库 sql DevOps navicat Dbeaver

2023平台工程崭露头角,AI 带来新机遇与挑战

SEAL安全

AI 平台工程 企业号10月PK榜

Vuepress 三分钟搭建一个精美的文档或博客

凌览

Vue 博客 vuepress

安全攻防实战丨如何预防利用中间人攻击进行小程序刷分

华为云开发者联盟

网络安全 安全 华为云 系统安全 华为云开发者联盟

大模型训练助力获取高精度CV模型

百度开发者中心

自然语言 大模型

iStatistica Pro 5 for Mac(系统活动监控工具)

展初云

Mac Mac软件

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