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