diff --git a/content/zh-cn/docs/concepts/cluster-administration/flow-control.md b/content/zh-cn/docs/concepts/cluster-administration/flow-control.md index 593de6bfae..b374eb8c8b 100644 --- a/content/zh-cn/docs/concepts/cluster-administration/flow-control.md +++ b/content/zh-cn/docs/concepts/cluster-administration/flow-control.md @@ -831,7 +831,7 @@ that originate from outside your cluster. 则可以配置规则,阻止所有来自集群外部的健康检查请求。 {{< /caution >}} -{{% code file="priority-and-fairness/health-for-strangers.yaml" %}} +{{% code_sample file="priority-and-fairness/health-for-strangers.yaml" %}} +## 使用 API 优先级和公平性的最佳实践 {#good-practices-for-using-api-priority-and-fairness} + +当某个给定的优先级级别超过其所被允许的并发数时,请求可能会遇到延迟增加, +或以错误 HTTP 429 (Too Many Requests) 的形式被拒绝。 +为了避免这些 APF 的副作用,你可以修改你的工作负载或调整你的 APF 设置,确保有足够的席位来处理请求。 + + +要检测请求是否由于 APF 而被拒绝,可以检查以下指标: + +- apiserver_flowcontrol_rejected_requests_total: + 每个 FlowSchema 和 PriorityLevelConfiguration 拒绝的请求总数。 +- apiserver_flowcontrol_current_inqueue_requests: + 每个 FlowSchema 和 PriorityLevelConfiguration 中排队的当前请求数。 +- apiserver_flowcontrol_request_wait_duration_seconds:请求在队列中等待的延迟时间。 +- apiserver_flowcontrol_priority_level_seat_utilization: + 每个 PriorityLevelConfiguration 的席位利用率。 + + +### 工作负载修改 {#good-practice-workload-modifications} + +为了避免由于 APF 导致请求排队、延迟增加或被拒绝,你可以通过以下方式优化请求: + + +- 减少请求执行的速率。在固定时间段内减少请求数量将导致在某一给定时间点需要的席位数更少。 + + +- 避免同时发出大量消耗较多席位的请求。请求可以被优化为使用更少的席位或降低延迟, + 使这些请求占用席位的时间变短。列表请求根据请求期间获取的对象数量可能会占用多个席位。 + 例如通过使用分页等方式限制列表请求中取回的对象数量,可以在更短时间内使用更少的总席位数。 + 此外,将列表请求替换为监视请求将需要更低的总并发份额,因为监视请求仅在初始的通知突发阶段占用 1 个席位。 + 如果在 1.27 及更高版本中使用流式列表,因为集合的整个状态必须以流式传输, + 所以监视请求在其初始的通知突发阶段将占用与列表请求相同数量的席位。 + 请注意,在这两种情况下,监视请求在此初始阶段之后将不再保留任何席位。 + + +请注意,由于请求数量增加或现有请求的延迟增加,APF 可能会导致请求排队或被拒绝。 +例如,如果通常需要 1 秒执行的请求开始需要 60 秒,由于延迟增加, +请求所占用的席位时间可能超过了正常情况下的时长,APF 将开始拒绝请求。 +如果在没有工作负载显著变化的情况下,APF 开始在多个优先级级别上拒绝请求, +则可能存在控制平面性能的潜在问题,而不是工作负载或 APF 设置的问题。 + + +### 优先级和公平性设置 {#good-practice-apf-settings} + +你还可以修改默认的 FlowSchema 和 PriorityLevelConfiguration 对象, +或创建新的对象来更好地容纳你的工作负载。 + +APF 设置可以被修改以实现下述目标: + +- 给予高优先级请求更多的席位。 +- 隔离那些非必要或开销大的请求,因为如果与其他流共享,这些请求可能会耗尽所有并发级别。 + + +#### 给予高优先级请求更多的席位 + + +1. 如果有可能,你可以通过提高 `max-requests-inflight` 和 `max-mutating-requests-inflight` + 参数的值为特定 `kube-apiserver` 提高所有优先级级别均可用的席位数量。另外, + 如果在请求的负载均衡足够好的情况下,水平扩缩 `kube-apiserver` 实例的数量将提高集群中每个优先级级别的总并发数。 + + +2. 你可以创建一个新的 FlowSchema,在其中引用并发级别更高的 PriorityLevelConfiguration。 + 这个新的 PriorityLevelConfiguration 可以是现有的级别,也可以是具有自己一组额定并发份额的新级别。 + 例如,你可以引入一个新的 FlowSchema 来将请求的 PriorityLevelConfiguration + 从全局默认值更改为工作负载较低的级别,以增加用户可用的席位数。 + 创建一个新的 PriorityLevelConfiguration 将减少为现有级别指定的席位数。 + 请注意,编辑默认的 FlowSchema 或 PriorityLevelConfiguration 需要将 + `apf.kubernetes.io/autoupdate-spec` 注解设置为 false。 + + +3. 你还可以为服务于高优先级请求的 PriorityLevelConfiguration 提高 NominalConcurrencyShares。 + 此外在 1.26 及更高版本中,你可以为有竞争的优先级级别提高 LendablePercent,以便给定优先级级别可以借用更多的席位。 + + +#### 隔离非关键请求以免饿死其他流 + +为了进行请求隔离,你可以创建一个 FlowSchema,使其主体与发起这些请求的用户匹配, +或者创建一个与请求内容匹配(对应 resourceRules)的 FlowSchema。 +接下来,你可以将该 FlowSchema 映射到一个具有较低席位份额的 PriorityLevelConfiguration。 + + +例如,假设来自 default 名字空间中运行的 Pod 的每个事件列表请求使用 10 个席位,并且执行时间为 1 分钟。 +为了防止这些开销大的请求影响使用现有服务账号 FlowSchema 的其他 Pod 的请求,你可以应用以下 +FlowSchema 将这些列表调用与其他请求隔离开来。 + +用于隔离列表事件请求的 FlowSchema 对象示例: + +{{% code_sample file="priority-and-fairness/list-events-default-service-account.yaml" %}} + + +- 这个 FlowSchema 用于抓取 default 名字空间中默认服务账号所发起的所有事件列表调用。 + 匹配优先级为 8000,低于现有服务账号 FlowSchema 所用的 9000,因此这些列表事件调用将匹配到 + list-events-default-service-account 而不是服务账号。 +- 通用 PriorityLevelConfiguration 用于隔离这些请求。通用优先级级别具有非常小的并发份额,并且不对请求进行排队。 + ## {{% heading "whatsnext" %}}