Kubernetes 1.9.0升级至1.10时kubeadm upgrade plan报错如何解决?
解决kubeadm upgrade plan无法解码配置的问题
我之前在升级Kubernetes集群时遇到过一模一样的错误,这个问题大多是kubeadm-config ConfigMap的YAML格式有误,或者新旧kubeadm版本的配置结构不兼容导致的,下面是我亲测有效的解决步骤:
1. 先备份现有配置(重要!)
不管后续怎么操作,先把当前的kubeadm-config备份下来,避免改错了无法恢复:
kubectl -n kube-system get cm kubeadm-config -oyaml > kubeadm-config-backup.yaml
2. 检查ConfigMap的YAML格式
解码失败最常见的原因是YAML语法错误,比如缩进不对、冒号后面没加空格、特殊字符没有转义等。执行下面的命令查看完整配置:
kubectl -n kube-system get cm kubeadm-config -oyaml
仔细检查data字段下的配置内容,尤其是ClusterConfiguration部分,确保符合YAML规范。比如:
- 所有层级的缩进必须是2个空格(不要用Tab)
- 键名后面的冒号必须跟一个空格,比如
apiServer:而不是apiServer:(无空格) - 字符串如果包含特殊字符(比如冒号、空格),需要用引号包裹
3. 确保使用目标版本的kubeadm
升级操作必须使用**目标版本(1.10)**的kubeadm来执行,如果你当前用的还是1.9的kubeadm,就会出现配置结构不兼容的问题。先安装1.10版本的kubeadm:
Debian/Ubuntu系统:
apt-get update && apt-get install -y kubeadm=1.10.0-00
RHEL/CentOS系统:
yum install -y kubeadm-1.10.0-0
4. 修复或重新生成kubeadm-config ConfigMap
如果检查后发现配置结构和1.10版本不兼容(比如1.9的某些字段在1.10中被废弃或修改了),可以重新生成符合1.10规范的配置:
- 先导出1.10版本的默认配置模板:
kubeadm config print init-defaults > kubeadm-config-1.10.yaml
- 编辑这个模板,替换成你现有集群的实际配置:
- 修改
apiServer.certSANs为你集群的API服务器地址、域名或IP - 修改
networking.podSubnet为你当前使用的Pod网络CIDR(比如10.244.0.0/16) - 修改
controlPlaneEndpoint为你的控制节点地址
- 修改
- 用新配置更新ConfigMap:
kubectl -n kube-system replace cm kubeadm-config --from-file=kubeadm-config-1.10.yaml
如果上述方法无效,可以尝试删除旧的ConfigMap后重新创建:
kubectl -n kube-system delete cm kubeadm-config kubeadm config print init-defaults | kubectl -n kube-system create cm kubeadm-config --from-file=-
然后再手动编辑ConfigMap补充集群的特定配置。
5. 重新执行升级计划
完成上述操作后,再次运行:
kubeadm upgrade plan
应该就能正常解码配置并显示可用的升级版本了。
内容的提问来源于stack exchange,提问作者sfgroups
相关产品推荐
相关产品推荐

