如果你的dashboard连接不到apiserver,且baidu、google的解决方法都不可用的话,那你可以直接跳转到本篇博客的最终解决方法
★ 刚搭建完k8s集群后,如果你发现集群的两个coreDNS状态是CrashLoopBackOff或其有频繁的restart记录,请看这篇博客https://www.ishells.cn/archives/coredns-crashloopbackoff
★ 安装kubernetes-dashboard之后发现其pod状态为CrashLoopBackOff 或 状态正常,浏览器却不能访问的时候,且发现此时dashboard的restart次数变成了1。这肯定是有问题的,所以我多用了几次get nodes与 logs,发现了如下报错:
Error while initializing connection to Kubernetes apiserver.
This most likely means that the cluster is misconfigured (e.g., it has invalid apiserver certificates or service account's configuration) or the --apiserver-host param points to a server that does not exist.
Reason: Get https://10.96.0.1:443/version: dial tcp 10.96.0.1:443: i/o timeout
Refer to our FAQ and wiki pages for more information: https://github.com/kubernetes/dashboard/wiki/FAQ
排错查看具体error原因:
# kubectl get pods -n kube-system -o wide # kubectl logs ………… --namespace=kube-system # kubectl describe pod ………… -n kube-system
尝试了以下几种方法都未解决问题:
1、新建文件夹,用来存放自己创建的证书( 未成功 )
① 创建/certs文件夹并创建证书
② 卸载已经安装的k8s-dashboard
③ 重新安装dashboard# mkdir /certs # openssl req -nodes -newkey rsa:2048 -keyout certs/dashboard.key -out certs/dashboard.csr -subj "/C=/ST=/L=/O=/OU=/CN=kubernetes-dashboard" # ls /certs # openssl x509 -req -sha256 -days 365 -in certs/dashboard.csr -signkey certs/dashboard.key -out certs/dashboard.crt # kubectl create secret generic kubernetes-dashboard-certs --from-file=certs -n kube-system
# vim kubernetes-dashboard.yaml
# 删除原有的dashboard的pod kubectl delete deployment kubernetes-dashboard --namespace=kube-system kubectl delete service kubernetes-dashboard --namespace=kube-system kubectl delete role kubernetes-dashboard-minimal --namespace=kube-system kubectl delete rolebinding kubernetes-dashboard-minimal --namespace=kube-system kubectl delete sa kubernetes-dashboard --namespace=kube-system kubectl delete secret kubernetes-dashboard-certs --namespace=kube-system kubectl delete secret kubernetes-dashboard-csrf --namespace=kube-system kubectl delete secret kubernetes-dashboard-key-holder --namespace=kube-system
重新创建dashboard # kubectl apply -f kubernetes-dashboard.yaml
2、修改kubernetes-dashboard.yaml中的--apiserver-host参数
① 通过logs查看dashboard的pod具体的报错来选择,注释kubernetes-dashboard.yaml的--apiserver-host参数或自定义--apiserver-host参数
② 卸载已经安装的k8s-dashboard
③ 重新安装dashboard通过指定kubenetes api server host而不让dashboard自动去寻找apiserver的位置 # vim kubernetes-dashboard.yaml
按上面的步骤,删除已经建立的dashboard的pod并重新创建dashboard
3、注释kubernetes-dashboard.yaml中特定配置信息
① 注释yaml文件中的特定行
② 卸载已经安装的k8s-dashboard
③ 重新安装dashboard如果你没有对master节点做污点操作的话,请注意kubernetes-dashboard.yaml中的这几行信息:
#Comment the following tolerations if Dashboard must not be deployed on master
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
上面这三行的作用是:
使得pod不会分配到到master节点, 并且kubeadm部署的apiserver中启用的验证方式为Node和RBAC, 且关闭insecure-port。所以我尝试注释这几行来解决连接不上apiserver的问题。
最终解决:
问题:
① logs查看具体的出错原因,并发现原因是dial tcp 10.96.0.1:443: i/o timeout
② 看到原因是dashboard的工作节点无法连接API Server且master的api server的pod工作正常
原因:
① 我的问题就是在使用kubeadm初始化集群的时候没有指定pod-network-cidr,这样的话就没确保主机/主网络的IP在所引用的子网中。
即如果你的网络运行在192.168..,就使用10.0.0.0/16。如果您的网络是10.0..,就使用192.168.0.0/16。
也就是说,在使用”kubeadm init“命令初始化master节点时,在给网络插件分配CIDR网段时,自己环境中(master节点和工作节点)的ip地址不能够跟网络插件的网段重合!(如官网所说)
解决:
① 重置已经创建的k8s集群(master、node)
② 初始化集群master,指定pod网络的CIDR,并加入node节点
③ master下载kubernetes-dashboard.yaml并部署访问# kubeadm reset # kubeadm init --apiserver-advertise-address 192.168.52.100 --pod-network-cidr=10.244.0.0/16 # 192.168.52.100是master的IP # …………
重新初始化集群遇到的问题都可以参考这里:https://www.ishells.cn/archives/k8s-solve-ip-changed
参考来源:
1、https://github.com/coredns/coredns/issues/2325
2、https://www.jianshu.com/p/650c1082f650
3、https://www.jianshu.com/p/f9a2bd82e368
4、https://blog.csdn.net/u011663005/article/details/87937800
5、https://medium.com/@cminion/quicknote-kubernetes-networking-issues-78f1e0d06e12