当我们创建完k8s dashboard,试图访问web ui界面的时候如:
dashboard访问地址;http://172.16.16.15:8080/ui
抛出如下错误:
Error: 'dial tcp 172.16.59.2:9090: getsockopt: connection timed out'
Trying to reach: 'http://172.16.59.2:9090/'
为什么访问的是8080端口被重定向到了不同的ip和不同的端口呢?
这是因为:
我们首先是通过在 master节点ip:8080/ui (apiserver restful api外部交互总入口)端口去访问dashboard,然后具体的dashboard pod却是在minion/node节点上通过kubelet创建部署的,所以不同的ip和端口就是你实际在Minion/Node节点所创建的ip地址和端口即其访问端点endpoint。9090应该是你创建dashboard的yaml中自己配置pod的访问端口。
可以通过在master节点使用命令,查看dashboard pod的ip地址。
kubectl describe pod kubernetes-dashboard-3636564265-kf68m --namespace kube-system
[root@CentOS kubernetes]# kubectl describe pod kubernetes-dashboard-3636564265-cgk8r --namespace kube-system
Name: kubernetes-dashboard-3636564265-cgk8r
Namespace: kube-system
Node: localhost13/172.16.16.13
Start Time: Mon, 29 Oct 2018 14:37:25 +0800
Labels: k8s-app=kubernetes-dashboard
pod-template-hash=3636564265
Status: Running
IP: 172.16.59.2
Controllers: ReplicaSet/kubernetes-dashboard-3636564265
其中kubernetes-dashboard-3636564265-kf68m是pod的名字,可以通过命下面令得到
kubectl get pods --all-namespaces
其中 --all-namespaces 是表示所有命名空间。
因此,问题就明确了,是因为从Master节点无法访问Node节点pod ip+端口而导致的错误。
systemctl stop iptables
systemctl disable iptables
即使关闭了防火墙跨主机间容器、pod始终无法ping通
这是由于linux还有底层的iptables,所以在node上分别执行:
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -F
iptables -L -n
问题完美解决
如果从主节点ping Node节点Pod ip地址可以ping通,则查看web ui应该没有问题了。
[root@CentOS kubernetes]# ping 172.16.59.2
PING 172.16.59.2 (172.16.59.2) 56(84) bytes of data.
64 bytes from 172.16.59.2: icmp_seq=1 ttl=63 time=0.568 ms
64 bytes from 172.16.59.2: icmp_seq=2 ttl=63 time=0.486 ms
64 bytes from 172.16.59.2: icmp_seq=3 ttl=63 time=0.460 ms
64 bytes from 172.16.59.2: icmp_seq=4 ttl=63 time=0.485 ms
Master节点启动 注意先启动kubernetes,再启动docker(如果是关闭docker或者重启docker导致的网络问题,重启master和node节点,注意重启顺序)
systemctl enable docker
systemctl enable etcd kube-apiserver kube-scheduler kube-controller-manager
systemctl restart etcd kube-apiserver kube-scheduler kube-controller-manager
systemctl restart flanneld docker
#网络相关后启动 flanneld和docker 重置网络
systemctl restart kubelet kube-proxy
systemctl restart flanneld docker
#网络相关后启动 flanneld 和 docker 重置网络
systemctl enable flanneld kubelet kube-proxy docker
kubectl delete -f dashboard-controller.yaml
kubectl delete -f dashboard-service.yaml
kubectl create -f dashboard-controller.yaml
kubectl create -f dashboard-service.yaml
yaml文件名请使用你自己创建pod的文件名。
一般通过上述三种方法即可解决。