云网牛站
所在位置:首页 > Linux教程 > 在Ubuntu 18.04中用Kubernetes出现Pod中无法解析DNS的解决

在Ubuntu 18.04中用Kubernetes出现Pod中无法解析DNS的解决

2018-09-14 12:08:57作者:openthings稿源:linux网

在Ubuntu 16.04下Kubernetes也出现Pod中无法解析DNS的问题,但是该问题已解决,可是升级到Ubuntu 18.04后同样的问题再次出现,而且使用Ubuntu 16.04的解决方法已经不行了。

 

下面的几个思路,都试了一遍:

/etc/resolv.conf,这是一般修改的文件,但这次改了以后,重启系统后又被改回去了。系统提示该文件是由networkmanager创建的。

/etc/systemd/resolved.conf,是resolv服务的配置,改了以后重启服务,好像没什么变化。

/run/resolveconf/resolv.conf,有人说是/etc/resolv.conf的连接指向文件,但我的系统没有。

/etc/resolvconf/resolv.conf.d/head,这个目录下有几个据说是resolv的配置文件,据说用于更新/etc/resolv.conf文件,但与/etc/resolv.conf里的数据不同。下面采用办法编辑了这个文件,终于搞定了。

Networkmanager

/etc/networkmanager/interfaces,以前版本都是该这里头的,没有效果。

dnsmasq,虽然系统安装了,但是配置都是空的,应该没有作用。

netplan,这是Ubuntu 18.04的主流配置,可是里面的/etc/netplan目录是空的。

不知道哪一个是真正起作用的了,实在不行的话,就只能蛮干了。

Disable systemd-resolved:

systemctl disable systemd-resolved

没有效果,重启系统也没有效果。

 

需要注意的是:

1.Kubernetes目前的DNS会从宿主机/etc/resolv.conf复制到pod。

2.因此,其它的设置方式即使在宿主机有效,但在kubernetes的pod中是无效的。

 

修改/etc/resolv.conf的指向:

#修改/etc/resolv.conf为软链接,从resolvconf配置文件来更新。

sudo mv /etc/resolv.conf /etc/resolv.conf.orig

sudo ln -s /run/resolvconf/resolv.conf /etc/resolv.conf

#修改/etc/resolvconf/resolv.conf.d/head或者base

sudo nano /etc/resolvconf/resolv.conf.d/head

#然后,应用一下。

sudo resolvconf -u

#再去看一下,应该已经变了。

cat /etc/resolv.conf

注:这个是可以的,虽然笨了点。

 

附:在Ubuntu 16.04系统中Kubernetes中的Pod无法访问外网的解决

安装完Kubernetes后,在Pod中使用wget无法访问外网URL地址,但是使用IP地址是可以访问,应该是Pod内无法解析DNS导致的。

1、解决方法

尝试了将DNS换为CoreDNS,问题仍然存在。经过多次测试,发现下面的方法是可行的:

编辑主机的/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里的内容。

2、原因分析

Ubuntu16.04 LTS安装的resolvconf有一些问题,/etc/resolv.conf并非链接(有的安装同一个版本是链接,很奇怪的),resolvconf -u等方法都会执行失败。原则上,是链接的到/etc/resolvconf/resolv.conf.d里面去改,不是链接的,直接修改/etc/resolv.conf文件。

可能Kubernetes启动Pod时,要把/etc/resolv.conf里的dns信息带到pod中,而resolv.conf解析不到外面的地址。联想到之前kube-dns经常出错,估计也是这个原因。配置完后,kube-dns就很少出错了。

3、其它

下面是从网上看到的方法,做过尝试的一些方法。

经过测试,加入外部DNS后可以访问外部网址,/etc/resolv.conf里的nameserver的IP地址无法ping通,肯定也无法做域名解析了。因此,主要原因在于service的clusterip可以传递外部请求到pod,但是pod却无法访问service的ip,在多个技术网站搜索,基本上都出现此问题。

解决方法包括:

修改iptables的配置,在sysctl.conf。查看iptable配置,iptable -L -v。

使用Service Mesh,不知道是否有助于该问题。

使用weavenet的网络驱动,有人说可以。有人说flannel可以,calico不行,但我用的flannel也是不行,可能跟操作系统也有关系,我的是ubuntu 16.04。

sudo gedit sysctl.conf,插入:

######################################

# 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不通。

变通的方法:

设一个代理,使用IP地址去访问。如https_proxy=192.168.199.99:9999 wget example.org,经测试,可行。也证明了网络是通的,主要是DNS服务地址访问不到。

尝试通过修改/etc/resolvconf/resolv.conf.d/base,然后运行resolvconf不成功。

在POD里添加新的DNS服务器,如在/etc/resolv.conf加上 nameserver=8.8.8.8,没效果。进到pod里,检查/etc/resolv.conf,并没有将主机的nameserver配置参数带进来。

但是,这两个方法虽然可以访问外部地址了,但仍然不能访问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"]

然后运行kubectl create -f extdns.yaml,部署该设置到kubernetes集群。不过,该方法貌似没用处。

其它:

docker inspect查看DNS设置。

如果 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。

 

相关主题

Ubuntu 18.04搭建Kubernetes集群时DNS无法解析的处理过程

精选文章
热门文章