kubectl exec失败的根本原因是API Server与node kubelet通信中断,需检查kubelet状态、10250端口监听、双向网络连通性、证书有效期、节点Ready状态及节点IP配置是否正确。
端口绑定(默认 10250)相关报错
ss -tlnp | grep :10250 或 netstat -tlnp | grep :10250 —— 确认 kubelet 正在监听 10250 端口且未被防火墙拦截验证 API Server 与 kubelet 的双向连通性
API Server 需要能从控制平面网络访问 Node 的 kubelet https 端口(通常是 10250),同时 kubelet 也要能反向连接 API Server(通常 6443):
- 在 master 节点上执行:
curl -k https://—— 应返回:10250/healthz ok;若超时或拒绝连接,检查网络策略、安全组、iptables/firewalld 规则 - 在 Node 上执行:
curl -k https://—— 确保 kubelet 能访问 API Server:6443/healthz - 注意:若集群启用了 kubelet TLS 引导(TLS bootstrap),证书可能过期,需检查
/var/lib/kubelet/pki/下的kubelet-client-current.pem和kubelet-server-current.pem有效期
确认 Pod 网络和 CNI 插件状态
虽然该错误不直接由 CNI 导致,但部分 CNI(如 Calico、Cilium)异常可能间接影响节点健康状态上报,导致 API Server 认为节点 NotReady,进而拒绝 exec 请求:
-
kubectl get nodes—— 查看对应节点是否为Ready状态;若为NotReady,进一步查kubectl describe node中的 Events 和 Conditions -
kubectl get pods -n kube-system | grep -E "(calico|cilium|flannel)"—— 确保 CNI 相关 Pod 全部 Running - 检查 CNI 插件日志,例如:
kubectl logs -n kube-system
排查 kube-apiserver 到 kubelet 的代理路径
当使用 kubectl exec 时,请求路径是:kubectl → apiserver → kubelet。apiserver 通过节点的 internalIP 或 ExternalIP 去 dial kubelet。若节点 IP 地址配置错误,也会触发此错误: