完美解决K8s中的Pod无法解析外网域名问题

系统:Ubuntu 18.04.02
K8s版本:1.13.4

故障现象:安装KubeDNS后,Pod内无法ping通外网域名,访问外网IP、K8s内部域名或者IP均正常。
??
原因分析,查看Pod中的resolv.conf:

kubectl exec busybox -- cat /etc/resolv.conf
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5

10.96.0.10为KubeDNS的集群IP,对于内部域名,KubeDNS会直接解析,对于外部域名,KubeDNS会丢给上一级DNS服务器解析,这个上一级DNS服务器就依赖于resolv.conf。
查看KubeDNS Pod中的resolv.conf:

kubectl -n kube-system exec kube-dns-57f56f74cb-s86k7 -- cat /etc/resolv.conf
Defaulting container name to kubedns.
Use ‘kubectl describe pod/kube-dns-57f56f74cb-s86k7 -n kube-system‘ to see all of the containers in this pod.
nameserver 127.0.0.53
options edns0

查看宿主机(Node或Master)该文件,cat /etc/resolv.conf:

# This file is managed by man:systemd-resolved(8). Do not edit.
#
# This is a dynamic resolv.conf file for connecting local clients to the
# internal DNS stub resolver of systemd-resolved. This file lists all
# configured search domains.
#
# Run "systemd-resolve --status" to see details about the uplink DNS servers
# currently in use.
#
# Third party programs must not access this file directly, but only through the
# symlink at /etc/resolv.conf. To manage man:resolv.conf(5) in a different way,
# replace this symlink by a static file or a different symlink.
#
# See man:systemd-resolved.service(8) for details about the supported modes of
# operation for /etc/resolv.conf.

nameserver 127.0.0.53
options edns0

原因很明显了,KubeDNS创建时会把宿主机/etc/resolv.conf里的内容拷贝到Pod同文件中,如果/etc/resolv.conf里写的配置不正确,则Pod无法解析外网域名。
Ubuntu18.04已经抛弃/etc/resolv.conf用做域名解析,DNS可以配置在/etc/netplan/xx.yaml中,保留/etc/resolv.conf只是用做兼容,根据注释,我们知道,/etc/resolv.conf由systemd-resolved服务管理,不建议手工修改,因为会被自动覆盖,同时ls该文件,发现/etc/resolv.conf只不过是一个软链接。

网上方法:修改/etc/systemd/resolved.conf中的DNS项,之后重启systemd-resolved服务,经验证无效。

最终解决办法,删除该软链接,然后自己手工创建该文件:

rm /etc/resolv.conf -f
cat /etc/resolv.conf<<EOF
nameserver 114.114.114.114
nameserver 114.114.115.115
EOF

然后删除KubeDNS,重新创建KubeDNS,删除原有Pod,重新创建Pod,经测试,问题解决。

该办法带来的问题:unable to resolve host xxx,解决办法:编辑/etc/hosts,把主机名加到127.0.0.1即可。

原文地址:https://blog.51cto.com/kusorz/2372571

时间: 2024-08-30 08:33:26

完美解决K8s中的Pod无法解析外网域名问题的相关文章

ping得通外网IP,ping不通外网域名的解决办法

这个办法是最有效的. windows的winsock损坏后,会造成能ping通外网IP,使用nslookup命令能够解析域名,却ping不通外网域名的情况. 在网上搜索了一下,发现有的网友说是微软补丁造成的,卸载那个补丁就可以了,或者说要求用360急救箱修复就可以了. 本人实践后,发现以上方法均行不通,不能解决这个问题.因为是win7系统,使用常见的winsockfix修复软件也不能修复 . 最后发现,使用[netsh winsock reset]命令,恢复winsock目录,重启后,轻松的就解

bind9无法解析外网地址

1,今天做了个内网DNS,主要是解析内网域名和缓存服务,安装的是Ubuntu版本,默认安装,在选择软件的时候,选择了BIND9和OPENSSH服务,设置了内网域名解析和缓存配置,结果只能解析内网地址,不能解析外网了,看了一下Ubuntu官网,说设置两个缓存DNS就可以了,结果不行,上网查了一下说要设置  allow-query-cache       { any; }; 设置完成就可以了,结果成功了.外网可以解析了,这个教训告诉我不能太相信官网.

9 个技巧,解决 K8s 中的日志输出问题

作者 | 元乙??阿里云存储服务技术专家 导读:近年来,越来越多的同学咨询如何为 Kubernetes 构建一个日志系统,或者是来求助在此过程中遇到一系列问题如何解决,授人以鱼不如授人以渔,于是作者想把这些年积累的经验以文章的形式发出来,让看到文章的同学少走弯路.K8s 日志系列文章内容偏向落地实操以及经验分享,且内容会随着技术的迭代而不定期更新,本文为该系列文章的第 3 篇. 第一篇:<6 个 K8s 日志系统建设中的典型问题,你遇到过几个?> 第二篇:<一文看懂 K8s 日志系统设计

k8s中的pod控制器之Deployment、DaemonSet、StatefulSet

pod控制器分类:1.ReplicationController2.ReplicaSet3.Deployment4.StatefulSet5.DaemonSet6.Job,Cronjob7.HPApod控制器:一般包括3部分1.标签选择器2.期望的副本数(DaemonSet控制器不需要)3.pod模板deploy控制器构建于rs控制器之上,新特性包括:1.事件和状态查看2.回滚3.版本记录4.暂停和启动5.支持两种自动更新方案Recreate删除重建RollingUpdate回滚升级(默认方式)

k8s pod访问不通外网问题排查

环境概况 自建k8s集群,主机操作系统ubuntu16.04,k8s版本v1.14, 集群网络方案calico-3.3.6. worker节点数50+,均为GPU物理服务器,服务器类型异构,如Nvidia P4/T4/V100等. 异常现象 故障起因是k8s集群新增加了一台worker节点机器server-n1,该机器上带有8张网卡eth0~eth7, 其中eth0~eth3没有配置ip地址,eth4~eth7配置了ip地址,默认使用eth4网卡. 调度到server-n1节点上的pod,无法访

CDH中HDFS的WEB UI外网无法访问的问题

文章来自:http://www.cnblogs.com/hark0623/p/4177794.html 转载请注明 其实问题很简单,因为在CDH中hdfs-site.xml配置文件中WEB UI配置的是域名,而域名在Hosts又被解析成内网IP. 你使用netstat -apn | grep 50700看一下监听情况. 你会发现监听的是你的内网IP,而不是外网IP,所以HDFS的WEB UI就无法访问啦. 解决办法:如果你使用的是Apache Hadoop,那么需要去手动修改hdfs-site.

k8s中的Pod的状态CrashLoopBackOff

现象如下: [[email protected] ~]# kubectl get pod NAME READY STATUS RESTARTS AGE eureka-server-65695bbdc8-49b6v 0/1 CrashLoopBackOff 5 4m32s [root@k8s1 ~]# kubectl get pod NAME READY STATUS RESTARTS AGE eureka-server-65695bbdc8-49b6v 0/1 CrashLoopBackOff

HTML5 完美解决javascript中iphone手机和android手机复制文本到剪切板问题

1.执行以下解决方案条件:(这个是原理) ①执行复制方法时 所复制文字不能被任何 块级元素和行内块元素和行内元素遮盖否则无效:(解决方案:将文本通过绝对定位或其他方式移除屏幕外) ②ios中不能复制属性值,只能复制文本元素节点:(解决方案:可以把文字颜色设成背景色就能达到隐藏看不见的效果不影响显示): 直接上代码:以下是伪代码 js代码: function img() { if (navigator.userAgent.match(/(iPhone|iPod|iPad);?/i)) {//区分i

k8s中删除pod后仍然存在问题

分析: 是因为删除了pod,但是没有删除对应的deployment,删除对应的deployment即可 实例如下: 删除pod [root@test2 ~]# kubectl get pod -n jenkins NAME READY STATUS RESTARTS AGE jenkins2-8698b5449c-grbdm 1/1 Running 0 8s [root@test2 ~]# kubectl delete pod jenkins2-8698b5449c-grbdm -n jenki