Ограничения привратника /OPA для подмножества пространств имен без использования меток

Я использую привратник /OPA для создания ограничений для различных служб, которые я выполняю в определенных пространствах имен. Для этого я полагаюсь на namespaceSelectors, чтобы сопоставить ограничение только с набором пространств имен. Мой процесс CI/CD отвечает за маркировку всех моих пользовательских пространств имен необходимыми метками, которые будет искать мое ограничение.

Однако теперь мне нужно убедиться, что новое пространство имен не создается без требуемых меток (иначе это пространство имен проигнорирует все мои ограничения). Тот факт, что мой инструмент CI/CD применяет эти метки, не позволяет мне быть уверенным, что в моем кластере не было создано никакого другого пространства имен без этих меток.

Если я применю шаблон ограничения k8srequiredlabels[2] ко всем пространствам имен, это обнаружит нарушение в системных пространствах имен, таких как kube-system. Ограничения привратника позволяют вам указать любое из следующего, чтобы соответствовать вашему ограничению [1]:

labelSelector
namespaceSelector
namespaces list

В идеале я хотел бы иметь возможность сказать, что я хочу гарантировать, что все пространства имен имеют метки x, за исключением пространств имен в списке исключений (например, kube-system). Однако нет возможности использовать приведенный выше список "Пространства имен" эксклюзивным образом, а два других варианта требуют, чтобы кто-то вручную добавил метки к вновь созданным пространствам имен (что открывает место для ошибки).

  • Любые предложения о том, как вы можете гарантировать, что подмножество пространства имен ваших кластеров имеет метки x, без необходимости вручную маркировать их и использовать label/namespaceSelector?
  • Как бы вы предотвратили создание пространства имен с помощью OPA и Gatekeeper, если оно не соответствует определенным критериям, таким как наличие на нем метки x?

[1] https://github.com/open-policy-agent/gatekeeper/pull/131/files

[2] https://github.com/open-policy-agent/gatekeeper/blob/master/demo/agilebank/templates/k8srequiredlabels_template.yaml

2 ответа

Решение

Проблема 1 может быть решена с помощью самого OPA. Вы можете написать изменяющийся веб-перехватчик с помощью OPA (https://github.com/open-policy-agent/opa/issues/943), чтобы добавить метки к вашим вновь созданным пространствам имен, или вы можете написать изменяющийся контроллер (используя Golang). Под ними оба делают одно и то же.

Для второй проблемы вам необходимо добавить правило проверки в ваши файлы rego при создании пространства имен и проверить, существует ли метка.

Дополнительная релевантная информация: для выполнения действий с определенными пространствами имен на основе метки вы можете добавить namesapceSelector в конфигурацию проверки / изменения веб-перехватчика.

Вы можете использовать Helm для динамического присвоения меток определенным пространствам имен.

Значение пространства имен может быть получено из--namespaceпараметр, который является тем же пространством имен, в котором развернута диаграмма управления. В графиках к нему следует обращаться с помощью{{.Release.Namespace}}тогда. Или вы можете установить эти пространства имен, используя--setпри развертывании штурвала с обновлением штурвала. Если есть несколько сред, вы можете получить к ним доступ как псевдонимы в values.yaml, а затем установить для них значения пространств имен следующим образом:

helm upgrade \
   <chart_name> \
      <path_to_the_chart> \
        --set <environment_one>.namespace=namespace1 \
        --set <environment_two>.namespace=namespace2 \
...

Пожалуйста, взгляните на: динамическую-пространственную-переменную.

Чтобы проверить, имеет ли конкретное пространство имен правильные метки, используйте контроллер доступа Webhook.

Здесь вы можете найти дополнительную информацию: webhook-admssion-controller.

Другие вопросы по тегам