安装完Kubernetes后,在Pod中使用wget没法访问外网URL地址,可是使用IP地址是能够访问,应该是docker
Pod内没法解析DNS致使的。ubuntu
尝试了将DNS换为CoreDNS,问题仍然存在。通过屡次测试,发现下面的方法是可行的:api
编辑主机的/etc/resolv.conf文件:服务器
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8) # DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN #nameserver 127.0.1.1 nameserver 192.168.199.1 nameserver 8.8.8.8 nameserver 9.9.9.9 search lan
若是/etc/resolv.conf为连接,则须要修改/etc/resolvconf/resolv.conf.d/base或head文件,而后运行resolvconf -u进行更新/etc/resolv.conf里的内容。网络
Ubuntu16.04 LTS安装的resolvconf有一些问题,/etc/resolv.conf并不是连接(有的安装同一个版本是连接,很奇怪的),resolvconf -u等方法都会执行失败。原则上,是连接的到/etc/resolvconf/resolv.conf.d里面去改,不是连接的,直接修改/etc/resolv.conf文件。oop
可能Kubernetes启动Pod时,要把/etc/resolv.conf里的dns信息带到pod中,而resolv.conf解析不到外面的地址。联想到以前kube-dns常常出错,估计也是这个缘由。配置完后,kube-dns就不多出错了。测试
下面是从网上看到的方法,作过尝试的一些方法。网站
通过测试,加入外部DNS后能够访问外部网址,/etc/resolv.conf里的nameserver的IP地址没法ping通,确定也没法作域名解析了。所以,主要缘由在于service的clusterip能够传递外部请求到pod,可是pod却没法访问service的ip,在多个技术网站搜索,基本上都出现此问题。spa
解决方法包括:操作系统
###################################### # For K8s pod access service # by openthings,2018.06.30. #====================================== net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-arptables = 1 #######################################
按照这些方法搞过,仍是不行。 ping 10.96.0.10不通。
变通的方法:
可是,这两个方法虽然能够访问外部地址了,但仍然不能访问Kubernetes的Service产生的ClusterIP。不过,集群内部访问其它服务(包括POD本身的服务),能够经过服务名进行。
尝试设置Kubernetes的Kube-dns的外部dns,将下面内容保存为extdns.yaml。
apiVersion: v1 kind: ConfigMap metadata: name: kube-dns namespace: kube-system labels: addonmanager.kubernetes.io/mode: EnsureExists data: upstreamNameservers: / ["8.8.8.8", "9.9.9.9"]
其它:
若是 Node 上安装的 Docker 版本大于 1.12,那么 Docker 会把默认的 iptables FORWARD 策略改成 DROP。这会引起 Pod 网络访问的问题。解决方法则在每一个 Node 上面运行 iptables -P FORWARD ACCEPT,好比
若是使用了 flannel/weave 网络插件,更新为最新版本也能够解决这个问题。
DNS 没法解析也有多是 kube-dns 服务异常致使的,能够经过下面的命令来检查 kube-dns 是否处于正常运行状态
若是 kube-dns 处于 CrashLoopBackOff 状态,那么须要查看 kube-dns Pod 的日志,根据日志来修复 DNS 服务。
若是 kube-dns Pod 处于正常 Running 状态,则须要进一步检查是否正确配置了 kube-dns 服务:
若是 kube-dns service 不存在,或者 endpoints 列表为空,则说明 kube-dns service 配置错误,能够从新部署 kube-dns service。