本文已超过一年。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已变得不正确。

Kubernetes 1.26:引入验证准入策略

在 Kubernetes 1.26 中,验证准入策略的第一个 alpha 版本可用!

验证准入策略使用 通用表达式语言(CEL)来提供声明式、进程内的替代方案,以取代验证准入 Webhook

CEL 最初引入 Kubernetes 是为了CustomResourceDefinitions 的验证规则。此增强功能扩展了 CEL 在 Kubernetes 中的使用,以支持更广泛的准入用例。

准入 Webhook 的开发和操作可能很麻烦。Webhook 开发人员必须实现并维护一个 Webhook 二进制文件来处理准入请求。此外,准入 Webhook 的操作也很复杂。每个 Webhook 都必须进行部署、监控,并具有明确的升级和回滚计划。更糟糕的是,如果 Webhook 超时或变得不可用,Kubernetes 控制平面可能会变得不可用。此增强功能通过将 CEL 表达式嵌入到 Kubernetes 资源中,而不是调用远程 Webhook 二进制文件,从而避免了准入 Webhook 的大部分复杂性。

例如,要限制 Deployment 可以拥有的副本数量。首先定义一个验证策略

apiVersion: admissionregistration.k8s.io/v1alpha1
kind: ValidatingAdmissionPolicy
metadata:
  name: "demo-policy.example.com"
spec:
  matchConstraints:
    resourceRules:
    - apiGroups:   ["apps"]
      apiVersions: ["v1"]
      operations:  ["CREATE", "UPDATE"]
      resources:   ["deployments"]
  validations:
    - expression: "object.spec.replicas <= 5"

expression 字段包含用于验证准入请求的 CEL 表达式。matchConstraints 声明此 ValidatingAdmissionPolicy 可能验证的请求类型。

接下来,将策略绑定到适当的资源

apiVersion: admissionregistration.k8s.io/v1alpha1
kind: ValidatingAdmissionPolicyBinding
metadata:
  name: "demo-binding-test.example.com"
spec:
  policyName: "demo-policy.example.com"
  matchResources:
    namespaceSelector:
      matchExpressions:
      - key: environment
        operator: In
        values:
        - test

ValidatingAdmissionPolicyBinding 资源仅将上述策略绑定到 environment 标签设置为 test 的命名空间。创建此绑定后,kube-apiserver 将开始强制执行此准入策略。

为了强调此方法比准入 Webhook 简单得多,如果此示例改为使用 Webhook 实现,则需要开发和维护整个二进制文件,仅用于执行 <= 检查。在我们对生产中使用的各种准入 Webhook 的审查中,绝大多数执行的检查都相对简单,所有这些检查都可以使用 CEL 轻松表达。

验证准入策略是高度可配置的,使策略作者能够定义可参数化并按集群管理员的需要范围限定到资源的策略。

例如,可以修改上述准入策略使其可配置

apiVersion: admissionregistration.k8s.io/v1alpha1
kind: ValidatingAdmissionPolicy
metadata:
  name: "demo-policy.example.com"
spec:
  paramKind:
    apiVersion: rules.example.com/v1 # You also need a CustomResourceDefinition for this API
    kind: ReplicaLimit
  matchConstraints:
    resourceRules:
    - apiGroups:   ["apps"]
      apiVersions: ["v1"]
      operations:  ["CREATE", "UPDATE"]
      resources:   ["deployments"]
  validations:
    - expression: "object.spec.replicas <= params.maxReplicas"

在此,paramKind 定义用于配置策略的资源,expression 使用 params 变量来访问参数资源。

这允许定义多个绑定,每个绑定的配置都不同。例如

apiVersion: admissionregistration.k8s.io/v1alpha1
kind: ValidatingAdmissionPolicyBinding
metadata:
  name: "demo-binding-production.example.com"
spec:
  policyName: "demo-policy.example.com"
  paramRef:
    name: "demo-params-production.example.com"
  matchResources:
    namespaceSelector:
      matchExpressions:
      - key: environment
        operator: In
        values:
        - production
apiVersion: rules.example.com/v1 # defined via a CustomResourceDefinition
kind: ReplicaLimit
metadata:
  name: "demo-params-production.example.com"
maxReplicas: 1000

此绑定和参数资源对将 environment 标签设置为 production 的命名空间中的 Deployment 限制为最多 1000 个副本。

然后,您可以使用单独的绑定和参数对来为 test 环境中的命名空间设置不同的限制。

我希望这能让您了解验证准入策略的可能性!我们还有许多功能尚未涉及。

要了解更多信息,请阅读验证准入策略

我们正在努力为准入策略添加更多功能,并使增强功能更易于使用。试用一下,向我们发送您的反馈,并帮助我们构建一个更简单的替代准入 Webhook 的方案!

如何参与?

如果您想参与准入策略的开发、讨论增强路线图或报告错误,您可以联系 SIG API Machinery 的开发人员。