CCE-Kyverno 使用指南:资源数量限制
适用版本:cce-kyverno chart
3.4.6(appVersionv1.14.5)适用集群:百度智能云 CCE 容器引擎 ≥ 1.25 本文档指导你在 CCE 集群中使用 cce-kyverno 实现两类常见的"资源数量限制":
- 限制单个 Deployment 副本数(含
kubectl scale); - 限制单个命名空间内 Pod 总数。
1 安装与卸载(百度智能云模版)
cce-kyverno 通过 Helm chart 进行安装、升级和卸载。
1.1 安装
安装完成后,确认 4 个组件 Pod 全部 Running:
1$ kubectl -n cce-kyverno get pod
2NAME READY STATUS RESTARTS AGE
3cce-kyverno-admission-controller-xxxxxxxxxx-xxxxx 1/1 Running 0 5m
4cce-kyverno-background-controller-xxxxxxxxxx-xxxxx 1/1 Running 0 5m
5cce-kyverno-cleanup-controller-xxxxxxxxxx-xxxxx 1/1 Running 0 5m
6cce-kyverno-reports-controller-xxxxxxxxxx-xxxxx 1/1 Running 0 5m
1.2 升级
1.3 卸载
1.4 关键 values 参数
完整参数请以 chart 自带的 values.yaml 为准;下面列出大多数用户在安装时必须或建议关注的字段。
高可用与资源
| 参数 | 默认值 | 说明 |
|---|---|---|
admissionController.replicas |
nil(1 副本) |
生产环境建议 ≥ 3。admission-controller 一旦不可用会影响所有匹配的 admission 请求。 |
admissionController.podDisruptionBudget.enabled |
false(replicas>1 时自动启用) |
配合多副本,防止节点维护时所有副本同时下线。 |
admissionController.container.resources.limits |
cpu: 8, memory: 32Gi |
默认上限较高,是为大规模集群预留的容量。小规模集群(节点数<50)可下调到 cpu: 2, memory: 4Gi 节省资源。 |
admissionController.container.resources.requests |
cpu: 2, memory: 8Gi |
同上,按集群体量调整。 |
backgroundController.resources / cleanupController.resources / reportsController.resources |
limits.memory: 128Mi |
默认值通常够用;策略很多或资源对象很多时再适当上调。 |
admissionController.autoscaling.enabled |
false |
业务负载波动大时可开启 HPA。 |
镜像仓库
| 参数 | 默认值 | 说明 |
|---|---|---|
admissionController.container.image.defaultRegistry |
registry.baidubce.com |
已默认指向百度智能云镜像仓库,国内集群无需翻墙。 |
admissionController.container.image.tag |
cce-v1.14.5 |
与 chart appVersion 对应的 CCE 定制镜像 tag,不建议修改,除非有特殊版本需求。 |
global.image.registry |
nil |
想要把所有镜像统一指向私有 registry 时,在此一次性覆盖。 |
*.imagePullSecrets |
[] |
如果使用私有 registry 并需要凭证,按需配置。 |
CRD 与命名空间过滤
| 参数 | 默认值 | 说明 |
|---|---|---|
crds.install |
true |
默认由 Helm 安装 Kyverno CRD。如果集群中已通过其他方式安装过 Kyverno CRD,请设为 false 避免冲突。 |
config.resourceFiltersExcludeNamespaces |
[] |
默认 cce-kyverno 会跳过 kube-system / kube-public / kube-node-lease。如需取消跳过,把对应命名空间加到此列表中。 |
config.webhooks.namespaceSelector |
排除 kube-system |
控制 webhook 作用范围。强烈建议保留默认值,避免 cce-kyverno 异常时影响系统组件创建。 |
config.excludeKyvernoNamespace |
true |
默认排除 cce-kyverno 自身命名空间,避免自校验循环。 |
功能开关
| 参数 | 默认值 | 说明 |
|---|---|---|
features.backgroundScan.enabled |
true |
是否开启后台扫描生成 PolicyReport。 |
features.backgroundScan.backgroundScanInterval |
1h |
扫描周期。策略数量较多时可适当延长。 |
features.policyExceptions.enabled |
false |
是否允许使用 PolicyException 资源给个别工作负载打白名单。有按命名空间豁免策略需求时设为 true。 |
webhooksCleanup.enabled |
true |
卸载时自动清理 webhook,建议保留默认。 |
policyReportsCleanup.enabled |
true |
升级时清理历史报告,建议保留默认。 |
调度
| 参数 | 默认值 | 说明 |
|---|---|---|
admissionController.nodeSelector / tolerations / nodeAffinity |
{} / [] |
想把 cce-kyverno 调度到专用节点池时配置;其他三个控制器有同名参数。 |
global.nodeSelector / global.tolerations |
{} / [] |
想统一调度所有控制器时使用。 |
自定义 values 示例
1# my-values.yaml
2admissionController:
3 replicas: 3
4 podDisruptionBudget:
5 enabled: true
6 container:
7 resources:
8 requests: {cpu: 500m, memory: 1Gi}
9 limits: {cpu: 2, memory: 4Gi}
10
11features:
12 backgroundScan:
13 backgroundScanInterval: 2h
14 policyExceptions:
15 enabled: true
16 namespace: "*"
应用:
1helm upgrade --install cce-kyverno ./cce-kyverno \
2 -n cce-kyverno --create-namespace \
3 -f my-values.yaml
2 准备:演示命名空间
默认情况下,
kube-system / kube-public / kube-node-lease命名空间不会被 cce-kyverno 校验,请勿用这些命名空间做演示。 为避免影响其他业务,下文示例都通过namespaceSelector精确限定到带标签kyverno-e2e=enabled的命名空间。
1kubectl create namespace kyverno-e2e
2kubectl label namespace kyverno-e2e kyverno-e2e=enabled --overwrite
3 下发资源数量限制策略
把以下内容保存为 policy-resource-quota.yaml 并执行 kubectl apply -f policy-resource-quota.yaml。
1apiVersion: kyverno.io/v1
2kind: ClusterPolicy
3metadata:
4 name: limit-deployment-replicas
5spec:
6 validationFailureAction: Enforce
7 background: false
8 rules:
9 - name: max-replicas-per-deployment
10 match:
11 any:
12 - resources:
13 kinds: [Deployment, Deployment/scale]
14 namespaceSelector:
15 matchLabels: {kyverno-e2e: enabled}
16 validate:
17 message: "Deployment 副本数不得超过 5(namespace={{ request.namespace }}, current={{ request.object.spec.replicas }})。"
18 deny:
19 conditions:
20 any:
21 - key: "{{ request.object.spec.replicas || `0` }}"
22 operator: GreaterThan
23 value: 5
24
25---
26apiVersion: kyverno.io/v1
27kind: ClusterPolicy
28metadata:
29 name: limit-pods-per-namespace
30spec:
31 validationFailureAction: Enforce
32 background: false
33 rules:
34 - name: max-pods-per-namespace
35 match:
36 any:
37 - resources:
38 kinds: [Pod]
39 operations: [CREATE]
40 namespaceSelector:
41 matchLabels: {kyverno-e2e: enabled}
42 context:
43 - name: podCount
44 apiCall:
45 urlPath: "/api/v1/namespaces/{{ request.namespace }}/pods"
46 jmesPath: "items | length(@)"
47 validate:
48 message: "命名空间 {{ request.namespace }} 中 Pod 数量已达上限 10(当前={{ podCount }})。"
49 deny:
50 conditions:
51 any:
52 - key: "{{ podCount }}"
53 operator: GreaterThanOrEquals
54 value: 10
下发后稍等几秒,确认两条策略均为 READY=True:
1$ kubectl get cpol
2NAME ADMISSION BACKGROUND READY AGE
3limit-deployment-replicas true false True 21s
4limit-pods-per-namespace true false True 21s
想要修改阈值时,直接编辑
value: 5/value: 10后重新 apply 即可。
4 验证策略效果
4.1 验证 Deployment 副本数限制
合规创建(replicas=3,预期成功):
1$ cat <<EOF | kubectl apply -f -
2apiVersion: apps/v1
3kind: Deployment
4metadata:
5 name: demo-good
6 namespace: kyverno-e2e
7spec:
8 replicas: 3
9 selector: {matchLabels: {app: demo-good}}
10 template:
11 metadata: {labels: {app: demo-good}}
12 spec:
13 containers:
14 - name: app
15 image: nginx:1.25-alpine
16EOF
17deployment.apps/demo-good created
违规创建(replicas=8,预期被拒绝):
1$ kubectl apply -f - <<EOF
2apiVersion: apps/v1
3kind: Deployment
4metadata: {name: demo-bad, namespace: kyverno-e2e}
5spec:
6 replicas: 8
7 selector: {matchLabels: {app: demo-bad}}
8 template:
9 metadata: {labels: {app: demo-bad}}
10 spec:
11 containers: [{name: app, image: nginx:1.25-alpine}]
12EOF
13Error from server (Forbidden): admission webhook "validate.kyverno.svc-fail" denied the request:
14limit-deployment-replicas:
15 max-replicas-per-deployment: Deployment 副本数不得超过 5(namespace=kyverno-e2e, current=8)。
违规扩容(kubectl scale,预期被拒绝):
1$ kubectl -n kyverno-e2e scale deployment demo-good --replicas=6
2Error from server (Forbidden): admission webhook "validate.kyverno.svc-fail" denied the request:
3limit-deployment-replicas:
4 max-replicas-per-deployment: Deployment 副本数不得超过 5(namespace=kyverno-e2e, current=6)。
合规扩容(5 副本,预期成功):
1$ kubectl -n kyverno-e2e scale deployment demo-good --replicas=5
2deployment.apps/demo-good scaled
4.2 验证命名空间 Pod 总数限制
让命名空间内 Pod 总数逐渐逼近 10:
1for i in $(seq 1 8); do
2 cat <<EOF | kubectl apply -f -
3apiVersion: v1
4kind: Pod
5metadata: {name: extra-${i}, namespace: kyverno-e2e}
6spec:
7 containers:
8 - name: c
9 image: nginx:1.25-alpine
10EOF
11done
当 namespace 内 Pod 数达到 10 时,后续创建会被拒绝:
1Error from server (Forbidden): admission webhook "validate.kyverno.svc-fail" denied the request:
2limit-pods-per-namespace:
3 max-pods-per-namespace: 命名空间 kyverno-e2e 中 Pod 数量已达上限 10(当前=10)。
5 只审计不阻断(可选)
如果你不想直接阻断业务,只想"看见"违规情况,可以下发审计策略,并在 PolicyReport 中查看结果。
1apiVersion: kyverno.io/v1
2kind: ClusterPolicy
3metadata:
4 name: audit-replicas-gt-3
5spec:
6 validationFailureAction: Audit
7 background: true
8 rules:
9 - name: audit-high-replicas
10 match:
11 any:
12 - resources:
13 kinds: [Deployment]
14 namespaceSelector:
15 matchLabels: {kyverno-e2e: enabled}
16 validate:
17 message: "Deployment 副本 > 3 (current={{ request.object.spec.replicas }})."
18 deny:
19 conditions:
20 any:
21 - key: "{{ request.object.spec.replicas || `0` }}"
22 operator: GreaterThan
23 value: 3
约 30 秒后查看命名空间内的 PolicyReport:
1$ kubectl -n kyverno-e2e get policyreport
2NAME KIND NAME PASS FAIL
32bd37b9c-... Deployment demo-good 2 1
4
5$ kubectl -n kyverno-e2e get policyreport 2bd37b9c-... -o yaml | grep -E 'policy:|message:'
6- policy: audit-replicas-gt-3
7 message: Deployment 副本 > 3 (current=5)
6 清理
1kubectl delete clusterpolicy limit-deployment-replicas limit-pods-per-namespace audit-replicas-gt-3
2kubectl delete namespace kyverno-e2e
7 常见问题
Q1:kubectl scale 没有被拦截?
请检查 match.kinds 中是否同时包含 Deployment 和 Deployment/scale。少了 Deployment/scale,kubectl scale 走的是 scale 子资源接口,不会触发该策略。
Q2:策略下发后报警告 "matching on replicas but not including the scale subresource"?
属于 Kyverno 的友好提醒,按 Q1 把 Deployment/scale 加入 kinds 即可消除。
Q3:策略下发后报 "background scan enabled with subresource Deployment/scale"?
匹配 Deployment/scale 后必须把 background 设为 false。如果你既想阻断又想审计存量,请把"阻断"和"审计"拆成两条策略,审计策略不要匹配 Deployment/scale,但保留 background: true。
Q4:要对其他命名空间生效怎么办?
- 给目标命名空间加上同样的标签:
kubectl label ns <name> kyverno-e2e=enabled; - 或修改策略里的
namespaceSelector.matchLabels,换成你期望的标签 key/value。
Q5:策略不生效,apply 资源没有任何拦截信息?
- 命名空间是否处于默认排除列表(
kube-system / kube-public / kube-node-lease)? - 命名空间是否带上了策略匹配的标签?
- 通过
kubectl get cpol <name>查看READY是否为True,MESSAGE是否有报错。
Q6:如何卸载 cce-kyverno 组件本身?
见第 1.3 节,使用 helm uninstall 即可,组件会自动清理 webhook 配置。
评价此篇文章
