Kubernetes APIServer 限流方案
為了防止突發(fā)流量影響 apiserver 可用性,k8s 支持多種限流配置,包括:
MaxInFlightLimit,server 級(jí)別整體限流 Client 限流 EventRateLimit, 限制 event APF,更細(xì)力度的限制配置
MaxInFlightLimit
MaxInFlightLimit 限流,apiserver 默認(rèn)可設(shè)置最大并發(fā)量(集群級(jí)別,區(qū)分只讀與修改操作),通過參數(shù) --max-requests-inflight 和 --max-mutating-requests-inflight,可以簡(jiǎn)單實(shí)現(xiàn)限流。
Client 限流
例如 client-go 默認(rèn)的 qps 為5,但是只支持客戶端限流,集群管理員無法控制用戶行為。
EventRateLimit
EventRateLimit 在1.13之后支持,只限制 event 請(qǐng)求,集成在 apiserver 內(nèi)部 webhoook 中,可配置某個(gè)用戶、namespace、server 等 event 操作限制,通過 webhook 形式實(shí)現(xiàn)。
具體原理可以參考提案(https://kubernetes.io/zh/docs/reference/access-authn-authz/admission-controllers/#eventratelimit),每個(gè) eventratelimit 配置使用一個(gè)單獨(dú)的令牌桶限速器,每次event操作,遍歷每個(gè)匹配的限速器檢查是否能獲取令牌,如果可以允許請(qǐng)求,否則返回429。
優(yōu)點(diǎn)
實(shí)現(xiàn)簡(jiǎn)單,允許一定量的并發(fā) 可支持server/namespace/user等級(jí)別的限流
缺點(diǎn)
僅支持event,通過webhook實(shí)現(xiàn)只能攔截修改類請(qǐng)求 所有namespace的限流相同,沒有優(yōu)先級(jí)
API 優(yōu)先級(jí)和公平性
apiserver默認(rèn)的限流方式太過簡(jiǎn)單,一個(gè)錯(cuò)誤的客戶端發(fā)送大量請(qǐng)求可能造成其他客戶端請(qǐng)求異常,也不支持突發(fā)流量。
API 優(yōu)先級(jí)和公平性(APF)是 MaxInFlightLimit 限流的一種替代方案,設(shè)計(jì)文檔見提案。
API 優(yōu)先級(jí)和公平性(1.15以上,alpha版本), 以更細(xì)粒度(byUser,byNamespace)對(duì)請(qǐng)求進(jìn)行分類和隔離。支持突發(fā)流量,通過使用公平排隊(duì)技術(shù)從隊(duì)列中分發(fā)請(qǐng)求從而避免饑餓。
APF限流通過兩種資源,PriorityLevelConfigurations定義隔離類型和可處理的并發(fā)預(yù)算量,還可以調(diào)整排隊(duì)行為。FlowSchemas用于對(duì)每個(gè)入站請(qǐng)求進(jìn)行分類,并與一個(gè) PriorityLevelConfigurations相匹配。
可對(duì)用戶或用戶組或全局進(jìn)行某些資源某些請(qǐng)求的限制,如限制 default namespace 寫 services put/patch 請(qǐng)求。
優(yōu)點(diǎn)
考慮情況較全面,支持優(yōu)先級(jí),白名單等 可支持 server/namespace/user/resource 等細(xì)粒度級(jí)別的限流
缺點(diǎn)
配置復(fù)雜,不直觀,需要對(duì)APF原理深入了解 功能較新,缺少生產(chǎn)環(huán)境驗(yàn)證
APF 測(cè)試
開啟APF,需要在apiserver配置--feature-gates=APIPriorityAndFairness=true --runtime-config=flowcontrol.apiserver.k8s.io/v1alpha1=true
開啟后,獲取默認(rèn)的 FlowSchemas:
$ kubectl get flowschemas.flowcontrol.apiserver.k8s.io
NAME PRIORITYLEVEL MATCHINGPRECEDENCE DISTINGUISHERMETHOD AGE MISSINGPL
system-leader-election leader-election 100 ByUser 152m False
workload-leader-election leader-election 200 ByUser 152m False
system-nodes system 500 ByUser 152m False
kube-controller-manager workload-high 800 ByNamespace 152m False
kube-scheduler workload-high 800 ByNamespace 152m False
kube-system-service-accounts workload-high 900 ByNamespace 152m False
health-for-strangers exempt 1000 <none> 151m False
service-accounts workload-low 9000 ByUser 152m False
global-default global-default 9900 ByUser 152m False
catch-all catch-all 10000 ByUser 152m False
FlowShema 配置
apiVersion: flowcontrol.apiserver.k8s.io/v1alpha1
kind: FlowSchema
metadata:
name: health-for-strangers
spec:
matchingPrecedence: 1000 #匹配優(yōu)先級(jí),1~1000,越小優(yōu)先級(jí)越高
priorityLevelConfiguration: #關(guān)聯(lián)的PriorityLevelConfigurations
name: exempt #排除rules,即不限制當(dāng)前flowshema的rules
rules: #請(qǐng)求規(guī)則
- nonResourceRules: #非資源
- nonResourceURLs:
- "/healthz"
- "/livez"
- "/readyz"
verbs:
- "*"
subjects: #對(duì)應(yīng)的用戶或用戶組
- kind: Group
group:
name: system:unauthenticated
PriorityLevelConfiguration 配置
apiVersion: flowcontrol.apiserver.k8s.io/v1alpha1
kind: PriorityLevelConfiguration
metadata:
name: leader-election
spec:
limited: #限制策略
assuredConcurrencyShares: 10
limitResponse: #如何處理被限制的請(qǐng)求
queuing: #類型為Queue時(shí),列隊(duì)的設(shè)置
handSize: 4 #隊(duì)列
queueLengthLimit: 50 #隊(duì)列長(zhǎng)度
queues: 16 #隊(duì)列數(shù)
type: Queue #Queue或者Reject,Reject直接返回429,Queue將請(qǐng)求加入隊(duì)列
type: Limited #類型,Limited或Exempt, Exempt即不限制
總結(jié)
以上是k8s相關(guān)的限流策略,通過多種策略來保證集群的穩(wěn)定性。
目前 MaxInFlightLimit 可以輕松開啟,但是限制策略不精細(xì),而 APF 功能較新,實(shí)現(xiàn)較復(fù)雜,在充分驗(yàn)證后,可通過 APF 對(duì)全集群進(jìn)行限流。
原文鏈接:https://qingwave.github.io/k8s-rate-limit/
K8S 進(jìn)階訓(xùn)練營(yíng)
點(diǎn)擊屏末 | 閱讀原文 | 即刻學(xué)習(xí)
