kube-apiserver限流机制原理

这篇具有很好参考价值的文章主要介绍了kube-apiserver限流机制原理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文分享自华为云社区《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处理过程

请求与集群中的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规则,我们选择一个查看,如下图:

下面我们创建新的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日志信息,见下图:

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

kubectl get --raw /debug/api_priority_and_fairness/dump_priority_levels


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

 文章来源地址https://www.toymoban.com/news/detail-844332.html

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

 

到了这里,关于kube-apiserver限流机制原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【HBZ分享】ES的评分score机制的原理

    基础评分boost,默认2.2, 逆向文档频率值(IDF):表示该词再文档中(ES中)出现的次数越多,表示越不重要,评分越低 在文档中出现的频率(TF):表示该词在文档中出现的频率,频率越高表示越重要,评分越高 注意: IDF是出现次数越多,则评分越低, 而TF是出现次数越高,

    2024年02月13日
    浏览(27)
  • RabbitMQ中的限流、return机制、死信队列

    目录 优点 缺点 1、限流 2、return机制 3、死信队列 高可用性: RabbitMQ支持集群和镜像队列等多种方式实现高可用性,保证系统稳定运行。 可靠性强: RabbitMQ使用AMQP协议作为消息传递的标准,能够确保消息传递的可靠性和有序性。 灵活性强: RabbitMQ支持多种消息模式,包括点

    2024年02月08日
    浏览(29)
  • Kubernetes核心组件之kube-proxy实现原理

    kube-proxy,负责为Service提供集群内部的服务发现和负载均衡。 了解不同网络组件的工作原理有助于正确设计和配置它们,以满足你的应用程序需求。 在Kubernetes网络的背后,有一个在幕后工作的组件。它将你的服务(Services)转化为一些可用的网络规则。这个组件被称为 Kube

    2024年02月03日
    浏览(30)
  • 微服务 - Nginx网关 · 进程机制 · 限流熔断 · 性能优化 · 动态负载 · 高可用

    系列目录 微服务 - 概念 · 应用 · 架构 · 通讯 · 授权 · 跨域 · 限流 微服务 - Consul集群化 · 服务注册 · 健康检测 · 服务发现 · 负载均衡 微服务 - Redis缓存 · 数据结构 · 持久化 · 分布式 · 高并发 微服务 - Nginx网关 · 进程机制 · 限流熔断 · 性能优化 · 动态负载 · 高可用

    2024年02月02日
    浏览(39)
  • 深度思考rpc框架面经之五:rpc熔断限流、rpc复用连接机制

    推荐文章:RPC实现原理之核心技术-限流熔断 限流是一种常见的系统保护手段。在分布式系统和微服务架构中, 一个接口的过度使用可能会导致资源的过载,例如CPU、内存、带宽等都可能成为瓶颈。为了避免系统崩溃,确保系统的可用性,并为所有用户提供公平和合理的服务

    2024年02月11日
    浏览(28)
  • 【知识点随笔分享 | 第九篇】常见的限流算法

    目录 前言: 1.固定窗口限流:  缺点:  2.滑动窗口限流:  优点: 滴桶限流: 缺点: 令牌桶限流:  优点: 总结:           当今互联网时代,随着网络流量的快速增长和系统负载的不断加重,限流算法作为一种重要的网络管理工具变得愈发重要。限流算法通过控制系

    2024年02月04日
    浏览(34)
  • 【K8S】外部访问请求原理流程(service、kube-proxy、pod的关系)

    用户发起请求,请求传送到Ingress Ingress :作用是定义请求如何转发到service的规则,ingress支持7层代理转发,它可以通过根据不同的域名或者URL访问路径把请求流量转发到不同的service上,实现调度不同业务域、不同URL访问路径的业务流量。 Service: 提供了服务的负载均衡和反向代

    2024年01月17日
    浏览(40)
  • SpringCloud Alibaba Sentinel 与 SpringCloud Gateway 的限流有什么差别?(三种限流算法原理分析)

    目录 一、Sentinel 与 Gateway 的限流有什么差别? 1.1、前置知识 - 四种常见的限流算法 1.1.1、Tips 1.1.2、计数器算法 1)固定窗口计数器算法 2)滑动窗口计数器算法 1.1.3、令牌桶算法 1.1.4、漏桶算法 1.2、解决问题 1.1.1、Tips 限流, 就是指对服务器请求量做限制,避免因为突发的

    2024年01月25日
    浏览(36)
  • Redisson 分布式限流器 RRateLimiter 的使用及原理

    trySetRate 用于设置限流参数。其中 RateType 包含 OVERALL 和 PER_CLIENT 两个枚举常量,分别表示全局限流和单机限流。后面三个参数表明了令牌的生成速率,即每 rateInterval 生成 rate 个令牌, rateIntervalUnit 为 rateInterval 的时间单位。 acquire 和 tryAcquire 均可用于获取指定数量的令牌,不

    2024年01月20日
    浏览(39)
  • 限流算法(计数器、滑动时间窗口、漏斗、令牌)原理以及代码实现

    本文会对这4个限流算法进行详细说明,并输出实现限流算法的代码示例。 代码是按照自己的理解写的,很简单的实现了功能,还请大佬们多多交流找bug。 下面还有投票,帮忙投个票👍 什么是限流?限流 限流 就是限制流量。在高并发、高流量的场景中我们需要把限流做好,

    2023年04月17日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包