k8s中的nginx-ingress如何配置路径重定向

一. 需求描述

路径重定向的一般应用场景:

  • 调整用户浏览的URL,看起来更规范
  • 为了让搜索引擎收录网站内容,让用户体验更好
  • 网站更换新域名后
  • 根据特殊的变量、目录、客户端信息进行跳转

我这里遇到的问题是,以前的很多服务路径配置不规范,有的服务使用项目名作为二级路径,有的服务是随意定义的访问路径,为了统一使用项目名作为访问的二级路径,避免修改代码,所以需要配置路径重定向。

举一个例子,我有一个 a 服务,它原来的访问路径是 api/v1/apps,现在我需要通过路径 a/api/v1/apps 访问,需要将 a/ 重定向到 /

也就是 www.test.com/a/api/v1/apps 重定向到 www.test.com/api/v1/apps

二. 解决方法

需要确保在集群中有一个 ingress controller 正在运行。我们可以按照如下方式配置 ingress

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
name: rewrite
namespace: default
spec:
ingressClassName: nginx
rules:
- host: www.test.com
http:
paths:
- path: /a(/|$)(.*)
pathType: Prefix
backend:
service:
name: http-svc
port:
number: 80

在这个 ingress 的定义中,通过在 annotations 中指定了 nginx.ingress.kubernetes.io/rewrite-target: /$2 来进行重定向,(.*) 捕获的任何字符都将被分配给占位符 $2,然后在 rewrite-target 中用作参数。

应用上面的 ingress 配置,可以实现下面的重定向:

  • www.test.com/a 重定向到 www.test.com/
  • www.test.com/a/ 重定向到 www.test.com/
  • www.test.com/a/api/v1/apps 重定向到 www.test.com/api/v1/apps

rewriting 可以使用下面的 anntations 进行控制:

名称 描述
nginx.ingress.kubernetes.io/rewrite-target 必须重定向流量的目标URI string
nginx.ingress.kubernetes.io/ssl-redirect 表示位置部分是否可访问SSL(当Ingress包含证书时默认为True) bool
nginx.ingress.kubernetes.io/force-ssl-redirect 强制重定向到HTTPS,即使入口没有启用TLS bool
nginx.ingress.kubernetes.io/app-root 定义应用根,如果它在'/'上下文中,控制器必须重定向它 string
nginx.ingress.kubernetes.io/use-regex 表示Ingress上定义的路径是否使用正则表达式 bool

App Root

创建一个带有 nginx.ingress.kubernetes.io/app-root 注解的 ingress,如下所示:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/app-root: /app1
name: approot
namespace: default
spec:
ingressClassName: nginx
rules:
- host: approot.bar.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: http-svc
port:
number: 80

检查 rewrite 是否起作用:

$ curl -I -k http://approot.bar.com/
HTTP/1.1 302 Moved Temporarily
Server: nginx/1.11.10
Date: Mon, 13 Mar 2017 14:57:15 GMT
Content-Type: text/html
Content-Length: 162
Location: http://approot.bar.com/app1
Connection: keep-alive

参考文档

https://github.com/kubernetes/ingress-nginx/blob/main/docs/examples/rewrite/README.md

https://www.cnblogs.com/brianzhu/p/8624703.html

k8s中的nginx-ingress如何配置路径重定向的更多相关文章

  1. Debian中CodeIgniter+nginx+MariaDB+phpMyAdmin配置

    本文不讲述软件安装过程,记述本人在Debia中配置CodeIgniter时遇到的问题及解决方法,希望能够为有需要的人提供帮助. 一.Debian版本及所需的软件 Debian 9.8 stretch ...

  2. kubernetes nginx ingress 使用记录

    前言 ingress是一种可以暴露k8s集群内部service的方式,用户编辑配置文件定义一个ingress资源即可实现外部网络访问内网service. ingress controller是来管理所 ...

  3. Nginx Ingress 高并发实践

    概述 Nginx Ingress Controller 基于 Nginx 实现了 Kubernetes Ingress API,Nginx 是公认的高性能网关,但如果不对其进行一些参数调优,就不能充分 ...

  4. 在win10 docker启动的centos容器中安装nginx

    我是在win10机器上搭建了一个docker,在docker启动了centos容器,在centos中安装nginx. 安装配置docker 直接在官网下载docker for windows:http ...

  5. [转帖]在 k8s 中通过 Ingress 配置域名访问

    在 k8s 中通过 Ingress 配置域名访问 https://juejin.im/post/5db8da4b6fb9a0204520b310 在上篇文章中我们已经使用 k8s 部署了第一个应用,此 ...

  6. 实操教程丨如何在K8S集群中部署Traefik Ingress Controller

    注:本文使用的Traefik为1.x的版本 在生产环境中,我们常常需要控制来自互联网的外部进入集群中,而这恰巧是Ingress的职责. Ingress的主要目的是将HTTP和HTTPS从集群外部暴露给 ...

  7. k8s中几个基本概念的理解,pod,service,deployment,ingress的使用场景

    k8s 总体概览 前言 Pod 副本控制器(Replication Controller,RC) 副本集(Replica Set,RS) 部署(Deployment) 服务(Service) ingr ...

  8. 在k8s中部署前后端分离项目进行访问的两种配置方式

    第一种方式 (1) nginx配置中只写前端项目的/根路径配置 前端项目使用的Dockerfile文件内容 把前端项目编译后生成的dist文件夹放在nginx的html默认目录下,浏览器访问前端项目时 ...

  9. [转帖]在 k8s 中自动为域名配置 https

    在 k8s 中自动为域名配置 https https://juejin.im/post/5db8d94be51d4529f73e2833 随着 web 的发展,https 对于现代网站来说是必不可少的 ...

随机推荐

  1. SpringCloud微服务实战——搭建企业级开发框架(三十三):整合Skywalking实现链路追踪

      Skywalking是由国内开源爱好者吴晟(原OneAPM工程师)开源并提交到Apache孵化器的产品,它同时吸收了Zipkin/Pinpoint/CAT的设计思路,支持非侵入式埋点.是一款基于分 ...

  2. HGAME2021 week2 pwn writeup

    week2一共有4道pwn题 killerqueen 有格式化字符串漏洞,题不算难,但是故事情节真实让人摸不着头脑,但是仔细分析分析,理清楚逻辑就可以做了. 第一次choose1的时候,可以输入0,泄 ...

  3. 估计工期标识(Project)

    <Project2016 企业项目管理实践>张会斌 董方好 编著 有时候吧,我们遇到的任务,工期并不是那么好定的,本来嘛,一个项目如果全靠拍脑袋,最后搞不好会被人锤脑袋-- 看来PM有风险 ...

  4. 金山云 KS3 Python SDK 多线程并发上传文件;下载断点续传 参考脚本

    并发上传 基于py自带模块 concurrent.futures import ThreadPoolExecutor #!/usr/bin/env python3 # -*- coding:utf-8 ...

  5. vue 判断页面是否滚动到底部

    需求 要求用户阅读完本页所有内容后,下一步按钮才可以点击. 实现思路 通过判断当前页面是否到达底部来设置按钮的点击事件. 要判断当前页面是否到达底部需要用到三个距离--距离顶部的距离scrollTop ...

  6. centos下修改hosts文件以及生效命令

    修改 vim /etc/hosts 生效 service network restart 或者 /etc/init.d/network restart

  7. Linux(centos) 设置MySQL数据库不区分大小写

    1.修改配置文件 vim /etc/my.cnf 在[mysqld]节点下,加入一行: lower_case_table_names=1 2.重启数据库服务 service mysqld restar ...

  8. App调试的几个命令实践

    1.logcat命令这个命令最简单常用,可查看帮助 第一种事例:adb logcat > /sdcard/mylogcat.txt 第二种事例:adb logcat > D:/Temp/1 ...

  9. 【LeetCode】505. The Maze II 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 BFS 日期 题目地址:https://leetcod ...

  10. 【LeetCode】80. Remove Duplicates from Sorted Array II 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...