Kubernetes 1.26 中更简单的准入控制实战
关注公众号并添加到“星标⭐”,防止错过消息
后台回复【资料包】获取学习资料
在 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 可以拥有的副本数量限制。首先定义验证策略:
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
可以验证哪些类型的请求。
接下来将策略绑定到适当的资源:
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 轻松表达。
验证准入策略是高度可配置的,使策略实施者能够定义可以参数化的策略,并根据集群管理员的需要将其限定为资源。
例如,可以修改上面的准入策略以使其可配置:
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。
这允许定义多个绑定,每个绑定都有不同的配置。例如:
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"]
apiVersion: rules.example.com/v1 # defined via a CustomResourceDefinition
kind: ReplicaLimit
metadata:
name: "demo-params-production.example.com"
maxReplicas: 1000
此绑定和 parameter resource 对限制 namespace 的 label 中包含 environment
为production
下 Deployments 最多 1000 个副本。
然后,您可以使用单独的绑定和参数对为test
环境中的 namespace 设置不同的限制。
我希望这能让您瞥见验证准入策略的可能性!我们还没有触及许多功能。
要了解更多信息,请阅读 验证录取策略[4]。
我们正在努力为准入策略添加更多功能,并使增强功能更易于使用。尝试一下,将您的反馈发送给我们,帮助我们构建一个更简单的 admission webhook 替代方案!
作者:Joe Betz、Cici Huang
出处:https://goo.gs/zkmuz译者:#公众号:进击云原生
参考资料
通用表达语言: 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/
后台回复“加群”,带你进入高手交流群
Kubernetes 1.26 正式发布,所有变化都在这儿了!
开源网关 Apache APISIX 认证鉴权精细化实战讲解
保姆级 Prometheus PromQL 讲解与实战操作
38 张图硬核高性能服务器架构设计与调优
20 张图详细理清 K8S Istio Gateway 与实战操作
GitOps 新手入门到专家进阶实战详细教程
8 张图详解 Prometheus AlertManager 实战操作
6 张配图通俗易懂说透 K8S 请求和限制
提高 K8S 监控可观察性最佳方式实战教程Kubernetes 1.26 中的删除、弃用和主要更改46 张图详解 Zabbix 分布式监控平台建设
这 11 张图把 K8S 权限认证说的很清楚了
10 张图解 K8S CNI Calico 网络模型原理与功能实战19 张图详解 Rsync 远程同步K8S 1.25 中的重大更改和删除18 张图 Java 容器化最佳实践总结17 张图实战 + 理清 K8S 网络排错思路,硬核!16 张图硬核讲解 Kubernetes 网络模型