在宿主机上执行kubectl 命令时,出现如下错误
[root@root ~] kubectl get namespaces
The connection to the server xxx.xx.xx.xx:6443 was refused - did you specify the right host or port?
然后再网上找寻解决方案,发现各种各样的解决方案都存在。有说IP映射错了的、有说没有admin.conf文件的,还有说是看看k8s部分组件启动失败的等等,好多都解决不了我的问题。但是也不失为排查的一些思路,于是整理下来。
下面是各种方案:
一、排除k8s组件是否存在启动失败的情况
6443端口是kubelet的api监听端口,可能是kubelet启动失败,查看kubelet状态,分析日志。
1.查看状态
systemctl status kubelet
2.查看日志
journalctl -xefu kubelet
经过上面两个步骤发现,日志好像并没有起到作用,就是一直请求失败,看不出任何原因。
3.查看容器状态
ps ef -a
查看k8s相关的组件是否启动失败,如果你刚重启过k8s,最好仔细排查,可能就是某些组件没有启动成功导致的。
下面是k8s某些组件没有启动成功的状态:
[root@master ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
56f463b5684b 9b60aca1d818 "kube-controller-man…" 40 hours ago Exited (2) 39 hours ago k8s_kube-controller-manager_kube-controller-manager-master_kube-system_8f99a56fb3eeae0c61283d6071bfb1f4_5
5043f1103f1f aaefbfa906bd "kube-scheduler --au…" 40 hours ago Exited (2) 39 hours ago k8s_kube-scheduler_kube-scheduler-master_kube-system_285062c53852ebaf796eba8548d69e43_5
2d707069ab22 bfe3a36ebd25 "/coredns -conf /etc…" 41 hours ago Exited (0) 39 hours ago k8s_coredns_coredns-6d56c8448f-mt7vz_kube-system_abc65488-0a54-4a1a-8e23-339f3f23f6d2_0
0dadfca20cb7 bfe3a36ebd25 "/coredns -conf /etc…" 41 hours ago Exited (0) 39 hours ago k8s_coredns_coredns-6d56c8448f-hdtlf_kube-system_e1f90d02-77d0-4529-bea5-b4a72cdb4cf5_0
f25051c775cf registry.aliyuncs.com/google_containers/pause:3.2 "/pause" 41 hours ago Exited (0) 39 hours ago k8s_POD_coredns-6d56c8448f-mt7vz_kube-system_abc65488-0a54-4a1a-8e23-339f3f23f6d2_0
b24a10712152 registry.aliyuncs.com/google_containers/pause:3.2 "/pause" 41 hours ago Exited (0) 39 hours ago k8s_POD_coredns-6d56c8448f-hdtlf_kube-system_e1f90d02-77d0-4529-bea5-b4a72cdb4cf5_0
fed8e33864c1 e708f4bb69e3 "/opt/bin/flanneld -…" 41 hours ago Exited (137) 39 hours a
如果出现上面的情况,重启对应的容器,启动成功问题大概就解决了。
由于我的容器全部启动成功,而且近期没有重启k8s的操作。所以不是这儿的问题,需要继续往下排除了。。。
二、admin.conf 文件
kubectl命令需要使用kubernetes-admin来运行,需要admin.conf文件。
conf文件是通过“ kubeadmin init”命令在主节点/etc/kubernetes 中创建,但是从节点没有conf文件,也没有设置 KUBECONFIG =/root/admin.conf环境变量,所以需要复制conf文件到从节点,并设置环境变量。
1.主节点的admin.conf拷贝到从节点
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
2.设置环境变量
#拷贝admin.conf注意路径
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile
=========
这个方案网上出现的最多,但我的是master节点,查看/etc/kubernetes目录下是存在 admin.conf文件的。且之前kubectl 命令是可用,证明环境变量也是存在的。无法解决我的问题。
三、IP映射问题
如果查看kubectl日志,出现如下日志,大概率是IP映射的问题了。
journalctl -xeu kubelet
5月 30 17:42:58 master.com kubelet[1049]: E0530 17:42:58.314060 1049 kubelet.go:2183] node "master.com" not found
5月 30 17:42:58 master.com kubelet[1049]: E0530 17:42:58.414432 1049 kubelet.go:2183] node "master.com" not found
5月 30 17:42:58 master.com kubelet[1049]: E0530 17:42:58.514811 1049 kubelet.go:2183] node "master.com" not found
5月 30 17:42:58 master.com kubelet[1049]: E0530 17:42:58.615160 1049 kubelet.go:2183] node "master.com" not found
5月 30 17:42:58 master.com kubelet[1049]: E0530 17:42:58.715273 1049 kubelet.go:2183] node "master.com" not found
5月 30 17:42:58 master.com kubelet[1049]: E0530 17:42:58.815516 1049 kubelet.go:2183] node "master.com" not found
5月 30 17:42:58 master.com kubelet[1049]: E0530 17:42:58.915924 1049 kubelet.go:2183] node "master.com" not found
5月 30 17:42:59 master.com kubelet[1049]: E0530 17:42:59.000379 1049 event.go:273] Unable to write event: 'Post "https://192.168.127.128:6443/api/v1/namespaces/default/events">
5月 30 17:42:59 master.com kubelet[1049]: E0530 17:42:59.016347 1049 kubelet.go:2183] node "master.com" not found
5月 30 17:42:59 master.com kubelet[1049]: E0530 17:42:59.116651 1049 kubelet.go:2183] node "master.com" not found
5月 30 17:42:59 master.com kubelet[1049]: E0530 17:42:59.217157 1049 kubelet.go:2183] node "master.com" not found
5月 30 17:42:59 master.com kubelet[1049]: E0530 17:42:59.317429 1049 kubelet.go:2183] node "master.com" not found
这说明master节点无法找到 master.com,查看kubelet配置的ip
1. 查看kubelet配置的ip
cat /etc/kubernetes/kubelet.conf
2.查看宿主机ip
ifconfig
两者一致,说明ip是正确的,这说明宿主机的/ets/hosts 配置有问题。如果ip不一致,则需要修改kubelet、kubeadm、api-server对应的ip。
3.查看host文件
cat /etc/hosts
修改主机名为 master.com即可
但我的依旧配置正确,前面也提到了,我之前的 kubectl 命令是可以用的,只是忽然失效了。所以继续排除ing...
四、排除宿主机磁盘空间
其实在输入命令行的时候就已经发现有问题了。
使用 cd 命令 Tab 键进行命令补全时提示:无法为立即文档创建临时文件: 设备上没有空间
磁盘空间不足了,解决步骤如下:
1.查看磁盘空间使用情况
df -Th
可以看到,我的 /dev/mapper/cemtos-root 和 docker overlay 已经爆满了。
2.查看大文件
cd /
# 其中--max-depth=1就是递归查看深度为1
du -h --max-depth=1
可以看到 /docker 路径下占用了 177G,基本上就是docker overlay2占用了大量的磁盘空间,但对于docker镜像那些可以用的,那些是不可以用的,我们也不清楚,所以不能单纯的用 rm -rf 的命令直接删除了。
3.删除无用镜像或容器
#用于清理磁盘,删除关闭的容器、无用的数据卷和网络,以及dangling镜像(即无tag的镜像)
docker system prune
#清理得更加彻底,可以将没有容器使用Docker镜像都删掉
docker system prune -a
我的问题到了这一步就解决了,kubectl 命令恢复了。如果你的问题到达这一步依旧不行,只能进行 docker 的迁移,或者宿主机升配了。
其实到这里也能发现, kubectl 命令失败server was refused 的问题,不仅仅是一种情况导致的,可能会有各种各样的问题。我都想象不到磁盘空间占满还能导致 kubectl 命令不可用。
总之网上的解决方案有很多,但不一定适合你,你要做的是把其他的贴子当作参考,并细心的排查自己的问题了。