

kubernetes下nginx ingress的限制
source link: https://bajie.dev/posts/20211129-kubernetes_nginx_ingress_limit/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

在 kubernetes 中,ingress 负责转发、融断和限流。
我们以 Nginx ingress 为例,讨论一下这方面的问题。
一、Nginx ingress黑白名单
这个很简单了,丢进黑名单或者白名单,在入口前拦一刀。
我们只要在 annotations 声明即可:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: www-com-ingress
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/block-cidrs: a.b.c.d/32
#nginx.ingress.kubernetes.io/whitelist-source-range: a.b.c.d/32
spec:
tls:
- hosts:
- www.huabbao.com
secretName: www-huabbao-com-cert
rules:
- host: www.huabbao.com
http:
paths:
- path: /
backend:
serviceName: nginx-svc
注意,多个ip的话,之间用逗号隔开(该值是逗号分隔的CIDR列表) :
nginx.ingress.kubernetes.io/whitelist-source-range: '58.246.36.130,180.167.74.98,114.85.176.38’
二、Nginx ingress限速
限速这个问题比较复杂,首先我们需要考虑到用户体验,如果很鲁棒性的强制限制客户端流量是10KB,那么如果一开始的加载页面如果较大,客户直接就离场了。所以首先要考虑要有初始字节量,这个量需要能让客户顺畅的打开首页。然后我们再设定请求速率,再考虑单个IP地址的并发连接量(并发量×速率=客户端实际速率),第四个再考虑每分钟或每秒的最大请求数。
以下注释定义按顺序排列,可以设置单个客户端IP地址打开的连接的限制,可用于缓解DDoS攻击。
- 一、nginx.ingress.kubernetes.io/limit-rate-after:设置初始字节量,在此之后,进一步传输将受到limit-rate速率限制。
- 二、nginx.ingress.kubernetes.io/limit-rate:每秒接受的请求速率(每秒字节数)。
- 三、nginx.ingress.kubernetes.io/limit-connections:来自单个IP地址的并发连接数。(可以建立最大连接数)
- 四、nginx.ingress.kubernetes.io/limit-rps:每秒可从给定IP接受的连接数。(每个源 IP 每个源 IP 每秒最大请求次数)
- 五、nginx.ingress.kubernetes.io/limit-rpm:每分钟可从给定IP接受的连接数。(每个源 IP 每分钟最大请求次数)
可以指定 nginx.ingress.kubernetes.io/limit-whitelist 设置从速率限制中排除的客户端IP源范围,该值也是逗号分隔的CIDR列表。
如果在单个Ingress规则中设置了多个注释 limit-rpm,则 limit-rps 优先。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: my-ingress
annotations:
nginx.ingress.kubernetes.io/limit-rate-after: 500k
nginx.ingress.kubernetes.io/limit-rate: 50k
nginx.ingress.kubernetes.io/limit-connections: "3"
nginx.ingress.kubernetes.io/limit-rps: "1"
nginx.ingress.kubernetes.io/limit-rpm: "3"
nginx.ingress.kubernetes.io/limit-whitelist: "192.168.7.0/24"
spec:
rules:
- host: my.test.com
http:
paths:
- path: /
backend:
serviceName: nginx
servicePort: 80
解释一下:
首先设置了初始字节量是500k
然后初始字节量用完之后,限制用户传输速率是50k/s
随后并发连接设置为3,那么客户端如果同时打开3个连接,总速率是 50k×3=150k/s
第四步进一步设置了每秒最大请求次数是1,下面又设置每分钟最大请求次数是3。
第五步设置了 192.168.7.0/24 这段不受限速的影响
设置好以后压测试一下:
超限返回的代码是503
wrk -c 3 -t 3 -d 10 http://m.test.com --latency
curl -v -H "Host: m.test.com" http://m.test.com
< HTTP/1.1 503 Service Temporarily Unavailable
< Date: Wed, 28 Jul 2021 04:32:03 GMT
< Content-Type: text/html
< Content-Length: 190
< Connection: keep-alive
HTTP/1.1 503 Service Temporarily Unavailable
Recommend
-
43
由于 nginx 的优秀性能表现,所以很多企业在Kubernetes 中选择 Ingress Controller 的时候依然会选择基于 nginx 的 ingress-nginx ,前面文章中我们更多的是介绍更加云原生配...
-
33
-
15
kubernetes-learn/chapter5/ingress-nginx at book-learn · JasonkayZK/kubernetes-learn · GitHub This branch is 7 commits ahead, 2 commits behind main.
-
16
Deploy Nginx Ingress Controller on Kubernetes using Helm ChartSearch ComputingForGeeksThe standard way of ex...
-
5
// Tutorial //How to Set Up an Nginx Ingress with Cert-Manager on DigitalOcean KubernetesPublished on December 14, 2018 · Updated on March 11, 2022By
-
5
理解Kubernetes中的Nginx Ingress-51CTO.COM 理解Kubernetes中的Nginx Ingress 作者:徐福工程师 2022-03-15 08:36:34 文章对Nginx Ingress做了介绍,Kubernetes中可以选择的Ingress有很多,读者...
-
8
最近发现好多人问 Ingress,同时一直也没去用 Nginx 的 Ingress,索性鼓捣了一把,发现跟原来确实有了点变化,在这里写篇文章记录一下一、Ingress 介绍Kubernetes 暴露服务的方式目前只有三种:LoadBlancer Service、...
-
12
在Kubernetes集群中使用 HTTPS 协议,需要一个证书管理器、一个证书自动签发服务,主要通过 Ingress 来发布 H...
-
4
k8s~ingress设置文件传输大小限制 默认情况下,ingress(ng...
-
7
Kubernetes cluster on AWS EKS, Part 3: Setup NGINX Ingress Controller with Cert-Manager on AWS EKS Mar 21, 2023 •
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK