Правило исключения Conftest не работает с настройкой и Helm

У меня есть в одном из моих проектов несколько ресурсов k8s, которые собраны, составлены и упакованы с использованием Helm & Kustomize. Я написал несколько тестов OPA с помощью Conftest, где одна из проверок заключается в том, чтобы избежать запуска контейнеров с правами root. Итак, вот мой файл deployment.yaml в моей базовой папке:

apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: {{ .Values.app.namespace }}
  labels:
    name: {{ .Values.app.name }}
    #app: {{ .Values.app.name }}
    component: {{ .Values.plantSimulatorService.component }}
    part-of: {{ .Values.app.name }}
    managed-by: helm
    instance: {{ .Values.app.name }}
    version: {{ .Values.app.version }}
spec:
  selector:
    matchLabels:
      app: {{ .Values.app.name }}
  replicas: 1
  template:
    metadata:
      labels:
        app: {{ .Values.app.name }}
    spec:
      securityContext:
        runAsUser: 1000
        runAsGroup: 3000
        fsGroup: 2000
        runAsNonRoot: true
      containers:
        - name: {{ .Values.app.name }}
          image: {{ .Values.plantSimulatorService.image.repository }}:{{ .Values.plantSimulatorService.image.tag }}
          ports:
            - containerPort: {{ .Values.plantSimulatorService.ports.containerPort }} # Get this value from ConfigMap

Затем у меня есть файл исправления (flux-patch-prod.yaml) в папке с оверлеями, который выглядит так:

---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    fluxPatchFile: prodPatchFile
  annotations:
    flux.weave.works/locked: "true"
    flux.weave.works/locked_msg: Lock deployment in production
    flux.weave.works/locked_user: Joesan <github.com/joesan>
  name: plant-simulator-prod
  namespace: {{ .Values.app.namespace }}

Теперь я записал Conftest в свой файл base.rego, который выглядит так:

# Check container is not run as root
deny_run_as_root[msg] {
  kubernetes.is_deployment
  not input.spec.template.spec.securityContext.runAsNonRoot

  msg = sprintf("Containers must not run as root in Deployment %s", [name])
}

exception[rules] {
  kubernetes.is_deployment
  input.metadata.name == "plant-simulator-prod"
  rules := ["run_as_root"]
}

Но когда я их запускал (у меня установлен плагин helm-conftest), я получаю следующую ошибку:

FAIL - Containers must not run as root in Deployment plant-simulator-prod
90 tests, 80 passed, 3 warnings, 7 failures
Error: plugin "conftest" exited with error

Я понятия не имею, как заставить это работать. Я не хочу в конечном итоге снова копировать содержимое из deploy.yaml в flux-patch-prod.yaml, так как это в первую очередь лишило бы смысла использование Kustomization. Есть идеи, как это исправить? Со вчерашнего дня не могу решить эту проблему!

Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
0
0
313
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Мне удалось исправить это, но сообщения об ошибках, которые выбрасывались, были не такими уж полезными. Возможно, со следующими релизными версиями Conftest ситуация улучшится.

Итак, вот что мне пришлось сделать:

Я пошел на https://play.openpolicygent.org/ площадку, чтобы проверить свои файлы. Когда я скопировал туда свои правила rego, я заметил следующее сообщение об ошибке:

policy.rego:25: rego_unsafe_var_error: var msg небезопасно

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

msg = sprintf("Контейнеры не должны запускаться от имени пользователя root в развертывании %s", [имя])

К:

msg = sprintf("Контейнеры не должны запускаться от имени пользователя root в развертывании %s", [ввод.имя])

И это сработало, как и ожидалось! Глупая ошибка, но сообщения об ошибках от Conftest не были настолько полезными, чтобы понять их с первого взгляда!

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