基于變量控制策略規(guī)則的執(zhí)行蝇率。
前置條件允許通過基于變量值構(gòu)建表達(dá)式來控制策略規(guī)則的執(zhí)行刽沾。
match
和 exclude
允許基于資源和用戶信息過濾請(qǐng)求,preconditions
用于定義自定義過濾器侧漓,以便更精細(xì)地控制何時(shí)應(yīng)用規(guī)則。
preconditions
的主要應(yīng)用場(chǎng)景是在 mutate
或 generate
規(guī)則中鉴象,例如忙菠,當(dāng)需要檢查和保證變量(通常是 AdmissionReview 中的數(shù)據(jù))不為空時(shí)纺弊。除了 AdmissionReview 變量,寫成 JMESPath 表達(dá)式淆游,preconditions
也可用于檢查來自 ConfigMap 中的變量。使用 patchJson6902
的 mutate
應(yīng)該使用 preconditions
作為一個(gè)過濾結(jié)果的方式拾稳。
對(duì)于 validate
規(guī)則腊脱,更推薦使用 patterns
陕凹,因?yàn)榭梢允褂脳l件語句。
當(dāng)在 preconditions
聲明中指定 JMESPath 表達(dá)式時(shí)搜骡,可能會(huì)包含一些特殊字符(例如 Kubernetes annotation 中的 /),需要用雙引號(hào)括起 annotation 從而作為一個(gè)字面值记靡。使用反斜杠字符 () 轉(zhuǎn)義雙引號(hào)团驱。更多關(guān)于在 preconditions 中書寫 JMESPath 表達(dá)式的細(xì)節(jié)摸吠,請(qǐng)參考這里的 JMESPath 頁面嚎花。
{{request.object.spec.template.metadata.annotations.\"foo.k8s.corp.net/bar\"}}
您可以在 preconditions 字段中指定多個(gè)語句,并通過 any 和 all 來控制它們的操作贩幻。
Any 和 All 聲明
你可以通過在 any
和/或 all
聲明下嵌套表達(dá)式來進(jìn)一步控制如何評(píng)估 preconditions两嘴。這使您可以進(jìn)一步構(gòu)建更精確的規(guī)則觸發(fā)邏輯。any
和 all
可以在同一規(guī)則中同時(shí)使用憔辫,可以使用多個(gè) any
語句(多個(gè) all
語句將是多余的)。對(duì)于任意 any/all
聲明坏平,對(duì)于要處理的先決條件拢操,每個(gè)塊必須總體評(píng)估為 TRUE。如果任何 any/all 聲明塊被評(píng)估為 FALSE令境,preconditions
將不滿足顾瞪,這個(gè)規(guī)則就不會(huì)被應(yīng)用。
例如惕橙,考慮一個(gè)具有許多不同標(biāo)簽的 Deployment 清單弥鹦,如下所示。
apiVersion: apps/v1
kind: Deployment
metadata:
name: busybox
labels:
app: busybox
color: red
animal: cow
food: pizza
car: jeep
env: qa
spec:
replicas: 1
selector:
matchLabels:
app: busybox
template:
metadata:
labels:
app: busybox
spec:
containers:
- image: busybox:1.28
name: busybox
command: ["sleep", "9999"]
在 preconditions 聲明中使用 any
和 all
塊,在評(píng)估規(guī)則時(shí)可以獲得更精細(xì)的控制犬钢。在下面的樣本策略中,使用一個(gè) any
塊將使 preconditions 以邏輯 OR 的方式工作玷犹。如果存在 color=blue
或 app=busybox
標(biāo)簽歹颓,這個(gè)策略都會(huì)生效。即便上面的 Deployment 中配置的標(biāo)簽是 color=red
领跛,它也符合 any
條件需求撤奸。
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: any-all-preconditions
spec:
validationFailureAction: enforce
background: false
rules:
- name: any-all-rule
match:
resources:
kinds:
- Deployment
preconditions:
any:
- key: "{{ request.object.metadata.labels.color || '' }}"
operator: Equals
value: blue
- key: "{{ request.object.metadata.labels.app || '' }}"
operator: Equals
value: busybox
validate:
message: "Busybox must be used based on this label combination."
pattern:
spec:
template:
spec:
containers:
- name: "*busybox*"
注意:可以在 preconditions 中使用 JMESPath 語法進(jìn)行 non-existence 檢查,詳見這里矢棚。
all
塊要求其包含的所有聲明都必須評(píng)估為 TRUE 時(shí)府喳,該塊才被認(rèn)為是 TRUE。下面的策略中兜粘,除了會(huì)檢查 any
中的條件,還會(huì)檢查 animal=cow
和 env=prod
標(biāo)簽,之后才會(huì)驗(yàn)證是否存在名稱中包含 foxes 字符串的容器距糖。由于 any
和 all
塊被評(píng)估為 TRUE悍引,就會(huì)執(zhí)行驗(yàn)證過程趣斤,然而由于容器秉承是 busybox
俩块,這個(gè) Deployment 會(huì)創(chuàng)建失敗玉凯。如果 all
塊中的一條語句被更改漫仆,使得選中標(biāo)簽的值不在 Deployment 中泪幌,則不會(huì)處理該規(guī)則并創(chuàng)建 Deployment祸泪。
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: any-all-preconditions
spec:
validationFailureAction: enforce
background: false
rules:
- name: any-all-rule
match:
any:
- resources:
kinds:
- Deployment
preconditions:
any:
- key: "{{ request.object.metadata.labels.color || '' }}"
operator: Equals
value: blue
- key: "{{ request.object.metadata.labels.app || '' }}"
operator: Equals
value: busybox
all:
- key: "{{ request.object.metadata.labels.animal || '' }}"
operator: Equals
value: cow
- key: "{{ request.object.metadata.labels.env || '' }}"
operator: Equals
value: qa
validate:
message: "Foxes must be used based on this label combination."
pattern:
spec:
template:
spec:
containers:
- name: "*foxes*"
操作符
當(dāng)前没隘,在前置條件評(píng)估時(shí)支持使用以下操作符:
Equals
NotEquals
In (已廢棄)
AnyIn
AllIn
NotIn (已廢棄)
AnyNotIn
AllNotIn
GreaterThan
GreaterThanOrEquals
LessThan
LessThanOrEquals
DurationGreaterThan
DurationGreaterThanOrEquals
DurationLessThan
DurationLessThanOrEquals
集合操作符 In右蒲、AnyIn瑰妄、AllIn翰撑、NotIn、AnyNotIn 和 AllNotIn 支持將字符串集合作為值(如 [“str1”, “str2”])涨醋。也支持你指定一個(gè)字符串集合作為 可以(如 [“str1”, “str2”] AllIn [“str1”, “str2”, “str3”])浴骂。在這個(gè)示例中,AllIn 檢查 key 中所有的字符串片段是否都在 value 中,AnyIn 檢查 key 中任意的字符串片段在 value 中狡相,AllNotIn 檢查 key 中所有的字符串片段是否都不在 value 中尽棕,AnyNotIn 檢查 key 中任意的字符串片段不在 value 中伊诵。當(dāng)前不支持其他類型的集合。舊操作符 In 和 NotIn 的作用和 AllIn 及 AnyNotIn 相近笛坦,它們已經(jīng)過期,并且會(huì)在未來版本中被移除。
持續(xù)時(shí)間運(yùn)算符可用于諸如驗(yàn)證作為持續(xù)時(shí)間單位的注釋之類的事情宴偿。持續(xù)時(shí)間運(yùn)算符期望數(shù)字類型(作為秒)的 key 或 value,或一個(gè)有效的 Go 持續(xù)時(shí)間的字符串娩践,例如"1h"。支持的字符串單位是 s
(second)、m
(minute) 和 h
(hour)吨岭。time.ParseDuration 涵蓋了有關(guān)支持的持續(xù)時(shí)間字符串的完整詳細(xì)信息辣辫。
GreaterThan
、GreaterThanOrEquals
姐浮、LessThan
和 LessThanOrEquals
操作符也可用于 Kubernetes 資源數(shù)量〉懵ィ可以使用由 resource.ParseQuantity 處理的任何值换怖,這包括比較具有不同比例的值蟀瞧。
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: resource-quantities
spec:
validationFailureAction: enforce
background: false
rules:
- name: memory-limit
match:
any:
- resources:
kinds:
- Pod
preconditions:
any:
- key: "{{request.object.spec.containers[*].resources.requests.memory}}"
operator: LessThan
value: 1Gi
通配符匹配
字符串值支持使用通配符以允許部分匹配悦污。下面的示例會(huì)匹配容器鏡像名稱以 bash 開頭的 Pod切端。
- name: match-on-image
match:
any:
- resources:
kinds:
- Pods
preconditions:
any:
- key: "{{request.object.spec.template.spec.containers.image}}"
operator: Equals
value: "bash:*"
匹配沒有服務(wù)帳戶的請(qǐng)求
這個(gè)示例踏枣,這個(gè)規(guī)則之后應(yīng)用于來自 ServiceAccounts(即 {{serviceAccountName}} 不為空)的請(qǐng)求茵瀑。
- name: generate-owner-role
match:
any:
- resources:
kinds:
- Namespace
preconditions:
any:
- key: "{{serviceAccountName}}"
operator: NotEquals
value: ""
匹配來自特定服務(wù)帳號(hào)的請(qǐng)求
這個(gè)示例马昨,規(guī)則只會(huì)應(yīng)用于來自 ServiceAccount 名稱是 build-default 和 build-base 的請(qǐng)求竞帽。
- name: generate-default-build-role
match:
any:
- resources:
kinds:
- Namespace
preconditions:
any:
- key: "{{serviceAccountName}}"
operator: AnyIn
value: ["build-default", "build-base"]