CoreDNS后缀重写会导致DNS查询返回重写后的名称

时间:2019-02-04 01:10:30

标签: kubernetes coredns

我有一个带有CoreDNS的Kubernetes 1.13.1集群,除了默认的<servicename>.nsc之外,我还希望可以通过<servicename>.default.svc.cluster.local访问默认名称空间中运行的许多服务。

我尝试的第一件事是手动重写每个服务,如下所示:

rewrite name gitea.nsc gitea.default.svc.cluster.local

运行nslookup gitea.nsc返回预期的输出:

Server:     10.245.0.10
Address:    10.245.0.10#53

Name:   gitea.nsc
Address: 10.245.64.203

我可以curl,一切都很好。

但是后来我尝试将其抽象一些,因为为每个服务手动添加一行很繁琐。

我最终得到了这个

rewrite name suffix .nsc .default.svc.cluster.local

但是现在curl突然失败了。 nslookup提供了有关原因的可能线索:

Server:     10.245.0.10
Address:    10.245.0.10#53

Name:   gitea.default.svc.cluster.local
Address: 10.245.64.203

现在,响应中的名称包含重写的主机,而不是原始输入。我的猜测是,这会抛出pingcurlwget

我的Corefile当前看起来像这样:

.:53 {
        errors
        health
        rewrite name git.nsc gitea.default.svc.cluster.local
        rewrite name suffix .nsc .default.svc.cluster.local
        kubernetes cluster.local in-addr.arpa ip6.arpa {
          pods insecure
          upstream
          fallthrough in-addr.arpa ip6.arpa
        }
        prometheus :9153
        proxy . /etc/resolv.conf
        cache 30
        loop
        reload
        loadbalance
    }

我的托管服务提供商会自动生成除两条重写行以外的所有内容。我在一种情况下使用git.nsc,因此在调试时可以同时在Corefile中进行两次重写。

我很困惑。如何获得CoreDNS重写<servicename>.nsc,但不返回重写主机的响应?

1 个答案:

答案 0 :(得分:1)

rewrite plugin Readme中找出答案正确。总结:

事实证明,像上面的git.nsc重写那样的精确重写可以免费重写响应,默认是返回重写的主机。对于其他类型(例如正则表达式或后缀),您必须明确地执行此操作。这仅适用于正则表达式重写,因此后缀重写需要先重写为正则表达式重写。

以下代码段对我有用:

rewrite stop {
    name regex (.*)\.nsc {1}.default.svc.cluster.local
    answer name (.*)\.default\.svc\.cluster\.local {1}.nsc
}

answer name部分基本上是name regex部分的反面。