|
本文档采用自动化机器翻译技术翻译。 尽管我们力求提供准确的译文,但不对翻译内容的完整性、准确性或可靠性作出任何保证。 若出现任何内容不一致情况,请以原始 英文 版本为准,且原始英文版本为权威文本。 |
|
这是尚未发布的文档。 Admission Controller 1.34-dev. |
配置策略
为特定策略跳过名称空间
默认情况下,策略适用于为 PolicyServer 配置的所有名称空间。
如果您希望策略仅针对特定名称空间,您可以在每个名称空间中部署多个 AdmissionPolicies。
另一个选项是通过设置它们的 ClusterAdmissionPolicies 来配置 spec.namespaceSelector(请参见 CRD 文档)。spec.namespaceSelector 决定是否在对象上运行策略,基于该对象的名称空间是否与选择器匹配。
例如,这里有一个仅针对 kube-system 和 my-namespace 名称空间的策略:
---
apiVersion: policies.kubewarden.io/v1
kind: ClusterAdmissionPolicy
metadata:
name: psa-enforcer-privileged-namespaces
spec:
module: registry://ghcr.io/kubewarden/policies/psa-label-enforcer:v1.0.3
rules:
- apiGroups: [""]
apiVersions: ["v1"]
resources: ["namespaces"]
operations:
- CREATE
- UPDATE
mutating: true
namespaceSelector:
matchExpressions:
- key: "kubernetes.io/metadata.name"
operator: In
values: [kube-system, my-namespace]
settings:
modes:
enforce: "privileged"
这里有一个针对除 kube-system 和 my-namespace 之外的所有名称空间的策略:
---
apiVersion: policies.kubewarden.io/v1
kind: ClusterAdmissionPolicy
metadata:
name: psa-enforcer-default-mode
spec:
module: registry://ghcr.io/kubewarden/policies/psa-label-enforcer:v1.0.3
rules:
- apiGroups: [""]
apiVersions: ["v1"]
resources: ["namespaces"]
operations:
- CREATE
- UPDATE
mutating: true
namespaceSelector:
matchExpressions:
- key: "kubernetes.io/metadata.name"
operator: NotIn
values: [kube-system, my-namespace]
settings:
modes:
enforce: "restricted"
自定义拒绝消息
当策略拒绝资源时,显示给用户的消息是由策略作者编写的消息。有时集群操作员可能希望设置自定义拒绝消息。例如,这可以用于指向内部维基或提供更具体的错误代码。
message 字段在 ClusterAdmissionPolicy 和 AdmissionPolicy 类型中可以用于实现此目的。
|
|
message 字段允许集群操作员定义一个自定义拒绝消息,覆盖策略返回的消息。使用此配置时,原始拒绝消息可以在响应的 causes 字段中找到。
apiVersion: policies.kubewarden.io/v1
kind: ClusterAdmissionPolicy
metadata:
name: pod-privileged-with-message
spec:
module: registry://ghcr.io/kubewarden/policies/pod-privileged:1.0.2
policyServer: default
mode: protect
message: "Nops! You cannot do that"
settings: {}
rules:
- apiGroups:
- ""
apiVersions:
- v1
resources:
- "*"
operations:
- CREATE
mutating: false
您可以通过提高 kubectl 的详细级别来获取被拒绝的准入请求的完整详细信息:
$ kubectl -v4 run pod-privileged2 --image=registry.k8s.io/pause --privileged
I0612 16:32:43.647601 48424 cert_rotation.go:137] Starting client certificate rotation controller
I0612 16:32:43.662550 48424 helpers.go:246] server response object: [{
"metadata": {},
"status": "Failure",
"message": "admission webhook \"clusterwide-pod-privileged-with-message.kubewarden.admission\" denied the request: Nops! You cannot do that",
"details": {
"causes": [
{
"message": "Privileged container is not allowed"
}
]
},
"code": 400
}]
通过将其包装在 PolicyGroup 中来否定策略结果
有时在使用策略时,它并未实现您所需的反向逻辑。
例如,您想使用 priority-class 策略 来拒绝一组优先级类。但在撰写时,priority-class 策略仅支持许可列表,而不支持拒绝列表.
一个常见的模式是将您的策略包装在 AdmissionPolicyGroup 或 ClusterAdmissionPolicyGroup 中,并在其 spec.expression 中否定策略的结果。
例如,假设我们希望用户使用集群中定义的所有优先级类,除了以下之一:low-priority、med-priority 和 high-priority。
目前,策略设置仅允许表达允许的优先级类列表。以下组策略克服了这一限制。
apiVersion: policies.kubewarden.io/v1
kind: AdmissionPolicyGroup
metadata:
name: priority-class-denylist
namespace: your-namespace # or use a CLusterAdmissionPolicyGroup and set spec.namespaceSelector
spec:
rules:
- apiGroups: [""]
apiVersions: ["v1"]
resources: ["pods"]
operations: ["CREATE", "UPDATE"]
- apiGroups: [""]
apiVersions: ["v1"]
resources: ["replicationcontrollers"]
operations: ["CREATE", "UPDATE"]
- apiGroups: ["apps"]
apiVersions: ["v1"]
resources: ["deployments", "replicasets", "statefulsets", "daemonsets"]
operations: ["CREATE", "UPDATE"]
- apiGroups: ["batch"]
apiVersions: ["v1"]
resources: ["jobs", "cronjobs"]
operations: ["CREATE", "UPDATE"]
policies:
is_a_denied_priority_class:
module: ghcr.io/kubewarden/policies/priority-class-policy:v1.0.4
settings:
allowed_priority_classes:
- low-priority
- med-priority
- high-priority
expression: "!is_a_denied_priority_class()" # negated result
message: "the Pod is using a priorityClass that is not allowed"