自動(dòng)為 Pod 控制器生成規(guī)則。
Pod 是 Kubernetes 中最常見的對(duì)象類型之一冠摄,因此也是大多數(shù)類型驗(yàn)證規(guī)則的重點(diǎn)。但 Kubernetes 并不推薦直接創(chuàng)建 Pod。相反愧驱,Kubernetes 有許多更高級(jí)別的控制器直接或間接管理 Pod,即 Deployment椭盏、DaemonSet组砚、StatefulSet、Job 和 CronJob 等掏颊。編寫針對(duì) Pod 的策略時(shí)糟红,必須為每個(gè)控制器編寫策略將是乏味且低效的。Kyverno 通過支持從為 Pod 編寫的規(guī)則自動(dòng)生成更高級(jí)別控制器的策略規(guī)則來解決此問題乌叶。
例如盆偿,當(dāng)創(chuàng)建如下所示的驗(yàn)證策略以檢查所有鏡像是否來自內(nèi)部可信 registry 時(shí),該策略適用于所有能夠生成 Pod 的資源准浴。
apiVersion : kyverno.io/v1
kind: ClusterPolicy
metadata:
name: restrict-image-registries
spec:
validationFailureAction: enforce
rules:
- name: validate-registries
match:
any:
- resources:
kinds:
- Pod
validate:
message: "Images may only come from our internal enterprise registry."
pattern:
spec:
containers:
- image: "registry.domain.com/*"
一旦上述規(guī)則被創(chuàng)建事扭,就可以在自動(dòng)生成的規(guī)則中看到一下配置,這些都是 Kyverno 添加到規(guī)則中的乐横。
spec:
background: true
failurePolicy: Fail
rules:
- match:
any:
- resources:
kinds:
- Pod
name: validate-registries
validate:
message: Images may only come from our internal enterprise registry.
pattern:
spec:
containers:
- image: registry.domain.com/*
- match:
any:
- resources:
kinds:
- DaemonSet
- Deployment
- Job
- StatefulSet
name: autogen-validate-registries
validate:
message: Images may only come from our internal enterprise registry.
pattern:
spec:
template:
spec:
containers:
- image: registry.domain.com/*
- match:
any:
- resources:
kinds:
- CronJob
name: autogen-cronjob-validate-registries
validate:
message: Images may only come from our internal enterprise registry.
pattern:
spec:
jobTemplate:
spec:
template:
spec:
containers:
- image: registry.domain.com/*
validationFailureAction: enforce
注意:Kyverno 1.7.0 中求橄,新增了一個(gè)容器參數(shù) --autogenInternals
(目前是 beta feature今野,默認(rèn)不啟用),用于防止回寫這些自動(dòng)生成的規(guī)則到 .spec 字段罐农。設(shè)置為 true 可以啟用該新特性条霜。
自動(dòng)生成行為是被 pod-policies.kyverno.io/autogen-controllers
注解控制的。
默認(rèn)情況下啃匿,Kyverno 會(huì)加入一個(gè)注解 pod-policies.kyverno.io/autogen-controllers=DaemonSet,Deployment,Job,StatefulSet,CronJob
蛔外,以生成應(yīng)用于這些控制器的附加規(guī)則。你可以通過修改 pod-policies.kyverno.io/autogen-controllers
注解溯乒,為自動(dòng)生成的規(guī)則自定義目標(biāo) Pod 控制器夹厌。例如,如果 policy 的注解設(shè)置為 pod-policies.kyverno.io/autogen-controllers=Deployment裆悄,Kyverno 將會(huì)為 Deployment 自動(dòng)生成規(guī)則矛纹。
如果在 match
或 exclude
塊中指定以下資源字段/對(duì)象時(shí),Kyverno 都會(huì)跳過生成 Pod 控制器規(guī)則光稼,因?yàn)檫@些過濾器可能不適用于 Pod 控制器:
names
selector
annotations
如果想禁用自動(dòng)為 Pod 控制器生成規(guī)則或南,將 pod-policies.kyverno.io/autogen-controllers
設(shè)置為 none
即可。
當(dāng)為選定的 Pod 控制器禁用自動(dòng)生成規(guī)則時(shí)艾君,Kyverno 仍將 Pod 上的策略匹配應(yīng)用于由這些控制器生成的 Pod采够。要免除這些 Pod,請(qǐng)使用帶有類似于下面的表達(dá)式的前置條件冰垄,這可能允許 Job 控制器創(chuàng)建的 Pod 通過蹬癌。
- key: Job
operator: AnyNotIn
value: "{{ request.object.metadata.ownerReferences[].kind }}"
通過 Metadata 排除
在某些情況下,可能需要中 exclude 塊中使用標(biāo)簽或注解來排除 Pod虹茶。例如逝薪,如下的 match 和 exclude 看用于匹配所有(除了有 policy.test/require-requests-limits=skip 注解)的 Pod。
rules:
- name: validate-resources
match:
any:
- resources:
kinds:
- Pod
exclude:
any:
- resources:
annotations:
policy.test/require-requests-limits: skip
當(dāng) Kyverno 看到上面提到的這些類型的字段時(shí)蝴罪,它會(huì)跳過規(guī)則的自動(dòng)生成董济。另一個(gè)選擇可能是通過編寫一個(gè)查找 request.object.metadata.* 的表達(dá)式的前置條件來實(shí)現(xiàn)相同的效果。作為自動(dòng)生成的一部分要门,Kyverno 會(huì)查找所有以 request.object 開頭的虏肾、來自 AdmissionReview 的變量,并翻譯后將其應(yīng)用于每個(gè)合適的 Pod 控制器暂衡。以 Deployment 為例询微,在自動(dòng)生成的規(guī)則中會(huì)被翻譯為 request.object.spec.template.metadata.,這指向 Pod 模板中的 metadata狂巢,而不是 Deployment 自身的 metadata撑毛。要解決此問題,可以在前置條件的 object 上使用雙引號(hào),這樣就不會(huì)將 request.object.metadata. 翻譯成 request.object.spec.template.metadata.*藻雌,如下所示:
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: require-requests-limits
spec:
validationFailureAction: enforce
background: true
rules:
- name: validate-resources
match:
any:
- resources:
kinds:
- Pod
preconditions:
all:
- key: "{{ request.\"object\".metadata.annotations.\"policy.test.io/require-requests-limits\" || '' }}"
operator: NotEquals
value: skip
validate:
message: "CPU and memory resource requests and limits are required."
pattern:
spec:
containers:
- resources:
requests:
memory: "?*"
cpu: "?*"
limits:
memory: "?*"
這種方式和上面使用 exclude 塊的方式有相同的效果雌续。