3

我想在 CoreDNS 中配置自定义 DNS(绕过 NAT 环回问题,这意味着在网络内,IP 的解析与网络外不同)。

我尝试使用“假”域修改 CoreDNS 的 ConfigMap 只是为了进行测试,但它不起作用。我正在使用 minik8s

这里是 config map coredns 的配置文件:

apiVersion: v1
data:
  Corefile: |
    .:53 {
        errors
        health
        ready
        kubernetes cluster.local in-addr.arpa ip6.arpa {
          pods insecure
          fallthrough in-addr.arpa ip6.arpa
        }
        prometheus :9153
        forward . 8.8.8.8 8.8.4.4
        cache 30
        loop
        reload
        loadbalance
    }
    consul.local:53 {
        errors
        cache 30
        forward . 10.150.0.1
    }
kind: ConfigMap

然后我尝试使用忙框解析此地址,但它不起作用。

$kubectl exec -ti busybox -- nslookup test.consul.local
> nslookup: can't resolve 'test.consul.local'
command terminated with exit code 1

甚至 Kubernetes DNS 也失败了

$ kubectl exec -ti busybox -- nslookup kubernetes.default
nslookup: can't resolve 'kubernetes.default'
command terminated with exit code 1
4

1 回答 1

3

我已经复制了你的场景,它按预期工作。

在这里,我将描述在 Kubernetes 上使用自定义 DNS 的两种不同方法。第一个是在 Pod 级别。您可以自定义 pod 将使用的 DNS 服务器。这在您不想为所有 pod 更改此配置的特定情况下很有用。

为此,您需要添加一些可选字段。要了解更多信息,请阅读内容。例子:

kind: Pod
metadata:
  name: busybox-custom
  namespace: default
spec:
  containers:
  - name: busybox
    image: busybox:1.28
    command:
      - sleep
      - "3600"
    imagePullPolicy: IfNotPresent
  dnsPolicy: "None"
  dnsConfig:
    nameservers:
      - 8.8.8.8
    searches:
      - ns1.svc.cluster-domain.example
      - my.dns.search.suffix
    options:
      - name: ndots
        value: "2"
      - name: edns0
  restartPolicy: Always
$ kubectl exec -ti busybox-custom -- nslookup cnn.com
Server:    8.8.8.8
Address 1: 8.8.8.8 dns.google

Name:      cnn.com
Address 1: 2a04:4e42::323
Address 2: 2a04:4e42:400::323
Address 3: 2a04:4e42:200::323
Address 4: 2a04:4e42:600::323
Address 5: 151.101.65.67
Address 6: 151.101.129.67
Address 7: 151.101.193.67
Address 8: 151.101.1.67
$ kubectl exec -ti busybox-custom -- nslookup kubernetes.default
Server:    8.8.8.8
Address 1: 8.8.8.8 dns.google

nslookup: can't resolve 'kubernetes.default'
command terminated with exit code 1

如您所见,此方法将产生解析内部 DNS 名称的问题。

实现此目的的第二种方法是在集群级别更改 DNS。这是您选择的方式,如您所见。

$ kubectl get cm coredns -n kube-system -o yaml
apiVersion: v1
data:
  Corefile: |
    .:53 {
        errors
        health
        kubernetes cluster.local in-addr.arpa ip6.arpa {
           pods insecure
           upstream
           fallthrough in-addr.arpa ip6.arpa
           ttl 30
        }
        prometheus :9153
        forward . 8.8.8.8 8.8.4.4
        cache 30
        loop
        reload
        loadbalance
    }
kind: ConfigMap

如您所见,我没有consul.local:53条目。

Consul是一种服务网络解决方案,用于跨任何运行时平台和公共或私有云连接和保护服务

这种设置并不常见,我认为您不需要在设置中包含此条目。这可能是您的问题,当我添加此条目时,我面临您报告的相同问题。

$ kubectl exec -ti busybox -- nslookup cnn.com
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

Name:      cnn.com
Address 1: 2a04:4e42:200::323
Address 2: 2a04:4e42:400::323
Address 3: 2a04:4e42::323
Address 4: 2a04:4e42:600::323
Address 5: 151.101.65.67
Address 6: 151.101.193.67
Address 7: 151.101.1.67
Address 8: 151.101.129.67
$ kubectl exec -ti busybox -- nslookup kubernetes.default
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

Name:      kubernetes.default
Address 1: 10.96.0.1 kubernetes.default.svc.cluster.local

另一个主要问题是您正在使用最新的 busybox 映像调试 DNS。我强烈建议您避免使用任何高于 1.28 的版本,因为它已经知道有关名称解析的问题。

正如Oleg Butuzov在评论中推荐的那样,您可以用来解决 DNS 问题的最佳busybox 映像是1.28 。

于 2019-12-19T11:17:36.070 回答