Skip to content

Commit b29bc41

Browse files
authored
Merge pull request #42611 from my-git9/validatingadmissionpolicy
[zh-cn] sync access-authn-authz/validating-admission-policy.md
2 parents cb342d9 + db93213 commit b29bc41

13 files changed

+393
-163
lines changed

content/zh-cn/docs/reference/access-authn-authz/validating-admission-policy.md

Lines changed: 193 additions & 163 deletions
Large diffs are not rendered by default.
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# 此策略强制除 "exempt" Deployment 或任何不属于 “example.com” 组织的容器
2+
#(例如常见的 sidecar)外的 Deployment 的所有容器的镜像库与其命名空间的环境标签相匹配。
3+
# 例如,如果命名空间的标签为 {"environment": "staging"},则所有容器镜像必须是
4+
# staging.example.com/* 或根本不包含 “example.com”,除非 Deployment 有
5+
# {"exempt": "true"} 标签。
6+
apiVersion: admissionregistration.k8s.io/v1beta1
7+
kind: ValidatingAdmissionPolicy
8+
metadata:
9+
name: "image-matches-namespace-environment.policy.example.com"
10+
spec:
11+
failurePolicy: Fail
12+
matchConstraints:
13+
resourceRules:
14+
- apiGroups: ["apps"]
15+
apiVersions: ["v1"]
16+
operations: ["CREATE", "UPDATE"]
17+
resources: ["deployments"]
18+
variables:
19+
- name: environment
20+
expression: "'environment' in namespaceObject.metadata.labels ? namespaceObject.metadata.labels['environment'] : 'prod'"
21+
- name: exempt
22+
expression: "'exempt' in object.metadata.labels && object.metadata.labels['exempt'] == 'true'"
23+
- name: containers
24+
expression: "object.spec.template.spec.containers"
25+
- name: containersToCheck
26+
expression: "variables.containers.filter(c, c.image.contains('example.com/'))"
27+
validations:
28+
- expression: "variables.exempt || variables.containersToCheck.all(c, c.image.startsWith(variables.environment + '.'))"
29+
messageExpression: "'only ' + variables.environment + ' images are allowed in namespace ' + namespaceObject.metadata.name"
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
apiVersion: admissionregistration.k8s.io/v1
2+
kind: ValidatingWebhookConfiguration
3+
webhooks:
4+
- name: my-webhook.example.com
5+
matchPolicy: Equivalent
6+
rules:
7+
- operations: ['CREATE','UPDATE']
8+
apiGroups: ['*']
9+
apiVersions: ['*']
10+
resources: ['*']
11+
failurePolicy: 'Ignore' # 打开失败(可选)
12+
sideEffects: None
13+
clientConfig:
14+
service:
15+
namespace: my-namespace
16+
name: my-webhook
17+
caBundle: '<omitted>'
18+
# 每个 Webhook 最多可以有 64 个 matchConditions
19+
matchConditions:
20+
- name: 'exclude-leases' # 每个匹配条件必须有唯一的名称
21+
expression: '!(request.resource.group == "coordination.k8s.io" && request.resource.resource == "leases")' # 匹配非租约(non-lease)资源
22+
- name: 'exclude-kubelet-requests'
23+
expression: '!("system:nodes" in request.userInfo.groups)' # 匹配非节点用户发出的请求
24+
- name: 'rbac' # 跳过由第二个 Webhook 处理的 RBAC 请求。
25+
expression: 'request.resource.group != "rbac.authorization.k8s.io"'
26+
27+
# 此示例说明了 `authorizer` 的用法。授权检查比简单表达式成本更高,
28+
# 因此在本示例中,通过使用第二个 Webhook 将其范围限制为仅 RBAC 请求。
29+
# 两个 Webhook 可以由同一 endpoint 提供服务。
30+
- name: rbac.my-webhook.example.com
31+
matchPolicy: Equivalent
32+
rules:
33+
- operations: ['CREATE','UPDATE']
34+
apiGroups: ['rbac.authorization.k8s.io']
35+
apiVersions: ['*']
36+
resources: ['*']
37+
failurePolicy: 'Fail' # Fail-closed (the default)
38+
sideEffects: None
39+
clientConfig:
40+
service:
41+
namespace: my-namespace
42+
name: my-webhook
43+
caBundle: '<omitted>'
44+
# 每个 webhook 最多可以有 64 个 matchConditions
45+
matchConditions:
46+
- name: 'breakglass'
47+
# 跳过被授权在此 Webhook 上 'breakglass' 的用户发出的请求。
48+
# 'breakglass' API verb 不需要被排查在该检查之外。
49+
expression: '!authorizer.group("admissionregistration.k8s.io").resource("validatingwebhookconfigurations").name("my-webhook.example.com").check("breakglass").allowed()'
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
apiVersion: admissionregistration.k8s.io/v1alpha1
2+
kind: ValidatingAdmissionPolicyBinding
3+
metadata:
4+
name: "demo-binding-test.example.com"
5+
spec:
6+
policyName: "demo-policy.example.com"
7+
validationActions: [Deny]
8+
matchResources:
9+
namespaceSelector:
10+
matchLabels:
11+
environment: test
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
apiVersion: admissionregistration.k8s.io/v1beta1
2+
kind: ValidatingAdmissionPolicy
3+
metadata:
4+
name: "demo-policy.example.com"
5+
spec:
6+
failurePolicy: Fail
7+
matchConstraints:
8+
resourceRules:
9+
- apiGroups: ["apps"]
10+
apiVersions: ["v1"]
11+
operations: ["CREATE", "UPDATE"]
12+
resources: ["deployments"]
13+
validations:
14+
- expression: "object.spec.replicas <= 5"
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
apiVersion: admissionregistration.k8s.io/v1beta1
2+
kind: ValidatingAdmissionPolicyBinding
3+
metadata:
4+
name: "replicalimit-binding-nontest"
5+
spec:
6+
policyName: "replicalimit-policy.example.com"
7+
validationActions: [Deny]
8+
paramRef:
9+
name: "replica-limit-prod.example.com"
10+
namespace: "default"
11+
matchResources:
12+
namespaceSelector:
13+
matchExpressions:
14+
- key: environment
15+
operator: NotIn
16+
values:
17+
- test
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
apiVersion: admissionregistration.k8s.io/v1beta1
2+
kind: ValidatingAdmissionPolicyBinding
3+
metadata:
4+
name: "replicalimit-binding-test.example.com"
5+
spec:
6+
policyName: "replicalimit-policy.example.com"
7+
validationActions: [Deny]
8+
paramRef:
9+
name: "replica-limit-test.example.com"
10+
namespace: "default"
11+
matchResources:
12+
namespaceSelector:
13+
matchLabels:
14+
environment: test
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
apiVersion: admissionregistration.k8s.io/v1beta1
2+
kind: ValidatingAdmissionPolicy
3+
spec:
4+
...
5+
failurePolicy: Ignore # The default is "Fail"
6+
validations:
7+
- expression: "object.spec.xyz == params.x"
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
apiVersion: admissionregistration.k8s.io/v1beta1
2+
kind: ValidatingAdmissionPolicy
3+
metadata:
4+
name: "replicalimit-policy.example.com"
5+
spec:
6+
failurePolicy: Fail
7+
paramKind:
8+
apiVersion: rules.example.com/v1
9+
kind: ReplicaLimit
10+
matchConstraints:
11+
resourceRules:
12+
- apiGroups: ["apps"]
13+
apiVersions: ["v1"]
14+
operations: ["CREATE", "UPDATE"]
15+
resources: ["deployments"]
16+
validations:
17+
- expression: "object.spec.replicas <= params.maxReplicas"
18+
reason: Invalid
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
apiVersion: rules.example.com/v1
2+
kind: ReplicaLimit
3+
metadata:
4+
name: "replica-limit-prod.example.com"
5+
maxReplicas: 100

0 commit comments

Comments
 (0)