封尘网

让学习成为一种习惯!

kubernetes-dashboard 报错:tcp 10.96.0.1:443: connect: no route to host

在初始化K8s集群时如果网络模式配置使用ipvs时,遇到了使用helm安装kubernetes-dashboard插件,相应的Pod服务一直无法正常运行,从而导致dashboard 无法正常使用。

 

 

系统环境

  • CentOS Linux release 7.7.1908 (Core)
  • 内核: 4.4.230-1.el7
  • K8版本: v1.18.0
  • kubernetes-dashboard 版本: 2.3.0
  • helm:v3.1.2

 

在初始化K8s集群时如果网络模式配置使用ipvs时,会遇到的以下问题;

helm install kubernetes-dashboard 后,发现相应的Pod无法正常启动,查看日志大致如下:

[root@k8s-master kubernetes-dashboard]# kubectl logs kubernetes-dashboard-c8466fd98-wr2km 
2020/08/12 07:46:38 Starting overwatch
2020/08/12 07:46:38 Using namespace: default
2020/08/12 07:46:38 Using in-cluster config to connect to apiserver
2020/08/12 07:46:38 Using secret token for csrf signing
2020/08/12 07:46:38 Initializing csrf token from kubernetes-dashboard-csrf secret
panic: Get "https://10.96.0.1:443/api/v1/namespaces/default/secrets/kubernetes-dashboard-csrf": dial tcp 10.96.0.1:443: connect: no route to host

goroutine 1 [running]:
github.com/kubernetes/dashboard/src/app/backend/client/csrf.(*csrfTokenManager).init(0xc00011cb40)
	/home/runner/work/dashboard/dashboard/src/app/backend/client/csrf/manager.go:41 +0x446
github.com/kubernetes/dashboard/src/app/backend/client/csrf.NewCsrfTokenManager(...)
	/home/runner/work/dashboard/dashboard/src/app/backend/client/csrf/manager.go:66
github.com/kubernetes/dashboard/src/app/backend/client.(*clientManager).initCSRFKey(0xc000225b80)
	/home/runner/work/dashboard/dashboard/src/app/backend/client/manager.go:501 +0xc6
github.com/kubernetes/dashboard/src/app/backend/client.(*clientManager).init(0xc000225b80)
	/home/runner/work/dashboard/dashboard/src/app/backend/client/manager.go:469 +0x47
github.com/kubernetes/dashboard/src/app/backend/client.NewClientManager(...)
	/home/runner/work/dashboard/dashboard/src/app/backend/client/manager.go:550
main.main()
	/home/runner/work/dashboard/dashboard/src/app/backend/dashboard.go:105 +0x20d

 

导致此问题的原因:

由于每个问题的出现可能有所不同,每个系统,版本等都是有原因的。所以希望大家根据以下情况匹配,如果配置跟我的情况是一样的前提下可参考。

  • K8s集群使用了firewalld防火墙(防火墙是运行的)
  • K8s初始化集群时使用了ipvs网络模式

 

解决方法:

 

  • 方法一: 关闭firewalld防火墙(每个节点上都要操作,最简单的操作)
  • 方法二: 不使用ipvs的网络模式(就是在初始化集群时不加上ipvs代理那段,默认创建是不使用的)

    //直接初始化集群
    kubeadm init --apiserver-advertise-address=192.168.18.71 --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.18.0 |tee kubeadmin-init.log
    

    这样初始化的集群环境中,通过ip addr命令是看不到kube-ipvs0网口的,说明没有使用ipvs模式。

     

  • 方法三:添加一条规则,就是放行443端口,这样既可以让防火墙起到作用又能实现K8s的通信

    在初始化集群时使用了ipvs模式的情况下,如果防火墙没有加上这条规则就会出现上面的无法通信的错误提示,从而导致了Pod 无法正常运行。

    //集群中所有机器执行以下命令即可
    firewall-cmd --permanent --add-port=443/tcp
    firewall-cmd --reload
    

 

说明

由于在配置K8s集群时,很多文档都会说添加6443,2379,2380,10250,10251,10252,30000-32767/tcp,8472/udp几个通信端口,正常在不使用kubernetes-dashboard时是没有问题的。而使用kubernetes-dashboard是因为使用了https协议通信,所以需要防火墙放行443端口。

 

提醒:本文最后更新于 39 天前,文中所描述的信息可能已发生改变,请谨慎使用。