По мере того как все больше организаций внедряют Kubernetes, безопасность становится для них одной из главных проблем. Kubernetes имеет множество встроенных функций безопасности, но обеспечить надлежащее применение политик безопасности в большом и сложном кластере может быть непросто. В то же время Kubernetes должен обеспечивать гибкость, необходимую разработчикам для эффективной работы. В этой статье мы рассмотрим три технологии, которые помогут вам достичь этого баланса: Kyverno Kubernetes Policy Engine, Kubernetes RuntimeClass и Kata Containers.
Kyverno Policy Engine
Policy engines (движки политики) — это мощный инструмент, который Kubernetes использует для управления и применения политик во всем кластере. Движки политики позволяют администраторам кластера настраивать и внедрять их для широкого спектра действий, включая доступ к сети, использование ресурсов и размещение подов. Примерами движков политики являются Open Policy Agent (OPA) и Kyverno.
Kyverno — это движок политики Kubernetes, который позволяет применять политики для ваших кластеров Kubernetes. С помощью Kyverno вы можете создавать политики, ограничивающие доступ к ресурсам, применяющие соглашения об именах, ограничивающие доступ к сети и т.д. Вы также можете определить политики, инициируемые при определенных событиях, например, при создании нового деплоя. Когда происходит нарушение политики, Kyverno может предпринять автоматические действия для устранения проблемы, например, заблокировать деплой или удалить под.
Одним из преимуществ Kyverno является то, что он легко интегрируется с Kubernetes, поэтому вы можете определять политики, используя знакомые объекты Kubernetes, такие как ConfigMaps и CRD [Custom Resource Definition — специальный ресурс в Kubernetes, который позволяет вносить любые данные]. Kyverno также поддерживает возможность валидации и генерации политики, поэтому вы можете легко убедиться, что ваши политики работают так, как ожидается, и генерировать их на основе существующих ресурсов Kubernetes.
RuntimeClasses в Kubernetes
RuntimeClass - это фича Kubernetes, которая позволяет вам указать рантайм контейнера для ваших рабочих нагрузок. С помощью RuntimeClass вы можете выбирать между различными рантаймами контейнера или различными конфигурациями одного и того же рантайма. Это полезно для обеспечения безопасности, поскольку разные рантаймы отличаются по свойствам безопасности. Например, вы можете использовать легковесный рантайм для некоторых рабочих нагрузок, требующих быстрого времени запуска, и более безопасный рантайм (но с дополнительными накладными расходами) для рабочих нагрузок, требующих более высокого уровня изоляции.
Еще одним преимуществом RuntimeClass является то, что он позволяет вам переключать рантаймы без изменения рабочих нагрузок. Например, если вам нужно перейти на более безопасный рантайм, вы можете просто обновить RuntimeClass в манифесте деплоя рабочей нагрузки, и Kubernetes автоматически будет использовать новый рантайм, связанный с этим RuntimeClass.
В целом, RuntimeClass предоставляет мощный инструмент для управления средой рантайма рабочих нагрузок Kubernetes, обеспечивая повышенный контроль над безопасностью и гибкостью.
Контейнеры Kata
Kata Containers - это проект с открытым исходным кодом, который предоставляет облегченный уровень виртуализации для изоляции подов Kubernetes от хост-системы. Стандартные рантаймы контейнера, такие как "runc", обеспечивают изоляцию cgroup и предоставляют совместное использование одного и того же ядра со всеми подами. С другой стороны, рантайм Kata (изображенный как containerd-shim-kata-v2 на приведенной выше диаграмме) обеспечивает дополнительный уровень изоляции путем создания выделенной виртуальной машины для каждого пода Kubernetes. На приведенной выше диаграмме она изображена как Pod VM. Каждый под использует отдельное ядро.
Преимущества совместного использования Policy Engines, RuntimeClasses и Kata
Хотя Policy Engines, RuntimeClasses и Kata Containers являются мощными сами по себе, они становятся еще эффективнее, когда используются сообща. Вот некоторые преимущества совместного использования Policy Engines, RuntimeClasses и Kata Containers:
Повышенная безопасность
Администраторы могут использовать Policy Engines, RuntimeClasses и Kata Containers для автоматического обеспечения того, чтобы рабочие нагрузки от определенных пользователей или нагрузки, запрашивающие привилегированные возможности, выполнялись с использованием рантайма контейнеров Kata. Это возможно благодаря тому, что движок политики Kyverno автоматически добавляет правильный RuntimeClass в определение пода перед его деплоем.
Бо́льшая гибкость
RuntimeClasses и контейнеры Kata позволяют администраторам выбирать различные рантаймы контейнера, обеспечивая большую гибкость в управлении подами. Такая гибкость позволяет администраторам выбрать рантайм и технологию контейнеров, которые наилучшим образом отвечают их специфическим потребностям, включая требования безопасности, без ущерба для производительности разработчиков.
Продуктивность разработчиков и пользователей
Разработчику или пользователю не нужно беспокоиться о RuntimeClasses или добавлять специальные записи в определение пода. Пользователь продолжает осуществлять деплой подов как обычно. Магия происходит за кулисами с помощью движка политики.
В следующем разделе мы расскажем вам о настройке Kyverno и рассмотрим несколько примеров политик с использованием RuntimeClass и Kata.
Настройка и примеры
Предположим, что у вас есть действующий кластер Kubernetes с настроенным helm. Установите движок политики Kyverno, используя инструкции, приведенные ниже.
helm repo add kyverno https://kyverno.github.io/kyverno/
helm repo update
helm install kyverno kyverno/kyverno -n kyverno - create-namespace - set replicaCount=1
Обратите внимание, что вы можете использовать любой движок политики, который предоставляет контроллер допуска мутаций.
Ниже приведен пример политики, позволяющей запускать поды в определенном пространстве имен с использованием рантайма контейнеров Kata. Класс RuntimeClass, который был сконфигурирован под использование рантайма контейнеров Kata, имеет имя "kata" (сюрприз ;)):
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: run-pod-using-kata
spec:
background: false
rules:
- name: "Run pods in specific namespace using Kata containers runtime"
match:
any:
- resources:
kinds:
- Pod
namespaces:
- test
mutate:
patchStrategicMerge:
spec:
+(runtimeClassName): kata
Выполните деплой политики:
kubectl apply -f pod-policy.yaml
Ниже приведен пример политики, которая гарантированно обеспечивает запуск привилегированных подов или подов, которым требуется "root" пользователь во всех пространствах имен, кроме "kube-system", с использованием рантайма контейнеров Kata:
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: run-priv-pod-using-kata
spec:
background: false
rules:
- name: "Run privilege pods using Kata containers runtime"
match:
all:
- resources:
kinds:
- Pod
exclude:
any:
- resources:
namespaces:
- kube-system
preconditions:
any:
- key: "{{request.object.spec.containers[?securityContext.privileged] | length(@)}}"
operator: Equals
value: 1
- key: "{{request.object.spec.containers[?securityContext.runAsRoot] | length(@)}}"
operator: Equals
value: 1
mutate:
patchStrategicMerge:
spec:
+(runtimeClassName): kata
За дополнительными примерами обращайтесь к официальной документации Kyverno.
Заключение
Kubernetes произвел революцию в способах деплоя и управления программными приложениями. Однако обеспечение безопасности кластеров Kubernetes может оказаться сложной задачей. Policy Engines и RuntimeClasses - две мощные фичи, которые Kubernetes предоставляет для повышения безопасности кластера.
Объединив их с дополнительными рантаймами контейнера, такими как Kata, можно создать высокозащищенную и гибкую среду Kubernetes. Kyverno обеспечивает соблюдение политик безопасности, RuntimeClass определяет рантайм для ваших рабочих нагрузок, а Kata Containers обеспечивает дополнительный уровень безопасности, изолируя поды друг от друга и от хост-системы. Такой подход позволяет поддерживать высокий уровень безопасности без ущерба для гибкости, необходимой разработчикам при эффективной работе.
В заключение материала приглашаем на открытое занятие, посвященное архитектуре решений на основе K8s. На вебинаре мы рассмотрим kubernetes с точки зрения архитектуры, различные виды реализации (Selfhosted, SaaS и PaaS), сильные и слабые стороны решений, примеры реализации.
Записаться на открытое занятие можно на странице онлайн-курса «Инфраструктурная платформа на основе Kubernetes».