You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 00:55:20