官方站点 nginx-configuration: Annotations – NGINX Ingress Controller(kubernetes.github.io)
1、ingress-nginx 之 rewrite
**官方示例: ** Rewrite – NGINX Ingress Controller (kubernetes.github.io)
rewrite
可以使用下面的annotations
进行控制:
名称 | 描述 | 值 |
---|---|---|
nginx.ingress.kubernetes.io/rewrite- target | 将匹配到的url重定向到 rewrite-target 注解指定的路径 | 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 | 访问主域名的时候会自动跳转 到 app-root 注解指定的路径 | string |
nginx.ingress.kubernetes.io/use- regex | 表示Ingress上定义的路径是否 使用正则表达式 | bool |
1、rewrite
的一般应用场景
- 调整用户浏览的URL,看起来更规范;
- 网站更换新域名后,为了不影响SEO,让用户体验更好;
- 根据特殊的变量、目录、客户端信息进行跳转;
2、JAVA-ing示例
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: java-ingress-nginx
namespace: default
annotations:
nginx.ingress.kubernetes.io/use-regex: "true"
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
ingressClassName: nginx
rules:
- host: java.kubernets.cn
http:
paths:
- pathType: Prefix
backend:
service:
name: springboot
port:
number: 8080
path: /appone(/|$)(.*)
在这个 ingress 的定义中,通过在annotations
中指定了nginx.ingress.kubernetes.io/rewrite-target: /$2
来进行重定向,(.*)
捕获
的任何字符都将被分配给占位符$2
,然后在rewrite-target
中用作参数。
例如,上面的入口定义将导致以下重写:
java.kubernets.cn/appone
重写为java.kubernets.cn/
java.kubernets.cn/appone/
重写为java.kubernets.cn/
java.kubernets.cn/appone/apptwo
重写为java.kubernets.cn/apptwo
3、验证
$ curl -i -k http://java.kubernets.cn/appone/
HTTP/1.1 404
$ curl -i -k http://java.kubernets.cn/appone/apptwo
HTTP/1.1 200
appTwo
4、permanent-redirect
当访问java.kubernets.cn 域名
,会重定向到新的域名
annotations:
nginx.ingress.kubernetes.io/permanent-redirect: 'https://zhdya.gitee.io'
测试验证:
$ curl -i -k http://java.kubernets.cn/appone
HTTP/1.1 301 Moved Permanently
2、Ingress-nginx 黑白名单
场景:
- 1、对外暴露的核心接口只允许特定的IP地址访问(对公合作);
- 2、财务应用只允许特定IP段访问(内网限制);
注意点:
- Annotations:只对指定svc的Ingress生效;
- ConfigMap:全局生效;
- 黑名单可以使用ConfigMap去配置,白名单建议使用Annotations去配置。
- 白名单是默认是拒绝所有,只允许一个地址去访问;
- 黑名单是不允许该地址去访问所有;
- 若是同时配置了Annotations和configmap,一般都是annotations生效,configmap不生效,因为annotations优先级比configmap高;
1、白名单
$ cat ingress-nginx-whitelist.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: java-ingress-nginx
namespace: default
annotations:
nginx.ingress.kubernetes.io/whitelist-source-range: 192.168.0.100
spec:
ingressClassName: nginx
rules:
- host: java.kubernets.cn
http:
paths:
- pathType: Prefix
backend:
service:
name: springboot
port:
number: 8080
path: /
测试:
$ curl -i -k http://java.kubernets.cn/appone
HTTP/1.1 403 Forbidden
针对 网段 进行白名单操作:
annotations:
nginx.ingress.kubernetes.io/whitelist-source-range: 192.10.0.0/16,192.168.0.100
测试:
$ curl -i -k http://java.kubernets.cn/appone
HTTP/1.1 200
配置到ConfigMap中(操作前,先将当前的configmap备份):
## 备份
$ kubectl get cm -ningress-nginx ingress-nginx-controller -oyaml >ingress-nginx-controller.yaml
## 配置白名单
apiVersion: v1 data:
allow-snippet-annotations: "true"
kind: ConfigMap
metadata:
annotations:
meta.helm.sh/release-name: ingress-nginx
meta.helm.sh/release-namespace: ingress-nginx
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
app.kubernetes.io/version: 1.7.0
helm.sh/chart: ingress-nginx-4.6.0
name: ingress-nginx-controller
namespace: ingress-nginx
data:
whitelist-source-range: 10.1.10.0/24
问题: 一旦应用如上规则,再次访问 http://java.kubernets.cn/appone 是200还是 403?
200,annotations优先级比configmap高;
2、黑名单
annotation配置:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: java-ingress-nginx
namespace: default
annotations:
nginx.ingress.kubernetes.io/server-snippet: |-
deny 192.10.192.158;
deny 192.168.0.100;
allow all;
spec:
ingressClassName: nginx
rules:
- host: java.kubernets.cn
http:
paths:
- pathType: Prefix
backend:
service:
name: springboot
port:
number: 8080
path: /
测试:
$ curl -i -k http://java.kubernets.cn/appone
HTTP/1.1 403 Forbidden
更换节点访问:
$ curl -i -k http://java.kubernets.cn/appone
HTTP/1.1 200
ConfigMap配置如下:
apiVersion: v1
data:
allow-snippet-annotations: "true"
kind: ConfigMap
metadata:
annotations:
meta.helm.sh/release-name: ingress-nginx
meta.helm.sh/release-namespace: ingress-nginx
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
app.kubernetes.io/version: 1.7.0
helm.sh/chart: ingress-nginx-4.6.0
name: ingress-nginx-controller
namespace: ingress-nginx
data:
whitelist-source-range: 10.1.10.0/24
block-cidrs: 10.1.10.100
3、Ingress-nginx 速率限制
1、为什么要限速?
- 1、限速的本质是保证公平。
- 2、在带宽资源有限的情况下,尽可能地保障每个用户能被合理的分配足够的带宽值,服务更多的用户。
- 3、限速还可以大大缓解分布式拒绝服务攻击(DDOS)带来的影响。
这里的 速率 可以是:
- 单个用户在单位时间内访问资源的频率;
- 也可以是单个ip在单位时间内访问资源的频率;
- 还可以是单位时间内指定连接的传输速率;
策略标准: (线上环境不要轻易去测试!一定要在非正式环境做验证)
nginx.ingress.kubernetes.io/limit-connections: 单个IP地址允许的并发连接数。 超出此限制时,将返回503错误。 nginx.ingress.kubernetes.io/limit-rps: 每秒从给定IP接受的请求数。突发限制设置为此限制乘以突发乘数,默认乘数为5。 当客户端超过此限制时,将返回limit-req-status-code默认值: 503。
nginx.ingress.kubernetes.io/limit-rpm: 每分钟从给定IP接受的请求数。突发限制设置为此限制乘以突发乘数,默认乘数为5。 当客户端超过此限制时,将返回limit-req-status-code默认值: 503。
nginx.ingress.kubernetes.io/limit-burst-multiplier: 突发大小限制速率的倍数。默认的脉冲串乘数为5,此注释将覆盖默认的乘数。当客户端超过此限制时,将返回 limit-req-status-code默认值: 503。
nginx.ingress.kubernetes.io/limit-rate-after: 最初的千字节数,在此之后,对给定连接的响应的进一步传输将受到速率的限制。必须在启用代理缓冲的情况下使用此功能。
nginx.ingress.kubernetes.io/limit-rate: 每秒允许发送到给定连接的千字节数。零值禁用速率限制。必须在启用代理缓冲的情况下使用此功能。 nginx.ingress.kubernetes.io/limit-whitelist: 客户端IP源范围要从速率限制中排除。该值是逗号分隔的CIDR列表。
2、ingress-nginx配置
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: java-ingress-nginx
namespace: default
annotations:
nginx.ingress.kubernetes.io/limit-rate: 100K
nginx.ingress.kubernetes.io/limit-whitelist: 10.1.10.100
nginx.ingress.kubernetes.io/limit-rps: "1"
nginx.ingress.kubernetes.io/limit-rpm: "30"
nginx.ingress.kubernetes.io/limit-connections: "10"
spec:
ingressClassName: nginx
rules:
- host: java.kubernets.cn
http:
paths:
- pathType: Prefix
backend:
service:
name: springboot
port:
number: 8080
path: /
备注:
nginx.ingress.kubernetes.io/limit-rate:限制客户端每秒传输的字节数
nginx.ingress.kubernetes.io/limit-whitelist:白名单中的IP不限速
nginx.ingress.kubernetes.io/limit-rps:单个IP每秒的连接数
nginx.ingress.kubernetes.io/limit-rpm:单个IP每分钟的连接数
nginx.ingress.kubernetes.io/limit-connections:连接数被限制为10
测试验证:(偶发 503 异常)
$ for i in `seq 1 30`; do curl http://java.kubernets.cn/appone -I;done
4、Ingress-nginx 基本认证
有些访问是需要认证访问的,比如运管平台:skywalking,默认平台不需要输入任何用户名或密码。
需求:利用ingress-nginx实现,访问的时候输入用户名和密码。
1、工具生成秘钥:
## 用http的命令工具来生成
$ yum -y install httpd-tools
$ htpasswd -c auth admin
New password:
Re-type new password:
## 查看密文
$ cat auth
2、创建secret
需要将secret认证文件和pod放在同一个 名称空间 下
$ kubectl create secret generic basic-auth --from-file=auth -n default
secret/basic-auth created
3、配置Ingress
需要在annotations下添加三条配置
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: java-ingress-nginx
namespace: default
annotations:
nginx.ingress.kubernetes.io/auth-type: basic
nginx.ingress.kubernetes.io/auth-secret: basic-auth
nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required - admin'
spec:
ingressClassName: nginx
rules:
- host: java.kubernets.cn
http:
paths:
- pathType: Prefix
backend:
service:
name: springboot
port:
number: 8080
path: /
备注:
# 认证类型
nginx.ingress.kubernetes.io/auth-type: basic
# 包含账号密码的secret
nginx.ingress.kubernetes.io/auth-secret: basic-auth
# 认证提示信息
nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required - admin'
测试验证:
$ curl -i -k http://java.kubernets.cn/appone
HTTP/1.1 401 Unauthorized
web访问测试:

5、其余annotations参数
1、禁用https强制跳转
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "false"
2、Ingress-nginx的匹配请求头
需求:针对手机用户,匹配header头信息,将请求转发至手机端app。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: java-ingress-nginx
namespace: default
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/server-snippet: |-
set $agentflag 0;
if ($http_user_agent ~* "(iPhone|iPod|android)" ){
set $agentflag 1;
}
if ( $agentflag = 1 ) {
return 301 https://m.baidu.com;
}
spec:
ingressClassName: nginx
rules:
- host: java.kubernets.cn
http:
paths:
- pathType: Prefix
backend:
service:
name: springboot
port:
number: 8080
path: /
测试验证:
$ curl --user-agent "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7" http://java.kubernets.cn/appone -i
HTTP/1.1 301 Moved Permanently
Date: Sat, 06 May 2023 03:53:04 GMT
Content-Type: text/html
Content-Length: 162
Connection: keep-alive
Location: https://m.baidu.com
6、总结
- rewrite: 重定向是在Nginx中转发请求前修改请求URI的过程,可以根据不同的规则对请求进行重定向,例如:将HTTP请求改为HTTPS请求。
- 黑白名单: 黑白名单是管理访问授权的一种方式,可以允许或禁止某些IP地址或者特定的请求。
- 速率限制: 限速是针对某些请求进行限制,例如:限制同一IP的请求速率,以减轻服务器压力。
- 基本认证: 认证是通过设置用户名和密码以确保只有输入正确的用户可以访问特定 资源。