部署k8s环境flannel显示无法访问api server问题
2019-08-04 本文已影响0人
崔天浩
问题现象
- 部署完k8s后,node节点出现重启flannel就会出现如下报错 ,导致此node无法访问集群网络
原因说明
问:根据上图报错可以看出上因为无法解析slb.mpaas.com的master节点域名导致,那问题就来了,容器为hostnetwork为什么无法解析域名(域名已经写在hosts里面)
答:因为flannel镜像用的alpine镜像构建,alpine镜像默认没有/etc/nssswitch.conf文件,默认会通过/etc/resolv.conf里面的dns解析域名,不会通过hosts解析
参考链接:
-
/etc/hosts文件在alpine镜像中对go程序无效:https://www.jianshu.com/p/c47a08b3f22e
-
nssswitch.conf文件说明:http://www.gnu.org/software/libc/manual/html_node/Notes-on-NSS-Configuration-File.html
解决方法
方法1
- 修改flannel的daemonset里面的dnsPolicy为ClusterFirst,然后删除有问题的flannel的pod
- ClusterFirst:任何与配置的群集域后缀不匹配的DNS查询(例如“www.kubernetes.io”)都会转发到从该节点解析
kubectl edit daemonset -n kube-system kube-flannel-ds
[图片上传失败...(image-8edeb4-1564889784098)]
方法2
- 重新定义flannel镜像,添加echo "hosts: files dns" > /etc/nsswitch.conf (设置hosts的dns的优先级) ,然后使用新镜像部署
mkdir flannel cat >>Dockerfile<< EOF
FROM jmgao1983/flannel:v0.10.0-amd64 RUN echo "hosts: files dns" > /etc/nsswitch.conf EOF
docker build -t jmgao1983/flannel:v0.10.1-amd64 ./
推荐方法2
未解之谜
- 问:为什么一开始部署的时候flannel正常
- 猜测:flannel比coredns提前部署,所以在启动flannel的时候,coredns的service上还没有创建,当flannel启动网络库访问dns地址因地址不通所以直接返回无法解析,然后网络库解析hosts通过hosts解析成功,最后启动成功