Kubernetes集群中metrics-server更新后自动回滚问题求助
当metrics-server更新后10-15分钟自动恢复到旧状态,说明有集群管理组件或控制器在**自动调和(reconcile)**该资源,强制恢复其默认配置。以下是排查和解决步骤:
一、定位是谁在修改资源
首先要明确是什么组件在触发回滚操作:
查看
metrics-server部署的详细信息,重点关注事件记录和注解:kubectl describe deployment metrics-server -n kube-system检查是否有类似
kubeadm.kubernetes.io/managed-by、rancher.io/managed这类管理标记注解,以及事件列表中是否有来自其他控制器的更新记录。查看kube-system命名空间最近的事件,筛选与
metrics-server相关的操作:kubectl get events -n kube-system --sort-by='.metadata.creationTimestamp' | grep -i metrics-server检查资源的所有者引用,确认是否被其他控制器托管:
kubectl get deployment metrics-server -n kube-system -o jsonpath='{.metadata.ownerReferences}'
二、针对不同场景的解决方法
场景1:集群由kubeadm部署和管理
kubeadm会自动维护kube-system中的核心组件,手动修改会被其调和逻辑覆盖。正确的更新方式是通过kubeadm配置文件:
- 导出当前kubeadm配置:
kubeadm config view > kubeadm-config.yaml - 在配置文件中找到
addons下的metricsServer节点,修改镜像版本、启动参数等配置项,对齐你的my-updated-metrics-server.yaml内容。 - 应用更新:
或者单独更新metrics-server addon:kubeadm apply --config kubeadm-config.yamlkubeadm init phase addon metrics-server --config kubeadm-config.yaml
场景2:云厂商托管集群(EKS/GKE/AKS等)
云厂商会托管核心组件的生命周期,手动修改会被其后台控制器恢复,必须通过厂商提供的工具更新:
- EKS:使用eksctl更新addon
eksctl update addon --name metrics-server --cluster <你的集群名> --version <目标版本> - GKE:通过gcloud命令更新
gcloud container clusters update <你的集群名> --update-addons=MetricsServer=<目标版本> - AKS:通过Azure CLI更新
az aks update --name <你的集群名> --resource-group <资源组名> --enable-addons monitoring --update-addons monitoring=<目标版本>
场景3:存在自定义控制器/突变Webhook
如果排查到有第三方控制器或mutating webhook在修改metrics-server:
- 找到对应的控制器Pod(如rancher相关控制器、自定义operator),暂时停止Pod(业务允许的情况下),执行更新命令:
kubectl apply -n kube-system -f my-updated-metrics-server.yaml - 检查控制器的配置,将
metrics-server的新配置同步到控制器的管理模板中,避免后续再次被覆盖。 - 对于mutating webhook,检查其规则是否会强制覆盖
metrics-server的配置,修改webhook逻辑或调整其作用范围。
场景4:移除管理标记注解
如果metrics-server部署带有类似kubeadm.kubernetes.io/managed-by的注解,可尝试删除该注解后再更新:
# 删除管理注解 kubectl annotate deployment metrics-server -n kube-system kubeadm.kubernetes.io/managed-by- # 应用更新 kubectl apply -n kube-system -f my-updated-metrics-server.yaml
⚠️ 注意:删除这类注解后,集群管理工具将不再自动维护metrics-server,后续需手动负责其版本升级和故障修复。
三、验证更新是否持久
更新完成后等待15-20分钟,执行以下命令确认配置未被回滚:
kubectl get deployment metrics-server -n kube-system -o yaml | grep -E '(image:|args:|replicas:)'
对比输出内容与你的my-updated-metrics-server.yaml,确认关键配置(如镜像版本、启动参数)一致即可。
内容的提问来源于stack exchange,提问作者Kasper

