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

如何覆盖kops默认kube-dns插件规格以解决OOMKilled问题

解决Kops+Terraform构建的K8s集群中kube-dns OOMKilled的自动化配置方案

我之前也碰到过一模一样的问题——用kops搭的K8s集群跑多了作业就触发kube-dns的OOMKilled,手动改完Deployment,集群一升级又被打回默认配置,新集群还要重复操作,太折腾了。后来摸索出几个能持久化生效的自动化方案,分享给你:

方法1:直接在Kops集群配置里定义kube-dns资源限制

这是最简单直接的方案,kops本身就支持在集群规格里自定义kube-dns的资源请求和限制,完全不需要手动修改Deployment。

如果用kops yaml配置文件:

打开你的集群定义文件(比如cluster.yaml),添加或修改kubeDNS节点的配置:

spec:
  kubeDNS:
    resources:
      requests:
        cpu: "100m"
        memory: "128Mi"
      limits:
        cpu: "500m"
        memory: "512Mi" # 这里改成你需要的内存上限,根据实际负载调整

然后执行以下命令应用配置并滚动更新节点:

kops update cluster --yes
kops rolling-update cluster --yes

如果用Terraform管理kops集群:

在你的kops_cluster资源中嵌入对应的配置即可:

resource "kops_cluster" "main" {
  # 你的其他集群配置...
  spec {
    kube_dns {
      resources {
        requests {
          cpu    = "100m"
          memory = "128Mi"
        }
        limits {
          cpu    = "500m"
          memory = "512Mi"
        }
      }
    }
    # 其他spec配置...
  }
}

执行terraform apply后,这个配置会被持久化到集群状态里,不管是后续升级集群还是用这个模板创建新集群,kube-dns的资源限制都会自动生效,不会被kops的默认配置覆盖。

方法2:用自定义Kops Addon替换默认kube-dns

如果需要更复杂的自定义(比如改镜像版本、加额外环境变量),可以导出默认的kube-dns addon,修改后再重新应用:

  1. 先导出默认的kube-dns addon配置:
kops get addon kube-dns -o yaml > custom-kube-dns.yaml
  1. 编辑这个yaml文件,找到Deployment里的容器资源配置部分,替换成你需要的限制:
# 找到spec.template.spec.containers[0].resources,改成你的配置
resources:
  requests:
    cpu: "100m"
    memory: "128Mi"
  limits:
    cpu: "500m"
    memory: "512Mi"
  1. 把自定义addon应用到集群:
kops replace -f custom-kube-dns.yaml
kops update cluster --yes
kops rolling-update cluster --yes

Terraform中管理自定义addon:

如果用Terraform,可以用kops_addon资源来托管这个自定义配置:

resource "kops_addon" "custom_kube_dns" {
  cluster_name = kops_cluster.main.name
  name         = "kube-dns"
  yaml         = file("${path.module}/custom-kube-dns.yaml")
}

这样每次集群升级或者新建集群,都会优先用你自定义的kube-dns配置,不会被默认值覆盖。

方法3:Mutating Admission Webhook(进阶全局管控)

如果需要给多个集群统一设置kube-dns的资源限制,或者不想依赖kops的配置,可以部署一个Mutating Admission Webhook——它会在kube-dns的Deployment创建或更新时自动注入你想要的资源限制。

这个方案稍微复杂一点,适合有全局集群管控需求的场景,核心就是写一个webhook服务,监听K8s的Deployment事件,匹配到kube-dns(在kube-system命名空间)就自动修改资源限制字段。

验证配置是否生效

不管用哪个方案,配置完后都可以用这条命令检查kube-dns的资源限制是否生效:

kubectl get deployment kube-dns -n kube-system -o jsonpath='{.spec.template.spec.containers[0].resources}'

确认输出里的limits.memory是你设置的值,之后观察kube-dns容器的状态,应该就不会再出现OOMKilled的问题了。


内容的提问来源于stack exchange,提问作者Karen B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:50:25