Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Неочевидные проблемы Kubernetes, которые вы мог...

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

Неочевидные проблемы Kubernetes, которые вы могли пропустить

На вебинаре разбираем типовые ошибки, которые можно допустить при деплое сервисов в кластер: от некорректной настройки лимитов ресурсов до сложных кейсов с admission webhooks.

В конце вебинара будут даны рекомендации по настройке вашего кластера и приложений для безотказной работы.

Запись доклада:
https://vk.com/video-59405817_456239816
https://rutube.ru/video/9b354b74f4ec5c72d4b2e1a5d0ade6a5/

Avatar for Ruslan Gainanov

Ruslan Gainanov

August 12, 2025
Tweet

More Decks by Ruslan Gainanov

Other Decks in Programming

Transcript

  1. ВЕДУЩИЙ Виталий Лихачев SRE в нидерландском travel.tech ex-Avito Senior Software

    Engineer • 10+ лет в коммерческой разработке • Анамнез: php, python, golang, java, k8s, postgresql, etc. • Шатаю инфраструктуру по запросам • Автор канала про Kubernetes Kubernetes и кот Лихачева
  2. ЭКСПЕРТ Руслан Гайнанов Главный инженер DevOps, ИТХолдинг T1 • Больше

    10 лет в IT • Спикер DevOops, Импульс-Т1, UDW • Тимлид команды DevOps
  3. 1. Классификация проблем 2. Основные ошибки, последствия и способы защиты

    3. 7 рекомендаций, чтобы спать спокойно О чем поговорим?
  4. Ваши варианты в комментариях Какая ошибка от k8s вам чаще

    всего попадается? (больше всего бесит?
  5. 1. Проблемы конфигурации Классификация проблем 2. Проблемы сетевой конфигурации 3.

    Проблемы безопасности 4. Проблемы хранения данных 5. Проблемы обновлений и управления версиями 6. Проблемы масштабирования 7. Проблемы вокруг инфраструктуры 8. Антипаттерны управления кластером
  6. Ошибки неправильной конфигурации сервиса 1. Некорректные ресурсные ограничения (CPU/RAM) a.

    Не указаны requests и limits → приводит нехватке ресурсов. b. Слишком жесткие лимиты → контейнеры убиваются OOMKiller, возникает троттлинг CPU 2. Неправильные настройки Health Check Liveness & Readiness Probes) a. Долгие/частые проверки → сервис не успевает стартовать. b. Отсутствие проб → Kubernetes не понимает состояние пода. 3. Ошибки в манифестах (YAML/JSON) a. Некорректные отступы, опечатки в полях. b. Использование latest-тега для образов → проблемы с версионностью. 4. Заигрались с affinity/anti affinity a. Не найдется ноды на этапе scheduling Но есть нюансы
  7. ✅ Управляйте параметрами requests и limits. Мониторьте OOM, троттлинг •

    https://cloud.vk.com/blog/kak-poluchit-dostup-k-resursam-kubernetes-pod/ • https://learnkube.com/setting-cpu-memory-limits-requests • https://dnastacio.medium.com/why-you-should-keep-using-cpu-limits ✅ Устанавливайте Liveness & Readiness Probes • https://cloud.google.com/blog/products/containers-kubernetes/kubernetes-best-practices • https://www.baeldung.com/spring-liveness-readiness-probes ✅ Используйте линтеры, validation-webhooks, OPA • https://habr.com/ru/companies/slurm/articles/688268/ • https://www.wiz.io/academy/kubernetes-admission-controllers 🚨 Не устанавливайте все подряд из интернета (helm install …, kubectl apply -f URL) Как избежать ошибок конфигурирования?
  8. Ошибки сетевой конфигурации 1. Неправильные Network Policies или их отсутствие

    a. Излишне строгие правила → сервисы не могут общаться. b. Отсутствие ограничений → уязвимости безопасности. 2. Проблемы с DNS и Service Discovery a. Неправильное имени/неймспейс → недоступность сервиса. b. Кэширование DNS в CoreDNS → задержки. c. Неправильная балансировка (например, в gRPC) → перегрузка отдельных реплик d. Отсутствие рефреша адресов подов для headless сервиса → потеря коннектов e. Неправильные настройки sidecar в service mesh → больше ретраев, чем нужно 3. Неправильный выбор типа Service a. NodePort/LoadBalancer для внешнего доступа → уязвимости безопасности.
  9. ✅ Мониторинг трафика кластера. Визуализация и тестирование Network Policies •

    https://habr.com/ru/companies/slurm/articles/337088/ • https://github.com/Tufin/test-network-policies • https://habr.com/ru/companies/ruvds/articles/712536/ ✅ Валидация и мониторинг Services & DNS • https://www.nslookup.io/learning/the-life-of-a-dns-query-in-kubernetes/ • https://grafana.com/grafana/dashboards/14981-coredns/ Как избежать ошибок сетевой конфигурации
  10. Ошибки безопасности 1. Избыточные права (RBAC) a. Сервисные аккаунты с

    правами cluster-admin. b. Отсутствие ограничений на get/list/watch в кластере. 2. Работа под root в контейнерах a. Уязвимости из-за запуска с privileged: true – взлом одного пода = доступ ко всему кластеру (но не совсем) 3. Хранение секретов в plaintext a. ConfigMap вместо Secrets → утечка чувствительных данных b. Лучше использовать vault в разных вариантах интеграции с k8s. В том числе с полным пропуском хранения секретов в etcd. Но - новая точка отказа.
  11. Ошибки безопасности Доступ на ноду не значит доступ сразу ко

    всем секретам kubectl --kubeconfig /var/lib/kubelet/kubeconfig -n default get secret my-app-secret # Secret не принадлежит ни одному поду для узла кластера Error from server (Forbidden): secrets "my-app-secret" is forbidden: User "system:node:minikube" cannot get resource "secrets" in API group "" in the namespace "default": no relationship found between node 'minikube' and this object # Секрет примонтирован в любой под узла кластера NAME TYPE DATA AGE my-app-secret Opaque 2 5s
  12. Ошибки хранения данных 1. Неправильная настройка Persistent Volumes PV/PVC a.

    PVC висят в статусе Pending. b. Неверный storageClass или режим доступа (RWO vs RWM). 2. Проблемы с динамическим провижинингом Диск не освобождается после удаления PVC. 3. Отсутствие бэкапов данных Удалении StatefulSet → потеря данных 4. Использование emptyDir с medium=memory Больше скорость, но файлы в volume учитываются в limits volumes: - name: cache-volume emptyDir: sizeLimit: 500Mi medium: Memory
  13. Ошибки обновлений и управления версиями 1. Rollout без стратегии (Rolling

    Update vs Blue-Green) a. Приложение «падает» из-за одновременного обновления всех реплик. b. Можно рассмотреть argo rollouts для более сложных деплоев, которых нет из коробки в k8s 2. Отсутствие rollback-стратегии Невозможность быстро откатить деплой. Либо снять с него трафик без отката. 3. Несовместимость версий Kubernetes APIизменения (extensions/v1beta1 → apps/v1). 4. Несовместимость версия приложения Клиенты не могут работать с одной из версий → 5xx или другие варианты ошибок
  14. Ошибки масштабирования 1. Некорректные метрики для масштабирования Использование CPU вместо

    релевантных метрик (RPS, очереди сообщений). 2. Слишком агрессивные/медленные параметры (scaleUp / scaleDown) a. scaleUp без задержки → резкий рост подов и перегрузка кластера. b. scaleDown слишком медленный → лишние поды тратят ресурсы. 3. Отсутствие ограничений (minReplicas / maxReplicas) maxReplicas не задан → исчерпание ресурсов. 4. Невнимание к лимитам нод Поды не могут быть размещены из-за taints/tolerations или nodeSelector. 5. Игнорирование Node Autoscaler Нехватка или перерасход ресурсов. 6. Неправильные ResourceQuotas и LimitRanges a. Сервисы не могут масштабироваться. b. Eviction подов из-за нехватки ресурсов.
  15. Как избежать ошибок масштабирования? ✅ Автоматизируйте – используйте HPA, VPA

    и CA. ✅ Тестируйте – проверяйте поведение при нагрузке (например, через k6 или Locust). ✅ Мониторьте – следите за метриками (kubectl top, Prometheus). ✅ Ограничивайте – выставляйте ResourceQuotas и LimitRanges. Если масштабирование настроено правильно, Kubernetes сам справится с нагрузкой. Если нет – готовьтесь к ночным звонкам из-за упавшего продакшена. 🚨
  16. Проблемы вокруг инфраструктуры Mutating admission webhook a. При переезде пода

    может не отработать (failurePolicy=Fail) b. Неожиданно может не применить изменения (failurePolicy=Ignore) apiVersion: admissionregistration.k8s.io/v1 kind: MutatingWebhookConfiguration webhooks: - name: my-webhook.example.com failurePolicy: Fail
  17. Проблемы вокруг инфраструктуры 1. Container registry недоступен При переезде пода

    не получится скачать образ ⇒ использовать registry cache 2. Медленные диски для etcd Риски частого перевыбора лидера 3. Много разных типов нод Непредсказуемая производительность. Даже в рамках одного типа нод в облаке могут использоваться разные CPU.
  18. Антипаттерны управления кластером 1. Ручные изменения в обход GitOps kubectl

    edit без фиксации в репозитории → дрифт конфигурации. 2. Игнорирование drain нод перед обслуживанием Перезагрузка ноды без drain → недоступные сервисы. 3. Отсутствие резервного копирования etcd Потеря данных кластера при сбое. 4. Отсутствие мониторинга и алертинга a. Нет Prometheus/Grafana или логирования (Loki, ELK)→ проблемы обнаруживаются слишком поздно – сервис уже упал. b. Нет логов и метрик → невозможно анализировать инциденты.
  19. ТОП7 рекомендаций для безотказной работы 1. Всегда указывать requests и

    limits для CPU/RAM Предотвращает оверсабскрайбинг и OOM убийства подов. 2. Настраивать Liveness и Readiness пробы Корректно управляем жизненным циклом подов через Kubernetes. 3. Использовать теги образов, отличные от latest Избегаем неожиданных изменений при деплое. 4. Хранить секреты в Secrets, а не в ConfigMaps (а еще лучше Vault + ротация) Обеспечиваем безопасное управление чувствительными данными 5. Автоматизировать деплой через инструменты СI/GitOps ArgoCD/Flux) Исключаем дрифт конфигурации и ручные правки через kubectl. 6. Планировать обновления с RollingUpdate и стратегией rollback Минимизируем downtime при деплое. 7. Использовать PodDisruptionBudget и drain ноды перед обслуживанием Гарантируем, что критичные сервисы останутся доступными.
  20. т в о й у н и в е р

    с и т е т б у д у щ е г о www.slurm.io