Policy as a code. Kyverno
Last updated
Last updated
https://habr.com/ru/companies/slurm/articles/722264/
Kubernetes смог произвести революцию в облачной экосистеме, позволив людям запускать распределенные приложения на масштабе. Хотя Kubernetes – это многофункциональная и надежная платформа для оркестрации контейнеров, она имеет свои собственные сложности. Управлять Kubernetes в таком масштабе, когда над ним работают сразу несколько команд, непросто. Трудно контролировать правильность действий пользователей и их возможный выход за рамки допустимого.
Kyverno является самым подходящим инструментом для этого. Это движок политик безопасности Kubernetes с открытым исходным кодом, который помогает вам определять политики с помощью простых манифестов Kubernetes. Он может проверять, изменять и генерировать ресурсы Kubernetes. Таким образом, это может позволить организациям определять и применять политики так, чтобы разработчики и администраторы придерживались определенного стандарта.
Kyverno работает на основе dymanic admission controller, который проверяет каждый запрос, который вы отправляете через kubectl на сервер Kube API. Если запрос соответствует политике, Kyverno пропускает его. В противном случае он отклоняет запрос с определенным сообщением.
Это позволяет Kyverno осуществлять такие функции, как:
Проверку ограничений CPU и памяти.
Контроль за тем, чтобы пользователи не меняли сетевые политики, установленные по умолчанию.
Проверку, соответствует ли имя ресурса определенному шаблону.
Обеспечение того, чтобы определенные ресурсы всегда содержали соответствующую метку.
Запрет удалений и изменений для определенных ресурсов.
Автоматическое изменение imagePullPolicy на Always, если тег изображения latest.
Создание сетевой политики по умолчанию для каждого нового namespace.
Kyverno использует CRD (пользовательские определения ресурсов) для определения политик, поэтому написание политик настолько просто, как их применение с помощью kubectl.
Есть три основные функции, предоставляемые Kyverno:
проверка (validation)
изменение (mutation)
генерация (generation)
Давайте взглянем на некоторые примеры манифестов для каждой из них.
Прекрасным примером использования является обеспечение того, чтобы все поды имели установленные значения для requests/limits. Следующий пример прекрасно объясняет это:
Хотя большая часть примера сама себя документирует и объясняет, давайте разберем параметр validationFailureAction Он указывает, следует ли соблюдать это требование (с помощью enforce) или следует только проверить его (с помощью audit) и сообщить о нарушениях.
Mutation означает изменение ресурсов, если они соответствуют определенному шаблону. Отличным примером этого яцвляется изменение imagePullPolicy на Always, если тег образа контейнера latest.
Генерирование, как следует из названия, генерирует (создает) ресурс для определенного события. Например, если кто-то создает новый namespace, мы можем захотеть применить сетевую политику по умолчанию.
Теперь давайте перейдем к практике и посмотрим на Kyverno в работе. Мы установим Kyverno, а затем применим политику валидации для осуществления проверки наличия определенной метки. Если метка не существует, Kyverno отклонит запрос. В противном случае он будет одобрен.
Для начала работы нам нужен функциональный кластер Kubernetes.
Установка Kyverno проста. Вы можете либо применить манифест Kyverno Kubernetes, доступный на GitHub, либо установить последнюю версию helm chart.
Чтобы проверить, успешно ли мы установили Kyverno, перечислите все ресурсы в namespace kyverno:
Теперь мы подошли к вопросу о политике. Давайте применим политику, которая гарантирует, что все поды должны содержать метку (label) с именем app. Создайте файл с именем require-app-label.yaml с приведенным ниже содержанием:
Если вы посмотрите на YAML, мы увидим, что там есть раздел match, который содержит типы ресурсов, которые мы должны сопоставить. В этом примеры мы видим сущность типа Pod. Секция validate определяет сообщение, которое мы должны вывести, если проверка завершится неудачей, и шаблон, объясняющий, что нам нужно сопоставить.
Поскольку это пользовательский ресурс kubernetes, мы можем применить его напрямую и получить желаемый результат:
Итак, пришло время для небольшого тестирования! Давайте создадим pod без метки (label) и посмотрим, что у нас получится:
Итак, как мы видим, проверка завершилась неудачей по причине, указанной ниже:
Здесь всё работает, как и ожидалось, поскольку мы еще не предоставили метку (label). Теперь давайте попробуем с меткой name=nginx:
Этот запуск тоже терпит неудачу, так как метка (label) приложения по-прежнему отсутствует. Давайте создадим под NGINX с меткой app=nginx:
Как мы можем видеть, под был создан успешно. Теперь давайте используем kubectl для получения пода и меток:
Под запущен и содержит метку app=nginx.
Kyverno – это отличный инструмент policy-as-code, который очень эффективен в применении лучших практик на уровне компании. Поскольку он является родным для Kubernetes, он прост в написании и эксплуатации и не требует обслуживания специализированными разработчиками.