在初始化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端口。