策略配置
策略中所有規(guī)則的通用配置。
策略包含一個或多個規(guī)則屋灌,以及適用于策略中所有規(guī)則的以下常見設(shè)置:
validationFailureAction: 控制驗證策略規(guī)則失敗是否應(yīng)該阻止準(zhǔn)入審查請求(
enforce
)或允許(audit
)準(zhǔn)入審查請求并在策略報告中報告策略失敗焰雕。 默認(rèn)為audit
雀扶。validationFailureActionOverrides: 一個 ClusterPolicy 屬性,指定 validationFailureAction 命名空間方式。 它會覆蓋指定命名空間的 validationFailureAction幻林。
background: 控制是否在后臺掃描期間將規(guī)則應(yīng)用于現(xiàn)有資源。 默認(rèn)為“true”音念。
schemaValidation: 控制是否應(yīng)用策略驗證檢查沪饺。 默認(rèn)為“true”。 Kyverno 將嘗試驗證策略的 schema闷愤,如果無法確定它滿足該資源的 OpenAPI schema 定義整葡,則會失敗「翁罚可以在驗證或變更策略上發(fā)生掘宪。 設(shè)置為“false”以跳過模式驗證。
failurePolicy: 定義 webhook 無法響應(yīng)時的 API Server行為攘烛。 允許的值為“
Ignore
”或“Fail
”魏滚。 默認(rèn)為“Fail
”。webhookTimeoutSeconds: 指定允許此策略執(zhí)行的最長時間(以秒為單位)坟漱。 默認(rèn)超時為 10 秒鼠次。 該值必須介于 1 到 30 秒之間。
使用 kubectl explain policy.spec
獲取有關(guān)策略 schema 的命令行幫助。
選擇資源
使用 match 和 exclude 過濾和選擇資源腥寇。
match
和 exclude
控制策略應(yīng)用于哪些資源成翩。
match
和 exclude
子句具有相同的結(jié)構(gòu),并且每個子句只能包含以下兩個元素之一:
any
:指定資源過濾器赦役。Kyverno 選擇資源時會在多個資源過濾器直接執(zhí)行邏輯或操作麻敌。all
:指定資源過濾器。Kyverno 選擇資源時會在多個資源過濾器直接執(zhí)行邏輯與操作掂摔。
資源過濾器
可以在 any 或 all 子句下指定以下資源過濾器术羔。
resources
:通過 names、namespaces乙漓、kinds级历、label selectors、annotations 和 namespace selectors 來選擇資源subjects
:選擇用戶叭披、用戶組和 service accountsroles
:選擇 namespace 級的角色clusterRoles
:選擇集群級的角色
注意:直接在 match
和 exclude
下指定資源過濾器已被標(biāo)記為棄用寥殖,并將在未來的版本中刪除。 強烈建議您在 any
或 all
塊下指定它們涩蜘。
必須在 match.(any/all).resources.kinds
或 exclude
塊中指定至少一個元素嚼贡。使用 resources
元素時必須指定 kind
屬性。在 match.(any/all).resources.kinds
字段中可以指定通配符(*
)皱坛。
此外编曼,用戶可以在策略規(guī)則的 match / exclude 聲明中使用 kind 指定 group 和 apiVersion。
支持的格式:
Group/Version/Kind
Version/Kind
Kind
為了解決 kind 命名沖突剩辟,需指定 API group 和 version掐场。例如,Kubernetes API贩猎、Calico 和 Antrea 都注冊了一個名為 NetworkPolicy 的 Kind熊户。
這些可以區(qū)分為:
networking.k8s.io/v1/NetworkPolicy
crd.antrea.io/v1alpha1/NetworkPolicy
通配符支持的格式:
Group/*/Kind
*/Kind
*
注意:
-
match
或exclude
中使用通配符的策略不允許在后臺模式中使用。 - 使用通配符的策略不支持
generate
或verifyImages
規(guī)則類型吭服,也不支持forEach
聲明嚷堡。 - 對于
validate
規(guī)則類型,策略只能處理pattern
或anyPattern
塊中的deny
語句和metadata
對象艇棕。 - 對于
mutate
規(guī)則類型蝌戒,策略只能處理metadata
對象。
可以使用 /
或 .
作為父資源和子資源之間的分隔符沼琉。例如北苟,Pods/status
或 Pods.status
會匹配到子資源。
當(dāng) Kyverno 收到 AdmissionReview 請求(即打瘪,來自 validation 或 mutation webhook)時友鼻,它首先檢查資源和用戶信息是否匹配或是否應(yīng)從處理中排除傻昙。如果兩項檢查都通過,則將規(guī)則邏輯應(yīng)用于變更彩扔、驗證或生成資源妆档。
match 聲明
在任意 rule
聲明中,必須有一個 match
語句作為即將應(yīng)用的規(guī)則的過濾器虫碉。盡管 match
聲明可能會很復(fù)雜贾惦,并有多個不同的元素,但至少要有一個蔗衡。match
聲明中最常見的元素類型是 Kubernetes 類型過濾器纤虽,例如 Pods, Deployments, Services, Namespaces 等。match
和 exclude
聲明中還不支持變量替換绞惦。match 聲明也需要一個 any
或 all
表達(dá)式來實現(xiàn)更靈活的多條件處理。
在這個片段中洋措,match 語句匹配所有名稱為“staging”或在“prod”命名空間中的 Service济蝉。
spec:
rules:
- name: no-LoadBalancer
match:
any:
- resources:
kinds:
- Service
names:
- "staging"
- resources:
kinds:
- Service
namespaces:
- "prod"
通過 match
聲明中多個元素組合,您可以更有選擇性地選擇要處理的資源菠发。此外王滤,還支持通配符以實現(xiàn)更好的控制。例如滓鸠,通過添加 resources.names
字段雁乡,前面的 match
聲明可以進一步篩選名稱以“prod-”開頭或名稱是“staging”的Service。resources.names
可接收一組名稱糜俗,
將匹配所有具有任何一個這些名稱的資源踱稍。
spec:
rules:
- name: no-LoadBalancer
match:
any:
- resources:
names:
- "prod-*"
- "staging"
kinds:
- Service
- resources:
kinds:
- Service
subjects:
- kind: User
name: dave
match.any[0]
會匹配到名稱以“prod-”開頭或是“staging”的、而不是以“dev-”或其它前綴開頭的 Service悠抹。match.any[1]
會匹配到所有由用戶 dave 創(chuàng)建的 Service珠月,而不管 Service 名稱。由于這兩個是在 any
關(guān)鍵字下指定的楔敌,所以啤挎,整個規(guī)則會作用在所有名稱以“prod-”開頭或是“staging”的或由用戶 dave 創(chuàng)建的 Service。match
或 exclude
聲明中都支持通配符卵凑,從而使選擇更加靈活庆聘。
注意:Kyverno 也支持 resources.name
,允許你傳入單個名稱勺卢,而不是一個列表伙判,但是 resources.name
已被棄用,取而代之的是 resources.names
值漫,并將在未來的版本中刪除澳腹。
在這個片段中织盼,match
聲明只會匹配 group 為 networking.k8s.io
,version 是 v1
酱塔,kind 是 NetworkPolicy
的資源沥邻。通過在 match 聲明中添加 Group、Version羊娃、Kind唐全,您可以更有選擇性地選擇要處理的資源。
spec:
rules:
- name: no-LoadBalancer
match:
any:
- resources:
kinds:
- networking.k8s.io/v1/NetworkPolicy
通過在 version/kind
格式中指定 kind
蕊玷,僅匹配資源種類的特定版本邮利。
spec:
rules:
- name: no-LoadBalancer
match:
any:
- resources:
kinds:
- v1/NetworkPolicy
Kyverno 1.5.0之后,kinds
字段支持通配符垃帅,允許您匹配集群中的每種資源類型延届。選擇器標(biāo)簽支持以下路徑中的鍵和值的通配符(* 或?)贸诚。
- match.resources.selector.matchLabels
- exclude.resources.selector.matchLabels
- match.any.resources.selector.matchLabels
- match.all.resources.selector.matchLabels
- exclude.any.resources.selector.matchLabels
- exclude.all.resources.selector.matchLabels
支持的格式:
*
*pattern*
*pattern
pattern?
patte?rn
在以下策略中方庭,檢查所有資源類型是否存在具有鍵 app.kubernetes.io/name 標(biāo)簽。
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: require-labels
spec:
validationFailureAction: audit
background: false
rules:
- name: check-for-labels
match:
any:
- resources:
kinds:
- "*"
preconditions:
any:
- key: "{{ request.operation }}"
operator: Equals
value: CREATE
validate:
message: "The label `app.kubernetes.io/name` is required."
pattern:
metadata:
labels:
app.kubernetes.io/name: "?*"
注意
請記住酱固,在匹配所有類型 (*) 時械念,您編寫的策略必須適用于所有類型。這種通配符匹配的典型用途是 metadata 對象中的元素运悲。
下面是 match 聲明的其它一些示例龄减。
匹配有指定標(biāo)簽的 Deployment 或 StatefulSet
這個示例是選擇有一個有 app=critical 標(biāo)簽的 Deployment 或 StatefulSet。
resources 塊中的條件檢查邏輯遵循“跨類型取和班眯,列表內(nèi)取或”希停。例如,如果規(guī)則匹配包含 kind 列表和 namespace 列表鳖敷,如果請求包含任何一個 (OR) kind AND 任何一個 (OR) namespace脖苏,則將評估該規(guī)則。clusterRoles定踱、roles 和 subjects 中的條件總數(shù)用邏輯 OR 評估棍潘,因為每個請求只能有這些值的一個實例。
下面的片段中崖媚,kinds 和 selector 是對等/兄弟元素亦歉,所以會被 AND 在一起。
spec:
rules:
- name: match-critical-app
match:
any:
# kinds 和 namespaceSelector 是 AND 關(guān)系
- resources:
# kinds 列表內(nèi)是 OR 的關(guān)系
kinds:
- Deployment
- StatefulSet
selector:
matchLabels:
app: critical
可以利用此模式對資源的選擇進行非常細(xì)粒度的控制畅哑,例如肴楷,下面的片段中 match 包含了resources、subjects荠呐、roles 和 clusterRoles 多種元素赛蔫。
match 聲明進階
spec:
# validationFailureAction 當(dāng)策略執(zhí)行失敗時砂客,控制準(zhǔn)入控制器的行為:
# - 'enforce':中斷資源的創(chuàng)建或變更
# - 'audit':允許資源更新并上報策略違規(guī)行為
validationFailureAction: enforce
# 每個策略都有一個按聲明順序應(yīng)用的規(guī)則列表
rules:
# Rules 必須有唯一的名稱
- name: "check-pod-controller-labels"
# 每個規(guī)則會匹配其 "match" 字段在聲明中指定的資源
match:
resources:
kinds: # 必需,kind 列表
- Deployment
- StatefulSet
# 可選的呵恢,資源名稱鞠值。 支持通配符 (* 和 ?)
names:
- "mongo*"
- "postgres*"
# 可選的,namespace 列表渗钉。支持通配符 (* 和 ?)
namespaces:
- "dev*"
- test
# 可選的彤恶,標(biāo)簽選擇器。值支持通配符(* 和 ?)
selector:
matchLabels:
app: mongodb
matchExpressions:
- {key: tier, operator: In, values: [database]}
# 可選的鳄橘,要匹配的用戶或 service accounts
subjects:
- kind: User
name: mary@somecorp.com
# 可選的声离,要匹配的 roles
roles:
# 可選的,要匹配的 clusterroles
clusterRoles:
- cluster-admin
注意
盡管上面的代碼片段對于顯示您可以使用的匹配類型很有用瘫怜,但大多數(shù)策略在其匹配語句中使用一個或幾個不同的元素术徊。
使用標(biāo)簽匹配命名空間中的 Deployments
這個例子使用 namespaceSelector 匹配 namespace 中包含 type=connector 或 type=compute 標(biāo)簽的Deployments。
這里宝磨, kinds 和 namespaceSelector 是 match.resources 下的對等元素弧关,并使用邏輯 AND 操作進行評估。
spec:
rules:
- name: check-min-replicas
match:
any:
# AND across resources and selector
- resources:
# OR inside list of kinds
kinds:
- Deployment
namespaceSelector:
matchExpressions:
- key: type
operator: In
values:
- connector
- compute
組合 match 和 exclude
策略規(guī)則選擇的資源唤锉,必須滿足所有 match 和 exclude 條件。換句話說别瞭,match 和 exclude 條件是按邏輯 AND 評估的窿祥。exclude 塊中的元素遵循與 match 塊中相同的規(guī)范。
排除 cluster-admin ClusterRole
這是一個匹配所有非 cluster-admin ClusterRole 創(chuàng)建的 Pod 的規(guī)則蝙寨。
spec:
rules:
- name: match-pods-except-cluster-admin
match:
any:
- resources:
kinds:
- Pod
exclude:
any:
- clusterRoles:
- cluster-admin
排除 kube-system namespace
這個規(guī)則會匹配除 kube-system namespace 外的所有 Pod晒衩。
注意:從 Kyverno 1.3.0 開始支持按名稱排除指定的 namespace。
spec:
rules:
- name: match-pods-except-admin
match:
any:
- resources:
kinds:
- Pod
exclude:
any:
- resources:
namespaces:
- kube-system
匹配標(biāo)簽并排除用戶和角色
下面的示例會匹配所有包含 app=critical 標(biāo)簽墙歪、并排除有 ClusterRole cluster-admin 或用戶 John 創(chuàng)建的資源听系。
注意
由于 roles 和 clusterRoles 是由 Kyverno 從 AdmissionReview 內(nèi)部構(gòu)建的,包含這些聲明的規(guī)則必須定義 background: false虹菲,因為 AdmissionReview 在 background 模式不可用靠胜。
spec:
rules:
- name: match-criticals-except-given-rbac
match:
any:
- resources:
kind:
- Pod
selector:
matchLabels:
app: critical
exclude:
any:
- clusterRoles:
- cluster-admin
- subjects:
- kind: User
name: John
匹配標(biāo)簽并排除用戶
上述示例的變體,此代碼段使用 any 和 all 聲明來排除多個用戶毕源。
spec:
validationFailureAction: enforce
background: false
rules:
- name: match-criticals-except-given-users
match:
all:
- resources:
kinds:
- Pod
selector:
matchLabels:
app: critical
exclude:
any:
- subjects:
- kind: User
name: susan
- kind: User
name: dave
使用 Annotation 匹配所有 Pod
匹配所有包含 imageregistry: "https://hub.docker.com/" 注解的 Pod浪漠。
spec:
rules:
- name: match-pod-annotations
match:
any:
- resources:
annotations:
imageregistry: "https://hub.docker.com/"
kinds:
- Pod