本文档采用自动化机器翻译技术翻译。 尽管我们力求提供准确的译文,但不对翻译内容的完整性、准确性或可靠性作出任何保证。 若出现任何内容不一致情况,请以原始 英文 版本为准,且原始英文版本为权威文本。

这是尚未发布的文档。 Admission Controller 1.34-dev.

配置策略

为特定策略跳过名称空间

默认情况下,策略适用于为 PolicyServer 配置的所有名称空间。 如果您希望策略仅针对特定名称空间,您可以在每个名称空间中部署多个 AdmissionPolicies

另一个选项是通过设置它们的 ClusterAdmissionPolicies 来配置 spec.namespaceSelector(请参见 CRD 文档)。spec.namespaceSelector 决定是否在对象上运行策略,基于该对象的名称空间是否与选择器匹配。

例如,这里有一个仅针对 kube-systemmy-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-systemmy-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 字段在 ClusterAdmissionPolicyAdmissionPolicy 类型中可以用于实现此目的。

ClusterAdmissionPolicyGroupAdmissionPolicyGroup 已经有一个 message 字段,其行为相同。

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 策略仅支持许可列表,而不支持拒绝列表.

一个常见的模式是将您的策略包装在 AdmissionPolicyGroupClusterAdmissionPolicyGroup 中,并在其 spec.expression 中否定策略的结果。

例如,假设我们希望用户使用集群中定义的所有优先级类,除了以下之一:low-prioritymed-priorityhigh-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"