pd Pod nslookup domain failed,domain字段不正常

【 TiDB 使用环境`】测试环境
【 TiDB 版本】6.1 & 5.4 都会出现
【遇到的问题】在部署 tidb cluster时,basic-pd-0 Pod 容器 30s 后失败重启,log 中查看是domain 字段拼接有问题,报错如下:

** server can't find basic-pd-0.basic-pd-peer.tidb-cluster.svc.cluster.local.basic-pd-peer.tidb.cluster.svc: NXDOMAIN

nslookup domain basic-pd-0.basic-pd-peer.tidb-cluster.svc.cluster.local.basic-pd-peer.tidb-cluster.svc failed

使用startUpScriptVersion: "v1"有类似的报错

domain resolve basic-pd-0.basic-pd-peer.tidb-cluster.svc.cluster.local.basic-pd-peer.tidb-cluster.svc no record return

这段报错应该来源于源码 manager/member/tempalte.go 120行 pdStartScriptTpl 的命令,对 domain 变量的拼接出现了问题,这里的拼接结果应该是:

basic-pd-0.basic-pd-peer.tidb-cluster.svc # 正确结果
basic-pd-0.basic-pd-peer.tidb-cluster.svc.cluster.local.basic-pd-peer.tidb-cluster.svc # 实际错误结果

请问这是一个bug吗,之前有没有遇到过?
【TiDB Operator 版本】:1.3.7
【K8s 版本】:1.20 & containerd 1.2.10

1 个赞

目前K8S的环境,对于domain 是依靠什么服务来支持的?
是否能够满足 tidb operator 的基本要求?
https://docs.pingcap.com/zh/tidb-in-kubernetes/stable/deploy-tidb-operator
image

是否配置了 tc.clusterDomain? 可以提供一下 tc 的配置

目前的K8S环境用 CoreDNS 来支持的,准备环境的内容应该都没有问题;
tc.clusterDomain字段没有设置,tc配置和quickstart里应该是完全一致的。

我现在发现了问题所在,在manager/member/template.go 文件的pd启动脚本 pdStartScriptTpl 中(刚刚github更新之后是在 tidb-operator/charts/tidb-cluster/templates/scripts/_start_pd.sh.tpl 文件中)这一行:

POD_NAME=${POD_NAME:-$HOSTNAME}

如果kubelet 没有给容器注入 $POD_NAME,$HOSTNAME 得到的值包含的不仅仅是容器的 hostname,后面还跟了许多svc,namespace等,导致 domain结果不正确。这行应该改为:

POD_NAME=${POD_NAME:-$(hostname)}

目前我这里修改后结果正确了。

Hi, 可以提供一下你的 tc 定义 yaml 和 pod 的 yaml 输出吗?
还有 kubectl -nkube-system get cm/coredns -oyaml --export
和 kubectl -ntidb-test exec -ti tidb4012-pd-0 – cat /etc/resolv.conf

tc yaml 没有改过,https://github.com/pingcap/tidb-operator/blob/master/examples/basic/tidb-cluster.yaml
pod 的 yaml basic-pd-0.yaml (5.1 KB)
cm/coredns yaml cm-coredns.yaml (1.1 KB)

/etc/resolv/conf

search tidb-cluster.svc.cluster.local svc.cluster.local cluster.local
nameserver 22.0.0.10
options ndots:5

我觉得还需要关注这个,在 kubectl -n tidb-cluster exec -it basic-pd-0 – sh 中命令的结果

/ # echo $HOSTNAME
basic-pd-0.basic-pd-peer.tidb-cluster.svc.cluster.local
/ # hostname
basic-pd-0

本地没有复现您的问题。
看到您 yaml 里有 ali 字样,请问您的环境是怎么创建的?tidb operator 和 tidbcluster 是怎么部署的?

k8s环境是阿里ACK托管版,版本1.20.4,部署方式就是按照tidb quick start里的步骤

我也遇到这个错误了,咋个解决的呀?