← Назад к вопросам

Как работает Rate limiting в Kubernetes?

2.0 Middle🔥 172 комментариев
#Контейнеризация и DevOps#Производительность и оптимизация

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как работает Rate Limiting в Kubernetes

Rate Limiting (ограничение скорости запросов) в Kubernetes — это критически важный механизм защиты компонентов кластера от перегрузки и обеспечения стабильности системы. Он реализован на нескольких уровнях архитектуры и служит для контроля частоты запросов к API-серверу, предотвращения исчерпания ресурсов и защиты от DDoS-атак.

Основные механизмы Rate Limiting

1. Client-Side Rate Limiting (kubectl, клиентские библиотеки)

Клиентские инструменты, такие как kubectl и клиентские библиотеки Go, имеют встроенные ограничители запросов:

// Пример конфигурации клиента Go с rate limiting
import (
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/tools/clientcmd"
    "k8s.io/client-go/util/flowcontrol"
)

func createClient() {
    config, _ := clientcmd.BuildConfigFromFlags("", "/path/to/kubeconfig")
    
    // Настройка rate limiter
    config.RateLimiter = flowcontrol.NewTokenBucketRateLimiter(5.0, 10)
    // 5 запросов в секунду, с burst до 10 запросов
    
    clientset, _ := kubernetes.NewForConfig(config)
}

2. API Server Rate Limitting

API-сервер Kubernetes использует несколько уровней ограничений:

Max-in-flight ограничения

Ограничивают одновременное количество запросов:

# Конфигурация kube-apiserver
--max-requests-inflight=400
--max-mutating-requests-inflight=200
  • 400 чтений и 200 мутирующих операций одновременно
  • При превышении — HTTP статус 429 (Too Many Requests)

Flow Control API (Priority and Fairness)

Введён в Kubernetes 1.18 для более тонкого контроля:

apiVersion: flowcontrol.apiserver.k8s.io/v1beta2
kind: FlowSchema
metadata:
  name: kube-controller-manager
spec:
  matchingPrecedence: 800
  priorityLevelConfiguration:
    name: workload-high
  rules:
  - resourceRules:
    - apiGroups: [""]
      resources: ["secrets", "configmaps"]
      verbs: ["create", "update", "patch", "delete"]
---
apiVersion: flowcontrol.apiserver.k8s.io/v1beta2
kind: PriorityLevelConfiguration
metadata:
  name: workload-high
spec:
  type: Limited
  limited:
    assuredConcurrencyShares: 100
    limitResponse:
      type: Queue
      queuing:
        queues: 128
        queueLengthLimit: 50
        handSize: 6

Ключевые компоненты Flow Control:

  • FlowSchema — классифицирует запросы по источникам
  • PriorityLevelConfiguration — определяет приоритет и лимиты
  • Assured Concurrency Shares — гарантированная доля пропускной способности
  • Queues — механизм очередей для обработки всплесков трафика

3. Webhook Rate Limiting

Для вебхуков аутентификации, авторизации и admission control:

# Конфигурация kube-apiserver для вебхуков
--authentication-token-webhook-cache-ttl=2m
--authorization-webhook-cache-authorized-ttl=5m
--authorization-webhook-cache-unauthorized-ttl=30s

Практическая реализация

Мониторинг и диагностика

# Проверка текущих ограничений
kubectl get --raw /metrics | grep apiserver_flowcontrol

# Отладка Flow Schema
kubectl get flowschemas.flowcontrol.apiserver.k8s.io
kubectl get prioritylevelconfigurations.flowcontrol.apiserver.k8s.io

Настройка для собственных приложений

apiVersion: flowcontrol.apiserver.k8s.io/v1beta2
kind: FlowSchema
metadata:
  name: my-app
spec:
  matchingPrecedence: 900
  priorityLevelConfiguration:
    name: global-default
  distinguisherMethod:
    type: ByUser
  rules:
  - subjects:
    - kind: ServiceAccount
      serviceAccount:
        name: my-app-serviceaccount
        namespace: production
    resourceRules:
    - apiGroups: ["apps"]
      resources: ["deployments", "statefulsets"]
      verbs: ["get", "list", "watch", "create", "update"]

Важные особенности и лучшие практики

Типы ограничений:

  1. Жёсткие лимиты — немедленный отказ при превышении
  2. Очереди запросов — буферизация с отложенной обработкой
  3. Token Bucket алгоритм — позволяет временные всплески (burst)

Рекомендации по настройке:

  • Начинайте с лимитов по умолчанию
  • Мониторьте метрики apiserver_flowcontrol_*
  • Разделяйте лимиты для чтения и записи
  • Настройте приоритеты для критичных компонентов (kube-controller-manager, kube-scheduler)
  • Используйте отдельные Service Accounts для разных типов workload'ов

Распространённые проблемы:

# Симптомы превышения лимитов
kubectl get pods
# Ошибка: "Too many requests" (429)
# Или: "context deadline exceeded"

# Решения:
1. Увеличить лимиты (если позволяет инфраструктура)
2. Оптимизировать клиентский код (батчинг запросов)
3. Внедрить кэширование на стороне клиента
4. Настроить правильные FlowSchema для приоритетных workload'ов

Архитектурные преимущества

Гибридная модель Kubernetes сочетает:

  • Статические лимиты для базовой защиты
  • Динамический flow control для справедливого распределения
  • Приоритизацию для системных компонентов
  • Изоляцию между пользователями и namespace'ами

Rate Limiting в Kubernetes — это не просто защита от перегрузки, а сложная система обеспечения качества обслуживания (QoS), которая балансирует между доступностью, справедливостью распределения ресурсов и защитой системных компонентов кластера. Правильная настройка этих механизмов критически важна для стабильной работы production-кластеров под нагрузкой.

Как работает Rate limiting в Kubernetes? | PrepBro