一次K8s中的Pod解析外网域名错误的问题排查

1、故障现象

我们一个agent代理服务,发布到k8s集群之后,pod状态是Running,但是server一直无法收到心跳信号,因此到集群内部去排查日志,发现该服务日志中出现大量的连接某一个ip地址tcp
timeout

一次K8s中的Pod解析外网域名错误的问题排查插图亿华云

2、故障排查过程

通过查看日志发现是大量的错误日志,连接某个ip地址产生i/o
timeout,因此排查服务的业务逻辑,该服务只会去连接server端,在服务的环境变量里配置了server端的域名,怀疑是不是有可能server端挂掉,在本地和集群宿主机上调用server的地址,发现是可以通的,因此排除掉了server端本身的问题

因为server端连接地址在我本地和集群宿主机上是可以正常调用,因此怀疑服务pod到server端地址不通,进入到pod中进行测试,发现的确不能调用,使用ping域名也是可以通的,但是发现ping解析出来的ip地址并不是我们server端的外网ip地址;因此怀疑到了dns解析的问题上,使用nsloopup命令进行排除(通常服务都没有该命令需要手动安装apt-get
install dnsutils,yum install
bind-utils,或者使用kubectl-debug工具来共享容器排查),解析出来的发现很诡异的name,域名最后面带了一个HOST

一次K8s中的Pod解析外网域名错误的问题排查插图1亿华云

进一步查看/etc/resolv.conf,发现搜索域中有一个HOST搜索域,因此解析域名会带上HOST

一次K8s中的Pod解析外网域名错误的问题排查插图2亿华云

又测试了几个域名,只要最后带HOST,都会解析到一个ip地址上,上网一搜,才知道这个HOST是个顶级域名,还会泛解析到某个ip上

一次K8s中的Pod解析外网域名错误的问题排查插图3亿华云

至此,导致本次故障的原因,已定位到,是由于pod中的搜索域中带了一个顶级域名HOST,产生的泛解析到了一个不是我们server端的地址上

3、故障原因分析

首先我们需要知道在k8s中的pod是如何进行服务之间域名调用,是如何解析的?

Kubernetes 中的域名解析分析集群内部域名解析

在 Kubernetes 中,比如服务 a 访问服务 b,对于同一个 Namespace下,可以直接在 pod 中,通过 curl b 来访问。对于跨
Namespace 的情况,服务名后边对应 Namespace即可。比如 curl b.devops。那么,使用者这里边会有几个问题:

①:服务名是什么?②:为什么同一个 Namespace 下,直接访问服务名即可?不同 Namespace 下,需要带上 Namespace
才行?③:为什么内部的域名可以做解析,原理是什么?

DNS 如何解析,依赖容器内 resolv 文件的配置

cat /etc/resolv.conf

nameserver 10.68.0.2

search devops.svc.cluster.local. svc.cluster.local. cluster.local.

这个文件中,配置的 DNS Server,一般就是 K8S 中,kubedns 的 Service 的
ClusterIP,这个IP是虚拟IP,无法ping,但可以访问。

root@other-8-67:~# kubectl get svc -n kube-system |grep dns

kube-dns ClusterIP 10.68.0.2 53/UDP,53/TCP,9153/TCP 106d

所以,所有域名的解析,其实都要经过 kubedns 的虚拟IP 10.68.0.2 进行解析,不论是 Kubernetes
内部域名还是外部的域名。Kubernetes 中,域名的全称,必须是 service-name.namespace.svc.cluster.local
这种模式,服务名,就是Kubernetes中 Service 的名称,所以,当我们执行下面的命令时:

curl b

必须得有一个 Service 名称为 b,这是前提。

在容器内,会根据 /etc/resolve.conf 进行解析流程。选择 nameserver 10.68.0.2 进行解析,然后,用字符串
“b”,依次带入 /etc/resolve.conf 中的 search 域,进行DNS查找,分别是:

// search 内容类似如下(不同的pod,第一个域会有所不同)

search devops.svc.cluster.local svc.cluster.local cluster.local

b.devops.svc.cluster.local -

THE END
Copyright © 2024 亿华云