如何在Kubernetes命名空间中强制应用仅保留1个副本?
Kubernetes集群强制所有应用仅1个副本的实现方案
在开发集群里要卡死所有应用的副本数,不让开发者随便改,资源配额不行的话,这几个方案直接能用:
1. 用Mutating Admission Webhook自动修正
这个是最省心的——用户提交Deployment的时候,不管他写了几个副本,Webhook直接把spec.replicas改成1,悄无声息就修正了,开发者甚至可能没察觉。
- 核心思路:写个简单的Webhook服务,监听所有Deployment的创建/更新请求,只要发现
spec.replicas不是1,就直接把这个字段改成1,再把修改后的请求发回K8s。 - 部署步骤:把Webhook服务部署到集群里,再配置
MutatingWebhookConfiguration,指定只对apps/v1/Deployment这类资源触发就行。
2. 用Validating Admission Webhook直接拒绝
要是不想偷偷改,想直接驳回不符合要求的请求(比如开发者设了2个副本,直接报错不让创建),就用这个。
- 核心思路:Webhook检查每个Deployment请求的
spec.replicas,只要不是1就返回错误,K8s会直接拒绝这个资源的创建或更新,还能给开发者返回提示信息。 - 部署和上面类似,只是配置的是
ValidatingWebhookConfiguration,逻辑改成验证而非修改。
3. 用Kyverno(不用写代码,纯YAML搞定)
Kyverno是Kubernetes原生的策略工具,不用自己写Webhook服务,直接写YAML规则就行,上手快。
示例:强制验证(不符合就拒绝)
apiVersion: kyverno.io/v1 kind: ClusterPolicy metadata: name: enforce-replicas-one spec: validationFailureAction: enforce # 设为enforce直接拒绝,audit只记录不拦截 rules: - name: check-deployment-replicas match: any: - resources: kinds: - Deployment validate: message: "所有应用必须设置replicas=1,不许改!" pattern: spec: replicas: 1
示例:自动修正(偷偷改成1)
把上面的validationFailureAction改成mutate,再加一段mutate规则:
mutate: patchStrategicMerge: spec: replicas: 1
4. 用OPA Gatekeeper(通用策略引擎)
OPA Gatekeeper是更灵活的策略工具,用Rego语言写规则,适合复杂场景,不过规则稍微有点学习成本。
第一步:定义约束模板
apiVersion: templates.gatekeeper.sh/v1 kind: ConstraintTemplate metadata: name: k8sreplicasone spec: crd: spec: names: kind: K8sReplicasOne targets: - target: admission.k8s.gatekeeper.sh rego: | package k8sreplicasone violation[{"msg": msg}] { input.review.object.kind == "Deployment" input.review.object.spec.replicas != 1 msg := sprintf("Deployment %s/%s 必须设置replicas=1", [input.review.object.metadata.namespace, input.review.object.metadata.name]) }
第二步:创建约束生效
apiVersion: constraints.gatekeeper.sh/v1beta1 kind: K8sReplicasOne metadata: name: enforce-replicas-one spec: match: kinds: - apiGroups: ["apps"] kinds: ["Deployment"]
这些方案都是集群级别的管控,除非开发者有修改Webhook、Kyverno策略或Gatekeeper规则的权限,否则没法绕过——开发集群里肯定不会给开发者这么高权限,完全能满足你的需求。
内容的提问来源于stack exchange,提问作者Hound
相关产品推荐
相关产品推荐

