Conftest 异常规则因 Kustomization 和 Helm 而失败
Conftest Exception Rule Fails with Kustomization & Helm
我在我的一个项目中有几个 k8s 资源,这些资源是使用 Helm & Kustomize 构建、组合和打包的。我使用 Conftest 编写了一些 OPA 测试,其中一项检查是避免 运行 容器作为 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 }}
我现在已经在我的 base.rego 文件中编写了 Conftest,如下所示:
# 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
我不知道如何让它工作。我不想最终将 deployment.yaml 中的内容再次复制到 flux-patch-prod.yaml 中,因为这首先会破坏使用 Kustomization 的全部目的。知道如何解决这个问题吗?从昨天开始我就被这个问题困扰了!
我设法解决了这个问题,但是抛出的错误消息并没有那么有用。 Conftest 的下一个版本可能会变得更好。
所以这是我必须做的:
我去 https://play.openpolicyagent.org/ 游乐场测试我的文件。当我在那里复制我的 rego 规则时,我注意到以下错误消息:
policy.rego:25: rego_unsafe_var_error: var msg is unsafe
我开始怀疑了,当我更加注意这条线以查看实际问题是什么时,我不得不更改:
msg = sprintf("Containers must not run as root in Deployment %s",
[name])
收件人:
msg = sprintf("Containers must not run as root in Deployment %s",
[input.name])
它按预期工作了!愚蠢的错误,但来自 Conftest 的错误信息乍一看并没有多大用处!
我在我的一个项目中有几个 k8s 资源,这些资源是使用 Helm & Kustomize 构建、组合和打包的。我使用 Conftest 编写了一些 OPA 测试,其中一项检查是避免 运行 容器作为 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 }}
我现在已经在我的 base.rego 文件中编写了 Conftest,如下所示:
# 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
我不知道如何让它工作。我不想最终将 deployment.yaml 中的内容再次复制到 flux-patch-prod.yaml 中,因为这首先会破坏使用 Kustomization 的全部目的。知道如何解决这个问题吗?从昨天开始我就被这个问题困扰了!
我设法解决了这个问题,但是抛出的错误消息并没有那么有用。 Conftest 的下一个版本可能会变得更好。
所以这是我必须做的:
我去 https://play.openpolicyagent.org/ 游乐场测试我的文件。当我在那里复制我的 rego 规则时,我注意到以下错误消息:
policy.rego:25: rego_unsafe_var_error: var msg is unsafe
我开始怀疑了,当我更加注意这条线以查看实际问题是什么时,我不得不更改:
msg = sprintf("Containers must not run as root in Deployment %s", [name])
收件人:
msg = sprintf("Containers must not run as root in Deployment %s", [input.name])
它按预期工作了!愚蠢的错误,但来自 Conftest 的错误信息乍一看并没有多大用处!