部署k8s环境flannel显示无法访问api server问题

问题现象

  • 部署完k8s后,node节点出现重启flannel就会出现如下报错 ,导致此node无法访问集群网络
报错截图

原因说明

问:根据上图报错可以看出上因为无法解析slb.xxxx.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解析成功,最后启动成功

你可能感兴趣的:(部署k8s环境flannel显示无法访问api server问题)