如何覆盖kops默认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,修改后再重新应用:
- 先导出默认的kube-dns addon配置:
kops get addon kube-dns -o yaml > custom-kube-dns.yaml
- 编辑这个yaml文件,找到Deployment里的容器资源配置部分,替换成你需要的限制:
# 找到spec.template.spec.containers[0].resources,改成你的配置 resources: requests: cpu: "100m" memory: "128Mi" limits: cpu: "500m" memory: "512Mi"
- 把自定义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

