DevOps в серии буткемпов K8s

Обратите внимание, полная ментальная карта DevOps в K8s доступна по адресу: «DevOps в ментальной карте K8s»

Цепочка обработчиков запросов сервера API

Ниже представлена ​​схема цепочки обработчиков сервера API:

В этой статье мы сосредоточимся на «управлении потоком запросов».

Общее формирование трафика и управление потоком

Дырявое ведро

Алгоритм дырявого ведра — широко используемый алгоритм в компьютерных сетях для формирования трафика и управления потоком. Он используется для управления скоростью, с которой данные передаются из одной точки в другую.

Алгоритм работает, обрабатывая данные, как если бы это была вода (пакеты данных), текущая в ведро (буфер или очередь). Ведро имеет определенную вместимость, и если поток воды превышает вместимость ведра, лишняя вода переливается через край и теряется.

Ведро имеет течь, из-за чего вода медленно вытекает из ведра с постоянной скоростью. Скорость, с которой вода поступает в ведро, контролируется алгоритмом, чтобы гарантировать, что она не превышает вместимость ведра, а также обеспечить максимально постоянную скорость потока.

Ведро жетонов

Алгоритм Token Bucket — еще один широко используемый алгоритм. Он используется для управления скоростью, с которой данные передаются из одной точки в другую.

Алгоритм работает, обрабатывая данные, как если бы они были токенами в ведре. Ведро имеет определенную емкость, и с постоянной скоростью в него добавляется определенное количество токенов.

Каждый токен представляет собой единицу данных, которые могут быть переданы. Когда пакет данных готов к передаче, он должен сначала получить маркер из корзины. Если в корзине нет доступных маркеров, пакет данных удерживается в очереди до тех пор, пока маркер не станет доступным.

K8s Api-сервер управления потоком

kube-apiserver — это точка входа для внешних операций с ресурсами кластера. В качестве полной реализации компонента на основе API, чтобы обеспечить бесперебойную работу компонента API, функция регулирования, естественно, необходима.

В K8s Api-сервере есть три параметра управления потоком:

максимальное количество запросов в полете

Когда флаг --enable-priority-and-fairness установлен в значение true, максимальное количество запросов только для чтения и запросов на изменение, которые могут быть обработаны одновременно, определяется путем суммирования значений флагов --max-requests-inflight и --max-mutating-requests-inflight соответственно. Сумма должна быть положительным значением.

Если для флага --enable-priority-and-fairness установлено значение false, то флаг --max-requests-inflight ограничивает максимальное количество неизменяемых запросов, которые могут обрабатываться одновременно. Нулевое значение для --max-requests-inflight полностью отключает ограничение.

Значение по умолчанию --max-requests-inflight равно 400.

max-mutating-requests-inflight

Подобно параметру --max-requests-inflight, он управляет максимальным количеством запросов на изменение, когда --enable-priority-and-fairness равно true. Значение по умолчанию — 200.

enable-priority-and-fairness (Приоритет и справедливость API/APF)

Это параметр конфигурации API-сервера K8s, который позволяет серверу определять приоритеты определенных типов запросов и обеспечивать справедливое распределение ресурсов между всеми клиентами.

Когда для --enable-priority-and-fairness установлено значение true, сервер API реализует схему приоритизации, которая назначает уровень приоритета каждому запросу в зависимости от его типа и происхождения.

Мутирующие запросы, которые изменяют состояние системы, имеют более высокий приоритет, чем обычные запросы, которые только считывают данные из системы. Кроме того, запросы от клиентов с более низкой задержкой подключения имеют более высокий приоритет, чем запросы от клиентов с более высокой задержкой подключения.

Сервер API также использует алгоритм справедливости, чтобы гарантировать, что все клиенты получают справедливую долю ресурсов сервера. Если один клиент отправляет большое количество запросов, сервер начнет замедлять время ответа на запросы этого клиента, сохраняя при этом свою реакцию на другие клиенты.

Преимущества АПФ

  • APF классифицирует и изолирует запросы более детально.
  • APF вводит механизм очередей с ограниченным пространством, поэтому при очень коротких всплесках трафика сервер API не будет отклонять запросы.
  • Запросы распределяются из очереди через справедливую организацию очереди, поэтому плохо работающий контроллер не приведет к голоданию других контроллеров.

Реализация АПФ

Это зависит от двух ресурсов

  • PriorityLevelConfigurations, определяющие политики ограничения и емкость очереди.
  • FlowSchemas, которые классифицируют запросы и могут указывать пользователей или группы пользователей, соответствующие конфигурации PriorityLevelConfiguration.

Вы можете использовать команду kubectl для проверки фактической конфигурации:

Конфигурации уровня приоритета

$ kubectl get PriorityLevelConfiguration workload-high -oyaml
apiVersion: flowcontrol.apiserver.k8s.io/v1beta2
kind: PriorityLevelConfiguration
metadata:
  annotations:
    apf.kubernetes.io/autoupdate-spec: "true"
  creationTimestamp: "2023-04-06T19:08:45Z"
  generation: 1
  name: workload-high
  resourceVersion: "31"
  uid: 2fd5ded2-c172-4645-b3dc-a754819ca3c2
spec:
  limited:
    assuredConcurrencyShares: 40
    limitResponse:
      queuing:
        handSize: 6
        queueLengthLimit: 50
        queues: 128
      type: Queue
  type: Limited
status: {}

Схемы потоков

$ kubectl get flowschemas.flowcontrol.apiserver.k8s.io kube-controller-manager -oyaml
apiVersion: flowcontrol.apiserver.k8s.io/v1beta2
kind: FlowSchema
metadata:
  annotations:
    apf.kubernetes.io/autoupdate-spec: "true"
  creationTimestamp: "2023-04-06T19:08:45Z"
  generation: 1
  name: kube-controller-manager
  resourceVersion: "58"
  uid: 50cc6dbb-f2fe-4676-b76b-7b43d0b93301
spec:
  distinguisherMethod:
    type: ByNamespace
  matchingPrecedence: 800
  priorityLevelConfiguration:
    name: workload-high
  rules:
  - nonResourceRules:
    - nonResourceURLs:
      - '*'
      verbs:
      - '*'
    resourceRules:
    - apiGroups:
      - '*'
      clusterScope: true
      namespaces:
      - '*'
      resources:
      - '*'
      verbs:
      - '*'
    subjects:
    - kind: User
      user:
        name: system:kube-controller-manager
status:
  conditions:
  - lastTransitionTime: "2023-04-06T19:08:45Z"
    message: This FlowSchema references the PriorityLevelConfiguration object named
      "workload-high" and it exists
    reason: Found
    status: "False"
    type: Dangling

Заключение