• Русский
  • Повышение стабильности Kubernetes для крупных кластеров

    Это руководство помогает операторам кластеров и SRE снизить нагрузку на control-plane, повысить надежность и ограничить радиус поражения в крупных кластерах Kubernetes.

    Содержание

    Примечания

    • Настройка сети, хранилища, балансировщиков нагрузки, логирования и мониторинга не рассматривается; смотрите документацию поставщиков для этих компонентов.
    WARNING
    • Тестируйте изменения конфигурации перед внедрением в продакшен.
    • Избегайте одного большого кластера при высоком риске; рассмотрите управление несколькими кластерами для уменьшения радиуса поражения.
    ПроблемаОписаниеОптимизация
    etcd дискetcd очень чувствителен к дисковым операциям ввода-вывода в крупных кластерах.Используйте выделенный NVMe SSD для директории данных etcd.
    Размер БД etcdБазы данных размером более ~8 ГБ значительно ухудшают задержки, использование ресурсов и время восстановления.Поддерживайте размер БД etcd ≤ 8 ГБ; удаляйте неиспользуемые объекты и держите часто обновляемые объекты небольшими (~≤100 КБ).
    Частая смена ключей в etcdВысокая частота чтения/записи по ключам нагружает etcd.Анализируйте метрики etcd для выявления и снижения количества "горячих" ключей.
    Размер данных по типу ресурса в etcdБольшие объемы данных по типу ресурса делают операции полного списка дорогими и могут блокировать контроллеры.Поддерживайте общий объем данных по каждому типу ресурса ≤ 800 МБ; очищайте неиспользуемые Deployments/Services. 1
    Пропускная способность и подключения LB API-сервераОграничения пропускной способности или количества подключений балансировщика нагрузки могут привести к состоянию NotReady у узлов.Мониторьте и заранее обеспечивайте балансировщик нагрузки API-сервера.
    Сервисы на namespaceБольшое количество Services вызывает большое внедрение переменных окружения в Pods и замедляет запуск.Поддерживайте количество Services на namespace < 5,000 или установите enableServiceLinks: false. 2
    Общее количество Services в кластереИзбыточное количество Services увеличивает правила kube-proxy и ухудшает производительность.Поддерживайте общее количество Services < 10,000 и удаляйте неиспользуемые. 1
    CoreDNSБольшое количество Pod может ухудшать производительность CoreDNS.Запускайте NodeLocal DNSCache (nodelocaldns).
    Частота обновления PodВысокая частота обновлений вызывает распространение изменений Endpoint/EndpointSlice на все узлы и может вызывать "штормы".Снижайте churn Pod; для RollingUpdate устанавливайте консервативные значения maxUnavailable/maxSurge.
    Монтирование токенов ServiceAccountКаждый Secret токена может создавать watch; большое количество watch нагружает control plane.Для Pod, которым не нужен доступ к API, установите automountServiceAccountToken: false. 3
    Количество/размер объектовНакопленные ConfigMaps, Secrets, PVC и др. увеличивают нагрузку на control-plane.Ограничивайте историю ReplicaSet (revisionHistoryLimit) и используйте ttlSecondsAfterFinished для Jobs/CronJobs.
    Запросы/лимиты PodБольшие разрывы между запросами и лимитами могут вызвать каскадные сбои при потере узла.По возможности устанавливайте запросы равными лимитам.
    Перезапуски контроллеров и мониторингПерезапуски контроллеров или API-сервера вызывают повторные списки, которые могут перегрузить API-сервер.Мониторьте контроллеры, задавайте адекватные ресурсы для предотвращения перезапусков и снижайте ненужные операции control-plane.

    Footnotes

    1. https://github.com/kubernetes/community/blob/master/sig-scalability/configs-and-limits/thresholds.md 2

    2. https://kubernetes.io/docs/tutorials/services/connect-applications-service/#accessing-the-service

    3. https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/#opt-out-of-api-credential-automounting