部分常见问题处理html
Coredns CrashLoopBackOff 致使没法成功添加工做节点的问题git
添加工做节点时提示token过时github
kubectl 执行命令报“The connection to the server localhost:8080 was refused”docker
网络组件flannel没法完成初始化api
部分节点没法启动pod 缓存
最后bash
结合咱们上篇文章(连接:集群故障处理之处理思路以及听诊三板斧(三十三)的处理思路和手段,接下来咱们就进行一些实践讲解。服务器
k8s集群安装完成以后,当咱们添加工做节点时,可能会在长久的等待之中而无任何进展,这时可使用如下命令来查看k8s各个服务的状态:网络
kubectl get pods -n kube-system -o wide
初步诊断容器崩溃,咱们须要进一步查看日志,使用“kubectl logs”:架构
kubectl log -f coredns-5c98db65d4-8wt9z -n kube-system
此次咱们得到了如下具体错误:
github.com/coredns/coredns/plugin/kubernetes/controller.go:322: Failed to list *v1.Namespace: Get https://10.96.0.1:443/api/v1/namespaces?limit=500&resourceVersion=0: dial tcp 10.96.0.1:443: connect: no route to host
解决方案:
这问题颇有多是防火墙(iptables)规则错乱或者缓存致使的,能够依次执行如下命令进行解决:
systemctl stop kubelet systemctl stop docker iptables --flush iptables -tnat --flush systemctl start kubelet systemctl start docker
集群注册token的有效时间为24小时,若是集群建立完成后没有及时添加工做节点,那么咱们须要从新生成token。相关命令以下所示:
#生成token kubeadm token generate #根据token输出添加命令 kubeadm token create <token> --print-join-command --ttl=0

而后仅需复制打印出来的命令到工做节点执行便可。
做为集群管理的核心,工做节点上的kubectl可能一上来就跪了,以下图所示:
出现这个问题的缘由是kubectl命令须要使用kubernetes-admin的身份来运行,在“kubeadm int”启动集群的步骤中就生成了“/etc/kubernetes/admin.conf”。
所以,解决方法以下,将主节点中的【/etc/kubernetes/admin.conf】文件拷贝到工做节点相同目录下:
#复制admin.conf,请在主节点服务器上执行此命令 scp /etc/kubernetes/admin.conf 172.16.2.202:/etc/kubernetes/admin.conf scp /etc/kubernetes/admin.conf 172.16.2.203:/etc/kubernetes/admin.conf
而后分别在工做节点上配置环境变量:
#设置kubeconfig文件 export KUBECONFIG=/etc/kubernetes/admin.conf echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
接下来,工做节点就正常了,如:
网络组件flannel安装完成后,经过命令查看时一直在初始化状态,而且经过日志输出内容以下所示:
kubectl get pods -n kube-system -o wide kubectl logs -f kube-flannel-ds-amd64-hl89n -n kube-system
具体错误日志为:
Error from server: Get https://172.16.2.203:10250/containerLogs/kube-system/kube-flannel-ds-amd64-hl89n/kube-flannel?follow=true: dial tcp 172.16.2.203:10250: connect: no route to host
这时,咱们能够登陆节点所在的服务器,使用如下命令来查看目标节点上的kubelet日志:
journalctl -u kubelet -f
注意:journalctl工具能够查看全部日志,包括内核日志和应用日志。
经过日志,咱们发现是镜像拉取的问题。对此,你们能够参考上文中镜像拉取的方式以及重命名镜像标签来解决此问题,固然也能够经过设置代理来解决此问题。
有时候,咱们部署了应用以后,发如今部分工做节点上pod没法启动(一直处于ContainerCreating的状态):
经过排查日志最终咱们获得重要信息以下所示:
NetworkPlugin cni failed to set up pod "demo-deployment-675b5f9477-hdcwg_default" network: failed to set bridge addr: "cni0" already has an IP address different from 10.0.2.1/24
这是因为当前节点以前被反复注册,致使flannel网络出现问题。能够依次执行如下脚原本重置节点而且删除flannel网络来解决:
kubeadm reset #重置节点 systemctl stop kubelet && systemctl stop docker && rm -rf /var/lib/cni/ && rm -rf /var/lib/kubelet/* && rm -rf /var/lib/etcd && rm -rf /etc/cni/ && ifconfig cni0 down && ifconfig flannel.1 down && ifconfig docker0 down && ip link delete cni0 && ip link delete flannel.1 systemctl start docker
执行完成后,从新生成token并注册节点便可,具体能够参考上文内容。
在k8s集群的部署过程当中或者事后,你们可能会遇到不少问题。这也是本地部署k8s集群遇到的最大的挑战质疑,所以本篇笔者讲述了问题处理思路和常见错误,但愿可以给予你们帮助。
若是经过详细异常和和日志仍是没法推断出具体错误,建议你们能够根据具体信息在“https://stackoverflow.com”网站上进行搜索,也能够在相关社交网站(好比github)和群里请教,不过请教前,请给出你的诊断步骤和详细的错误日志。