为何kubeadm upgrade apply命令不自动升级kubelet和kubectl,需单独执行升级步骤?
其实这事儿得从kubeadm的「分工定位」说起——它本质上是个Kubernetes集群管控面的生命周期管家,只负责集群核心管控组件的升级,根本没把kubelet、kubectl的升级纳入自己的职责范围,官方文档里也明确说了:kubeadm will not install or manage kubelet or kubectl for you。
具体来说有这几个关键原因:
kubelet是节点级组件,升级需要用户掌控节奏
kubelet是每个节点上的「小管家」,负责管理节点上的Pod。升级kubelet需要先把节点标记为不可调度(cordon)、排空已运行的Pod(drain),这一步直接关系到业务的可用性。如果kubeadm自动替你做了,万一集群里有正在运行的关键业务,突然被排空中断,那锅谁背?所以官方把这个控制权完全交给你,让你可以根据业务情况分批升级节点,比如先升级测试节点,再升级生产节点,甚至有些特殊节点可以延后升级。kubectl是客户端工具,兼容性灵活且无需集群管控
kubectl是你和集群交互的「遥控器」,它不一定和kubeadm运行在同一台机器上——比如你可能在本地笔记本上用kubectl连远程集群。而且Kubernetes的版本兼容规则很宽松:kubectl只要和管控面版本差不超过1个小版本(比如管控面是v1.26,kubectl用v1.25或v1.27都可以),就能正常工作。所以你完全可以根据自己的需求选择什么时候升级kubectl,甚至同时用多个版本的kubectl连接不同集群,kubeadm犯不着多管闲事。kubeadm只聚焦集群核心一致性
从kubeadm upgrade apply的执行日志就能看到,它只会升级etcd、kube-apiserver、kube-controller-manager、kube-scheduler这些集群管控核心组件——这些组件必须保持版本一致,才能保证集群的稳定运行,所以kubeadm会严格协调它们的升级流程。而kubelet和kubectl不属于这个核心管控圈,自然不在它的管辖范围内。
总结下来就是:kubeadm只做自己最擅长的「集群管控面升级」,把节点组件和客户端工具的升级自主权还给用户,既保证了集群核心的一致性,又给用户留足了灵活操作的空间。
备注:内容来源于stack exchange,提问作者Ryan Lyu

