k8s~ingress限(xian)流機(ji)制
Ingress限流
限速的注解定義了對連接和傳輸速率的限制。這些可以用來減輕DDoS攻擊。它采用了 “漏斗” 算法實現限制。

主要參數
-
nginx.ingress.kubernetes.io/limit-connections
單個IP地址允許的并(bing)發連接(jie)數。超出此(ci)限制時(shi),將返(fan)回503錯(cuo)誤(wu)。 -
nginx.ingress.kubernetes.io/limit-rps
每秒(miao)從給(gei)定IP接(jie)受(shou)的(de)請求(qiu)數。突發限制設置為此(ci)限制乘以突發乘數,默認乘數為5。當客戶端超過此(ci)限制時,將 返(fan)回limit-req-status-code默認值: 503,如(ru)果修改其(qi)它(ta)響應碼,需要重(zhong)寫nginx.ingress.kubernetes.io/configuration-snippet配置,如(ru)下
annotations:
kubernetes.io/ingress.class: nginxnginx.ingress.kubernetes.io/limit-burst-multiplier: "3"
nginx.ingress.kubernetes.io/limit-rpm: "1"
nginx.ingress.kubernetes.io/configuration-snippet: |
limit_req_status 429;
rancher中的顯示

-
nginx.ingress.kubernetes.io/limit-rpm:每分鐘從給定IP接受的請求數(shu)。突(tu)發限制設(she)置為(wei)此(ci)限制乘以突(tu)發乘數(shu),默認乘數(shu)為(wei)5。當客戶端超過(guo)此(ci)限制時,將(jiang) 返回(hui)limit-req-status-code默認值: 503。
-
nginx.ingress.kubernetes.io/limit-burst-multiplier:
突發大小(xiao)限(xian)制(zhi)速率的(de)倍數(shu)。默認(ren)的(de)脈沖串(chuan)乘(cheng)數(shu)為5,此(ci)注釋(shi)將覆(fu)蓋默認(ren)的(de)乘(cheng)數(shu)。當客戶端超過此(ci)限(xian)制(zhi)時,將 返(fan)回limit-req-status-code默認(ren)值: 503。 -
nginx.ingress.kubernetes.io/limit-rate-after:最初(chu)的(de)(de)(de)千字節數,在此(ci)之(zhi)后,對給定連接的(de)(de)(de)響應(ying)的(de)(de)(de)進一步傳(chuan)輸將(jiang)受到速率的(de)(de)(de)限制。必須在啟(qi)用代理(li)緩沖的(de)(de)(de)情況下(xia)使用此(ci)功能。
-
nginx.ingress.kubernetes.io/limit-rate:每秒允(yun)許(xu)發送(song)到給定連接的千字節數(shu)。零值禁(jin)用速率限制(zhi)。必(bi)須在啟用代理(li)緩沖的情況下使用此功能(neng)。
-
nginx.ingress.kubernetes.io/limit-whitelist:客戶端IP源(yuan)范圍要從速率限制中排除。該值是(shi)逗(dou)號(hao)分隔(ge)的CIDR列表。
解析
nginx的限流是一個隊列模型。所以限流連接數為 隊列長度+隊列處理能力。
對應下(xia)面的配(pei)置即(ji),rate為隊(dui)列處理能(neng)力。burst為隊(dui)列長度。
ingress配置
ingress控(kong)制(zhi)器會把注解修改成如下nginx配(pei)置,此例子之修改了limit-rps=5或者(zhe)limit-rpm=300,limit-burst-multiplier(放大系數)為默認值(zhi)5。
?實例
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-example-host
annotations:
# 每個 IP 每秒可以訪問 5 次
nginx.ingress.kubernetes.io/limit-rps: 5
# 為計算限速漏桶算法的 burst size,和 limit-rps 的相乘系數
nginx.ingress.kubernetes.io/limit-burst-multiplier: 5
# 配合 limit-window 表示全局限速 100 次每秒(需要依賴 memcached)
nginx.ingress.kubernetes.io/global-rate-limit: 100
nginx.ingress.kubernetes.io/global-rate-limit-window: 1s
# 限制發送給后端服務的發送速率為 1MB 每秒
nginx.ingress.kubernetes.io/limit-rate: 1024
# 發送給后端服務的前 10MB 數據不進行限速
nginx.ingress.kubernetes.io/limit-rate-after: 10240
# 超出后的響應碼
nginx.ingress.kubernetes.io/configuration-snippet: |
limit_req_status 429;
spec:
rules:
- host: "www.test.com"
http:
paths:
- path: "/"
backend:
service:
name: test
port:
number: 80