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

Kubernetes 1.26: 推出验证准入策略

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

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

CEL 最早是通过 CustomResourceDefinitions 的验证规则 引入 Kubernetes 的。此增强功能扩展了 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 的命名空间中的部署限制为最多 1000 个副本。

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

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

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

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

如何参与?

如果你想参与准入策略的开发、讨论增强功能路线图或报告 Bug,可以联系 SIG API Machinery 的开发者。