本文发布于Cylon的收藏册,转载请著名原文链接~


相关阅读:深入理解Kubernetes 4A - Admission Control源码解析

准入 (Admission) 是 Kubernetes 提供 4A 安全认证中的一个步骤,在以前版本中 (1,26-),官方提供了 webhook 功能,使用户可以自行的定义 Kubernetes 资源准入规则,但这些是有成本的,需要自行开发 webhook,下图是 Kubernetes准入控制流程。

准入控制器阶段

图:Kubernetes API 请求的请求处理步骤图
Source:https://kubernetes.io/blog/2019/03/21/a-guide-to-kubernetes-admission-controllers/

在 Kubernetes 1.26 时 引入了 ValidatingAdmissionPolicy alpha 版,这个功能等于将 Admission Webhook controller 作为了一个官方扩展版,通过资源进行自行扩展,通过这种方式带来下面优势:

  • 减少了准入请求延迟,提高可靠性和可用性
  • 能够在不影响可用性的情况下失败关闭
  • 避免 webhooks 的操作负担

ValidatingAdmissionPolicy 说明

验证准入策略提供一种声明式的、进程内的替代方案来验证准入 Webhook。

验证准入策略使用通用表达语言 (Common Expression Language,CEL) 来声明策略的验证规则。 验证准入策略是高度可配置的,使配置策略的作者能够根据集群管理员的需要, 定义可以参数化并限定到资源的策略

下面是一个 ValidatingAdmissionPolicy 的示例,配置 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"

这里 规格 Spec 中有两个关键属性:

  • expression 字段包含用于验证的 CEL 表达式
  • matchConstraints 声明什么表达式应用的类型

在声明完规则后还需要应用到资源上才生效,这里 Kubernetes 还有另外一个资源类型 ValidatingAdmissionPolicyBinding 可以声明 “资源” 和 “策略” 绑定到一起,例如下面示例

apiVersion: admissionregistration.k8s.io/v1alpha1
kind: ValidatingAdmissionPolicyBinding
metadata:
  name: "demo-binding-test.example.com"
spec:
  policyName: "demo-policy.example.com"
  validationActions: [Deny]
  matchResources:
    namespaceSelector:
      matchLabels:
        environment: test

在这里需要注意的是,每个 ValidatingAdmissionPolicyBinding 必须指定一个或多个 validationActions 来声明如何执行策略的 validations,其中 validationActions 包括:

  • Deny: 验证失败会导致请求被拒绝。
  • Warn: 验证失败会作为警告报告给请求客户端。
  • Audit: 验证失败会包含在 API 请求的审计事件中。

这三个值可以同时设置,表示同时生效,例如:同时向客户端发出验证失败的警告并记录验证失败的审计记录,可以按照下面配置

validationActions: [Warn, Audit]

其中,DenyWarn 不能一起使用,因为这种组合会不必要地将验证失败重复输出到 API 响应体和 HTTP 警告头中。

ValidatingAdmissionPolicy 的高级可用性

ValidatingAdmissionPolicy 也是一种高度可自由配置的功能,这种方式使策略维护者能够自定义==可根据需要参数化并限定资源范围的策略== 。 例如下面一个策略示例

apiVersion: admissionregistration.k8s.io/v1alpha1
kind: ValidatingAdmissionPolicy
metadata:
  name: "demo-policy.example.com"
spec:
  paramKind:
    apiVersion: rules.example.com/v1 # 这个资源是通过CRD自定义的集群资源
    kind: ReplicaLimit
  matchConstraints:
    resourceRules:
    - apiGroups:   ["apps"]
      apiVersions: ["v1"]
      operations:  ["CREATE", "UPDATE"]
      resources:   ["deployments"]
  validations:
    - expression: "object.spec.replicas <= params.maxReplicas"

在这个示例中,使用了 paramKind,这个可以使得管理员可以通过 CRD 的形式扩展策略本身,而这个 CRD 资源可以定义为下面示例所提到的

apiVersion: rules.example.com/v1 # 使用 CRD 方式定义策略本身参数
kind: ReplicaLimit
metadata:
  name: "demo-params-production.example.com"
maxReplicas: 1000

最终使用了 ValidatingAdmissionPolicyBinding 资源将 “策略” , “规则” , “限制参数” 进行了解耦合,更灵活性的引用了 ValidatingAdmissionPolicy

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

如何启用 ValidatingAdmissionPolicy

  • 确保 ValidatingAdmissionPolicy 启用特性门控 (feature gates)。
  • 确保 admissionregistration.k8s.io/v1beta1 API 启用。
--feature-gates=ValidatingAdmissionPolicy=true

总结

ValidatingAdmissionPolicy 作为 kube-apiserver 内置的功能,减少了 Kubernetes 使用者的维护成本,避免了 webhook 不可控因素影响整个集群,并带来个更便捷的管理方式,使得 Kubernetes 越来越像从工具传变成一个产品,大大加强了 Kubernetes 使用者灵活管控集群的方式。更高级的用法,以及 CEL 的使用可以参考附录官方文档

深入理解Kubernetes 4A - Admission Control源码解析

Reference

[1] 验证准入策略(ValidatingAdmissionPolicy)

[2] Kubernetes validation admission policies

[3] Kubernetes 1.26: Introducing Validating Admission Policies

本文发布于Cylon的收藏册,转载请著名原文链接~

链接:https://www.oomkill.com/2023/11/kubernetes-validatingadmissionpolicy/

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」 许可协议进行许可。