前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Kubernetes 1.26 中更简单的准入控制实战

Kubernetes 1.26 中更简单的准入控制实战

作者头像
我的小碗汤
发布2023-03-20 09:37:12
4400
发布2023-03-20 09:37:12
举报
文章被收录于专栏:我的小碗汤我的小碗汤

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

验证准入策略使用 通用表达语言[1](CEL) 来提供声明性的、进程内的替代方案来 验证准入 webhooks[2]

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

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

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

代码语言:javascript
复制
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 声明这个 ValidatingAdmisonPolicy 可以验证哪些类型的请求。

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

代码语言:javascript
复制
apiVersion: admissionregistration.k8s.io/v1alpha1
kind: ValidatingAdmissionPolicyBinding
metadata:
  name: "demo-binding-test.example.com"
spec:
  policy: "demo-policy.example.com"
  matchResources:
    namespaceSelector:
    - key: environment,
      operator: In,
      values: ["test"]

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

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

验证准入策略是高度可配置的,使策略实施者能够定义可以参数化的策略,并根据集群管理员的需要将其限定为资源。

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

代码语言:javascript
复制
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 变量访问 parameter resource。

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

代码语言:javascript
复制
apiVersion: admissionregistration.k8s.io/v1alpha1
kind: ValidatingAdmissionPolicyBinding
metadata:
  name: "demo-binding-production.example.com"
spec:
  policy: "demo-policy.example.com"
  paramsRef:
    name: "demo-params-production.example.com"
  matchResources:
    namespaceSelector:
    - key: environment,
      operator: In,
      values: ["production"]
代码语言:javascript
复制
apiVersion: rules.example.com/v1 # defined via a CustomResourceDefinition
kind: ReplicaLimit
metadata:
  name: "demo-params-production.example.com"
maxReplicas: 1000

此绑定和 parameter resource 对限制 namespace 的 label 中包含 environmentproduction 下 Deployments 最多 1000 个副本。

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

我希望这能让您瞥见验证准入策略的可能性!我们还没有触及许多功能。

要了解更多信息,请阅读 验证录取策略[4]

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

参考资料

[1]

通用表达语言: https://github.com/google/cel-spec

[2]

验证准入 webhooks: https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/#what-are-admission-webhooks

[3]

CustomResourceDefinitions 的验证规则: https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/#validation-rules

[4]

验证录取策略: https://kubernetes.io/docs/reference/access-authn-authz/validating-admission-policy/

- END -

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-12-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 进击云原生 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 参考资料
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档