Мультиарендность в Kubernetes

Kate

Administrator
Команда форума
Могут ли несколько команд использовать один и тот же кластер Kubernetes?

Можно ли безопасно запускать ненадежные рабочие нагрузки от ненадежных пользователей?

Поддерживает ли Kubernetes мультиарендность?


В этой статье рассмотрим проблемы запуска кластера с несколькими арендаторами.

Мультиарендность можно разделить на:

  1. Мягкая мультиарендность. Когда вы доверяете своим арендаторам. Например, когда вы делите кластер с командами из одной компании.
  2. Жесткая мультиарендность. Когда вы не доверяете арендаторам.
Также вы можете миксовать оба типа.

1bc668d820911be871a3d1edf3776bba.png

Фундаментом для совместного использования кластера арендаторами является пространство имен.

Пространства имен группируют ресурсы логически. То есть они не предлагают никаких механизмов безопасности и не гарантируют, что все ресурсы развернуты на одном узле.

696b8894eeb76b61525b11bde26fc29b.png

Поды в пространстве имен по-прежнему могут взаимодействовать со всеми другими подами в кластере, делать запросы к API и использовать столько ресурсов, сколько захотят.

Из коробки любой пользователь может получить доступ к любому пространству имен.

Как изменить это?

2e0cd4f14e1c35fdc87472f16a476029.png

С помощью RBAC вы можете ограничить действия пользователей и приложений с пространством имен и внутри него.

Чаще всего предоставляются определенные разрешения ограниченным пользователям.

b1a889e5977152941a0765e2e347032d.png

С помощью Quotas и LimitRanges вы можете ограничить ресурсы, а также память, ЦП и т.д., которые может использовать определенное пространство имен.

Это отличная идея, если вы хотите ограничить действия арендатора, у которого есть свое пространство имен.

afbb1d331d6c09e0ebdfd81b3f5cdc4c.png

По умолчанию все поды могут взаимодействовать с любыми подами в Kubernetes.

Это не очень хорошо для мультитенантности, но вы можете исправить это с помощью сетевых политик — NetworkPolicies.

Сетевые политики похожи на правила брандмауэра и позволяют разделять исходящий и входящий трафик.

48d2c91f6ba6d71329846c40089116bb.png

Отлично, теперь пространство имен безопасно?

Не спешите.

Пока что RBAC, NetworkPolicies, Quotas и т. д., дали вам только фундамент для мультиарендности, но этого недостаточно.

Kubernetes имеет несколько общих компонентов.

Хороший пример — контроллер Ingress. Обычно он разворачивается один раз на каждый кластер.

Если вы отправляете Ingress-манифест тем же путем, перезаписывается и работает только один.

1d865a5d05f813d8db62ce03e4845df2.png

Лучше развернуть контроллер для каждого пространства имен.

Еще одна интересная задача — CoreDNS.

Что делать, если один из арендаторов злоупотребляет DNS?

Остальная часть кластера тоже пострадает.

Вы можете ограничить запросы с помощью дополнительного плагина https://github.com/coredns/policy.

9e0df3258f02c9c05e5d1accb22466c8.png

Та же проблема относится и к серверу Kubernetes API.

Kubernetes не знает об арендаторе, и если API получает слишком много запросов, то он будет блокировать их для всех.

Я не знаю, есть ли обходной путь для этого!

656f93db0f71382c42e6773442bcb16f.png

Предполагаю, что вам удастся разобраться с общими ресурсами, но есть еще проблема с kubelet и рабочими нагрузками.

Как объясняет Филипп Богартс в этой статье, арендатор может взять на себя управление узлами в кластере, просто злоупотребляя проверками на живучесть.

Исправление не тривиальное.

01d54e1559b38f04c0bb4adee17088f4.png

Вы можете использовать линтер как часть CI/CD-процесса или использовать контроллеры допуска для проверки безопасности ресурсов, отправленных в кластер.

Вот библиотека или правила для Open Policy Agent.

78935787abde1ea1703b67796297e887.png

У вас также есть контейнеры, которые предлагают более слабый механизм изоляции, чем виртуальные машины.

В этом видео Льюис Денхэм-Пэрри показывает, как избавиться от контейнера.

Как это исправить?

Вы можете использовать контейнерную песочницу, такую как gVisor, легкие виртуальные машины в качестве контейнеров (Kata containers, firecracker + containerd) или полные виртуальные машины (virtlet как CRI).

403430c72036ccc9f74b2fc4194304f6.png

Надеюсь, вы поняли, что сложность в том, трудно установить жесткие границы для отдельных сетей, рабочих нагрузок и контроллеров в Kubernetes.

Вот почему не рекомендуется предоставлять жесткую мультитенантность в Kubernetes.

Если вам нужна жесткая мультитенантность, советуем вместо этого использовать несколько кластеров или инструмент «Cluster-as-a-Service».

Если вы можете позволить себе более слабую модель с несколькими арендаторами в обмен на простоту и удобство, вы можете выкатить свои RBAC, Quotas и другие правила.

Но есть несколько инструментов, которые возьмут на себя эти проблемы:


 
Сверху