为何`kubectl get pods`突然执行失败?求助排查原因
问题分析:kubectl 突发无法连接 Kubernetes API Server
问题场景
在主节点通过kubectl apply部署首个Pod后,第一次执行kubectl get pods能正常返回处于Pending状态的Pod;无任何操作的情况下再次执行该命令,直接出现连接拒绝错误:
ubuntu:~$ kubectl get pods NAME READY STATUS RESTARTS AGE nginx 0/1 Pending 0 18s ubuntu:~$ kubectl get pods The connection to the server xxx.xxx.xxx.xxx:6443 was refused - did you specify the right host or port?
补充信息:主节点kubelet.service状态显示正常运行:
● kubelet.service - kubelet: The Kubernetes Node Agent Loaded: loaded (/lib/systemd/system/kubelet.service; enabled; vendor preset: enabled) Drop-In: /etc/systemd/system/kubelet.service.d └─10-kubeadm.conf Active: active (running) since Thu 2023-04-20 02:12:52 UTC; 23min ago
可能的原因排查方向
1. API Server 进程崩溃或异常停止
kubectl通过6443端口与API Server通信,连接被拒绝最直接的原因是API Server未正常运行。kubelet正常不代表API Server状态正常,二者是独立组件,API Server可能因资源不足、配置错误或进程崩溃停止。
- 检查API Server容器状态:执行
crictl ps | grep kube-apiserver(如果本地套接字未受影响,也可以用kubectl get pods -n kube-system | grep kube-apiserver) - 查看API Server日志:
journalctl -u kube-apiserver(systemd管理场景)或kubectl logs -n kube-system <kube-apiserver-pod-name>
2. 6443端口被占用或防火墙拦截
- 检查端口监听情况:
ss -tulpn | grep :6443,确认是否有其他进程占用该端口,或API Server是否在正常监听 - 排查防火墙规则:主节点的ufw/iptables可能突发启用了拦截规则,执行
ufw status或iptables -L -n查看是否阻断了6443端口的本地连接
3. kubeconfig 配置文件异常
虽然第一次执行正常,但默认配置文件~/.kube/config可能被意外修改(比如服务器地址变更、证书过期、文件权限被篡改)。
- 检查配置文件内容:
cat ~/.kube/config,确认clusters段的server地址是否正确,证书文件是否存在且权限为600
4. Etcd 集群故障
API Server依赖Etcd存储集群数据,若Etcd停止运行或数据损坏,API Server会无法正常提供服务。
- 检查Etcd状态:
kubectl get pods -n kube-system | grep etcd,或执行etcdctl endpoint health(需提前配置Etcd环境变量) - 查看Etcd日志:
journalctl -u etcd或kubectl logs -n kube-system <etcd-pod-name>
5. 节点资源耗尽导致API Server被OOM Kill
主节点内存/CPU资源耗尽时,系统的OOM Killer可能会终止API Server进程。
- 检查系统日志:
dmesg | grep oom-killer,确认是否有API Server被杀死的记录 - 查看节点资源占用:
top或htop实时监控CPU、内存使用情况
内容的提问来源于stack exchange,提问作者Daniel Stephens
相关产品推荐
相关产品推荐

