Kubernetes ValidatingAdmissionPolicy规则不生效问题排查
Kubernetes ValidatingAdmissionPolicy 副本数管控异常问题解析
问题背景
你尝试通过ValidatingAdmissionPolicy实现Deployment副本数上限管控(不超过5),配置如下:
apiVersion: admissionregistration.k8s.io/v1 kind: ValidatingAdmissionPolicy metadata: name: "max-replicas-policy" spec: failurePolicy: Fail matchConstraints: resourceRules: - apiGroups: ["apps"] apiVersions: ["v1"] operations: ["CREATE", "UPDATE"] # 原配置存在语法错误:多余逗号+错误注释格式 resources: ["deployments"] validations: - expression: "object.spec.replicas <= 5" reason: Invalid message: "The number of replicas cannot exceed 5." --- apiVersion: admissionregistration.k8s.io/v1 kind: ValidatingAdmissionPolicyBinding metadata: name: "max-replicas-policy-binding" spec: policyName: "max-replicas-policy" validationActions: [Deny] matchResources: namespaceSelector: matchLabels: kubernetes.io/metadata.name: wdatp-infra-system
使用kubectl apply能正常触发自定义错误,但遇到三个异常:
kubectl edit修改副本数后被拦截,但未返回自定义错误;kubectl scale可直接将副本数设为6;- HPA/Keda ScaledObject修改副本数时不受管控。
核心原因分析
所有异常的根源都是当前策略未覆盖PATCH操作,同时原配置存在语法问题:
- 原配置的语法错误:YAML不支持
//注释,且数组末尾不能加逗号,这会导致配置解析异常,即使你想后续添加PATCH操作也会失败。 - 各类操作的API请求类型:
kubectl edit:保存修改时,kubectl会发送PATCH请求(而非UPDATE),由于策略只监听CREATE/UPDATE,不会触发你的自定义验证规则,拦截行为来自集群其他默认校验或策略,因此不会返回你的自定义错误。kubectl scale:scale命令本质是通过PATCH请求修改spec.replicas,同样因为策略未监听PATCH操作,直接绕过了管控。- HPA/Keda ScaledObject:这些组件修改Deployment副本数时,统一使用
PATCHAPI请求,你的策略未覆盖该操作类型,因此不会被拦截。
解决方案
修正策略配置,添加PATCH操作并修复语法错误:
apiVersion: admissionregistration.k8s.io/v1 kind: ValidatingAdmissionPolicy metadata: name: "max-replicas-policy" spec: failurePolicy: Fail matchConstraints: resourceRules: - apiGroups: ["apps"] apiVersions: ["v1"] operations: ["CREATE", "UPDATE", "PATCH"] # 添加PATCH操作,修正语法 resources: ["deployments"] validations: - expression: "object.spec.replicas <= 5" reason: Invalid message: "The number of replicas cannot exceed 5."
注意:ValidatingAdmissionPolicy处理PATCH请求时,object字段会传入修改后的完整Deployment对象,因此原有的expression无需调整,依然能正确校验最终的副本数。
内容的提问来源于stack exchange,提问作者E. Pratt
相关产品推荐
相关产品推荐

