码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • kube-apiserver限流机制原理


    合集 - 开发与运维(62)
    1.面试官:你能简单聊聊MyBatis执行流程02-022.一文详解应用安全防护ESAPI02-043.一个线程,从“生”到“死”经历的过程02-054.KubeEdge v1.16.0 版本发布!10项新增特性02-055.解密JavaChassis3:易扩展的多种注册中心支持02-066.解析Sermant热插拔能力:服务运行时动态挂载JavaAgent和插件02-087.想设计一个高并发的消息中间件前,先熟悉一下这些知识点02-178.华为云GES助力九洲平台:探索确定性运维的新实践02-179.0-overlay和underlay,这两种容器网络你分得清吗02-1810.教你用Rust实现Smpp协议02-1811.基于OpenTelemetry实现Java微服务调用链跟踪02-1912.揭开华为云ADN提高网络质量的秘密02-1913.详解网络知识:iptables规则02-1914.实例详解在Go中构建流数据pipeline02-2115.面试官让我讲讲MySQL三大核心日志实现原理02-2116.华为云帕鲁服务器-云耀云容器版,到底强在哪?02-2217.掌握云容器网络:何为ipvs02-2218.一文带你了解容器探针02-2319.教你如何判断Java代码中异步操作是否完成02-2620.深入解析Python并发编程的多线程和异步编程02-2721.教你如何用Keepalived和HAproxy配置高可用 Kubernetes 集群02-2822.容器化环境中,JVM最佳参数配置实践02-2923.关于Python中math 和 decimal 模块的解析与实践02-2924.运维一款月变更70+次的服务,是一种什么体验?03-0125.详解Python中sys模块的功能与应用03-0426.教你用Ubuntu快速搭建饥荒服务器03-0427.分享一个能让你的研发效率提升超过20%的工具03-0628.下一代积木式智能组装编排,集成开发效率10倍提升03-0629.如何基于容器网络流量指标进行弹性伸缩03-0630.Sermant运行流程学习笔记,速来抄作业03-0631.用几张图实战讲解MySQL主从复制03-0732.速存,详细罗列香橙派AIpro外设接口样例大全(附源码)03-0733.CCE集群VPC网络模式下几种访问场景03-1134.聊聊CWE 4.14 与 ISA/IEC 62443中,如何保障工业软件的安全性03-1235.20个Python random模块的代码示例03-1336.Java获取堆栈信息的3种方法03-1337.Prometheus多集群监控的3种方案,你选哪种?03-1438.手把手的使用Toolkit插件在诗情画意中完成AI诗朗诵03-1439.从基础到代码实战,带你进阶正则表达式的全方位应用03-1440.掌握Python库的Bokeh,就能让你的交互炫目可视化03-1541.从0带你设计与实现基于STM32的智慧农业管理系统03-1542.Python实践:基于Matplotlib实现某产品全年销量数据可视化03-1843.何为代码检查服务的门禁级检查03-1944.深入分析Java中的PriorityQueue底层实现与源码03-1945.如何在Docker容器启动时自动运行脚本03-2046.从静态到动态化,Python数据可视化中的Matplotlib和Seaborn03-2547.无人不识又无人不迷糊的this03-2648.保姆级教程:教你UniMRCP对接华为云ASR(Linux版)03-2649.华为云亮相KubeCon EU 2024,以持续开源创新开启智能时代03-2650.如何用Flask中的Blueprints构建大型Web应用03-2751.手把手带你用香橙派AIpro开发AI推理应用03-2752.保护主机安全,我来buff加成03-2853.探索华为云CCE敏捷版金融级高可用方案实践案例03-2854.Python数据库编程全指南SQLite和MySQL实践03-2855.标准库unsafe:带你突破golang中的类型限制03-2956.【重磅干货】大模型时代,开发者云上成长指南03-2957.探索Django REST框架构建强大的API03-2958.实例演示如何使用CCE XGPU虚拟化04-0159.浅谈JVM整体架构与调优参数04-0260.Redis开源协议调整,我们怎么办?04-0261.一文教你实战构建消息通知系统Django04-02
    62.kube-apiserver限流机制原理04-07
    收起

    本文分享自华为云社区《kube-apiserver限流机制原理》,作者:可以交个朋友。

    背景

    apiserver是kubernetes中最重要的组件,一旦遇到恶意刷接口或请求量超过承载范围,apiserver服务可能会崩溃,导致整个kubernetes集群不可用。所以我们需要对apiserver做限流处理来提升kubernetes的健壮性。

    k8s-apiserver限流能力发展过程

    apiserver限流能力的发展分为两个阶段:

    kubernetes 1.18版本之前kube-apiserver只是将请求分成了变更类型(create、update、delete、patch)和非变更类型(get、list、watch),并通过启动参数设置了两种类型的最大并发数。
    --max-requests-inflight          ## 限制同时运行的非变更类型请求的个数上限,0表示无限制。 
    --max-mutating-requests-inflight   ## 限制同时运行的变更类型请求的个数上限。0 表示无限制。

    此时的apiserver限流能力较弱,若某个客户端错误的向kube-apiserver发起大量的请求时,必然会阻塞kube-apiserver,影响其他客户端的请求,因此高阶的限流APF就诞生了。

    kubernetes1.18版本之后APF( APIPriorityAndFairness )成为kubernetes的默认限流方式。 APF以更细粒度的方式对请求进行分类和隔离,根据优先级和公平性进行处理。
    --enable-priority-and-fairness   ##  该值作为APF特性开关,默认为true 
    --max-requests-inflight、--max-mutating-requests-inflight    ## 当开启APF时,俩值相加确定kube-apiserver的总并发上限

    两个阶段限流能力对比

    限流能力1.18版本前1.18版本后(APF)
    颗粒度 仅根据是否变更做分类 可以根据请求对象、请求者身份、命名空间等做分类
    隔离性 一个坏用户可能堵塞整个系统 为请求分配固定队列,坏请求只能撑爆其使用的队列
    公平性 会出现饿死 用公平性算法从队列中取出请求
    优先级 无 有特权级别,可让重要请求不被限制

    APF关键资源介绍

    APF通过FlowSchema 和 PriorityLevelConfiguration两个资源配置限流策略。

    FlowSchema:解决老版本分类颗粒度粗的问题。根据rules字段匹配请求,匹配规则包含:请求对象、执行操作、请求者身份和命名空间
    复制代码
    apiVersion: flowcontrol.apiserver.k8s.io/v1beta2 
    kind: FlowSchema                 # 一个kubernetes集群中可以定义多个FlowSchema 
    metadata: 
      name: myfl 
    spec: 
      distinguisherMethod:           # 可选值为:ByNamespace或ByUser,用于把请求分组。属于同组的请求会分配到固定的queue中,如果省略该参数,则该FlowSchema匹配的所有请求都将视为同一个分组。
        type: ByUser 
      matchingPrecedence: 90         # 数字越小代表FlowSchema的匹配顺序越在前,取值范围:1~10000。 
      priorityLevelConfiguration:    # FlowSchema关联的priorityLevelConfiguration 
        name: mypl 
      rules:
      - nonResourceRules:            # 匹配非资源型:匹配接口URL 
        - nonResourceURLs: 
          - '*' 
        resourceRules:               # 匹配资源型:匹配apigroup、namespace、resources、verbs 
        - apiGroups: 
          - '*' 
          namespaces: 
          - '*' 
          resources: 
          - '*' 
          verbs: 
          - get 
          - create 
          - list 
          - update 
        subjects:                   # 匹配请求者主体:可选Group、User、ServiceAccount 
        - group: 
            name: '*' 
          kind: Group 
        - kind: User 
          user: 
            name: '*' 
        - kind: ServiceAccount 
          serviceAccount: 
            name: myserviceaccount 
            namespace: demo 
    复制代码
    PriorityLevelConfiguration:解决老版本隔离性差的问题和优先级问题,并定义了限流细节(总队列数、队列长度、是否可排队)。当请求与某个FlowSchema匹配后,该请求会关联FlowSchema中指定的PriorityLevelConfiguration资源,每个PriorityLevelConfiguration相互隔离,且能承受的并发请求数也不一样
    复制代码
    apiVersion: flowcontrol.apiserver.k8s.io/v1beta2 
    kind: PriorityLevelConfiguration          ## 每个PriorityLevelConfiguration有自己独立的限流配置, PriorityLevelConfiguration之间是完全隔离的。 
    metadata: 
      name: mypl 
    spec: 
      type: Limited                           # 设置是否为特权级别,如果为Exempt则不进行限流,如果为Limited则进行限流 
      limited: 
        assuredConcurrencyShares: 2           # 值越大,PriorityLevelConfiguration的并发上限越高。若当前并发执行数未达到并发上限,则PL处于空闲状态。 
        limitResponse:                        # 定义如何处理当前无法被处理的请求 
          type: Queue                         # 类型,Queue或者Reject,Reject直接返回429并拒绝,Queue将请求加入队列 
          queuing: 
            handSize: 1                       # 根据ByNamespace或ByUser对请求分组,每个分组对应queues的数量, 
            queueLengthLimit: 20              # 此PriorityLevelConfiguration中每个队列的长度 
            queues: 2                         # 此PriorityLevelConfiguration中的队列数
    复制代码

    一个FlowSchema只能关联一个priorityLevelConfiguration,多个FlowSchema可以关联同一个priorityLevelConfiguration

    PriorityLevelConfiguration并发上限 = assuredConcurrencyShares / 所有assuredConcurrencyShares之和 * apiserver总并发数

    APF处理过程

    image.png

    请求与集群中的FlowSchema列表按照顺序依次匹配,每个FlowSchema的matchingPrecedence字段决定其在列表中的顺序,matchingPrecedence字段值越小,越靠前,越先进行匹配请求。

    根据FlowSchema资源中的rules规则进行匹配,匹配方式可以是 “请求的资源类型”、“请求的动作类型”、“请求者的身份”、“请求的命名空间” 等多个维度。

    若请求与某个FlowSchema成功匹配,匹配就会结束。FlowSchema关联着一个PriorityLevelConfiguration,每个PriorityLevelConfiguration中包含许多queue,根据FlowSchema.spec.Distinguisher字段将请求进行"分组",根据分组来分配queue,分配queue数量由PriorityLevelConfiguration资源的handSize字段决定,如果省略该参数,则该FlowSchema匹配的所有请求都将视为同一个"分组"。

    每个PriorityLevelConfiguration资源都有独立的并发上限,assuredConcurrencyShares字段为apiserver总并发数的权重占比,值越大分配的并发上限就越高,当PriorityLevelConfiguration达到并发上限后,请求会根据所属的"分组"写入固定的queue中,请求被阻塞等待。请求与queue的固定关联可以让恶意用户只影响其使用的queue,而不会影响同PriorityLevelConfiguration中的其他queue。

    当PriorityLevelConfiguration未达到并发上限时,fair queuing算法从所有queue中选择一个合适的queue取出请求,解除请求的阻塞,执行这个请求。fair queuing算法能保证同一个 PriorityLevelConfiguration 中的所有queue被处理机会平等。

    APF实战

    kubernetes原生自带了一些FlowSchema和PriorityLevelConfiguration规则,我们选择一个查看,如下图:

    image.png

    下面我们创建新的APF规则:当请求对象是apf命名空间中的deployment,则进行"apfpl"限流规则。

    复制代码
    apiVersion: flowcontrol.apiserver.k8s.io/v1beta2 
    kind: FlowSchema 
    metadata: 
      name: apffl 
    spec: 
      matchingPrecedence:  150 
      priorityLevelConfiguration: 
        name: apfpl                           ## 关联名为apfpl的PriorityLevelConfiguration 
      rules: 
        - resourceRules: 
          - apiGroups: 
              - apps 
            clusterScope: true 
            namespaces: 
              - apf                           ## 匹配apf命名空间 
            resources: 
              - deployments                   ## 匹配操作deployment的请求 
            verbs: 
              - '*'                           ## 匹配任意操作类型 
          subjects: 
            - kind: Group 
              group: 
                name: '*'                     ## 匹配任意组身份  
    --- 
    apiVersion: flowcontrol.apiserver.k8s.io/v1beta2 
    kind: PriorityLevelConfiguration 
    metadata: 
      name: apfpl 
    spec: 
      limited: 
        assuredConcurrencyShares: 2             
        limitResponse:                         ## 设置限流处理细节 
          queuing: 
            handSize: 1  
            queueLengthLimit: 20                 
            queues: 2  
          type: Queue 
      type: Limited                             ## 对请求做限流处理
    复制代码

    接着在apf命名空间和default命名空间分别创建deployment进行测试。apf_fs为请求被分类到的 FlowSchema 的名称,apf_pl为该请求的优先级名称。查看apiserver日志信息,见下图:

    image.png

    循环操作deployment,我们可以使用命令查看是否触发限流等待

    kubectl get --raw /debug/api_priority_and_fairness/dump_priority_levels

    image.png
    返回waitingRequests非0,则代表触发最大并发数,有请求被限流进入等待队列。PriorityLevelConfiguration资源不为空闲表示已达到并发上限

     

    点击关注,第一时间了解华为云新鲜技术~

     

  • 相关阅读:
    Mysql8与mariadb的安装与常用设置
    nas连接萤石云摄像机CTQ6X
    从win11切换到ubuntu20的第1天
    数据结构之堆的结构与实现
    vim命令编辑完文件后,按ESC键退出编辑模式,无法进入命令模式解决方案
    buu(rce命令执行)
    弗洛伊德算法(C++)
    菜刀,蚁剑,冰蝎,哥斯拉的流量特征
    【开发工具】idea 的全局搜索快捷键(Ctrl+shift+F)失效
    检测selenium下载文件
  • 原文地址:https://www.cnblogs.com/huaweiyun/p/18118488
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号