某些查询中附加了kubernetes dns搜索域

时间:2019-06-24 13:23:24

标签: kubernetes coredns

我正在运行一个具有主节点和2个工作节点的kubernetes集群。

root@kube-master:~# kubectl get nodes
NAME           STATUS   ROLES    AGE     VERSION
kube-master    Ready    master   4d19h   v1.14.3
kube-node-01   Ready    <none>   4d18h   v1.14.3
kube-node-02   Ready    <none>   6h3m    v1.14.3

现在我的traefik入口控制器无法解析dns查询。

/ # nslookup acme-v02.api.letsencrypt.org
nslookup: can't resolve '(null)': Name does not resolve

Name:      acme-v02.api.letsencrypt.org
Address 1: <my.public.ip> mail.xxx.xxx

现在,在opnsense框上带有tcpdump,我收到的查询中带有内部搜索域,并附加到我的公共IP上,这是错误的。

但是出于某种原因...拆开一个忙碌的测试箱工作正常...

/ # nslookup acme-v02.api.letsencrypt.org
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

Name:      acme-v02.api.letsencrypt.org
Address 1: 2a02:26f0:ef:197::3a8e g2a02-26f0-00ef-0197-0000-0000-0000-3a8e.deploy.static.akamaitechnologies.com
Address 2: 2a02:26f0:ef:181::3a8e g2a02-26f0-00ef-0181-0000-0000-0000-3a8e.deploy.static.akamaitechnologies.com
Address 3: 104.74.120.43 a104-74-120-43.deploy.static.akamaitechnologies.com

两个/etc/resolve.conf文件都与namespace

相同

因为kubernetes 1.11 coredns是默认的dns解析系统。在this页上,用coredns调试dns系统说我应该使用

root@kube-master:~# kubectl get pods --namespace=kube-system -l k8s-app=coredns
No resources found.

但是这不返回任何东西!使用kube-dns会返回coredns个吊舱!

root@kube-master:~# kubectl get pods --namespace=kube-system -l k8s-app=kube-dns
NAME                      READY   STATUS    RESTARTS   AGE
coredns-fb8b8dccf-jmhdm   1/1     Running   5          4d19h
coredns-fb8b8dccf-tfw7v   1/1     Running   5          4d19h

这是怎么回事?!文档是否错误或群集中有东西?

2 个答案:

答案 0 :(得分:0)

我将向您展示并使用nginx入口控制器示例进行解释。我相信traefik入口控制器的情况是相同的。

因此,首先-关于kube-dnscoredns所造成的混乱: 这是设计使然。您可以参考github coredns is still labeled as kube-dns issue阅读更多内容。

在我的集群中,我还拥有名为coredns的{​​{1}}服务,它引用具有kube-dns标签的coredns吊舱

k8s-app=kube-dns

当我旋转新的busybox容器时-它的/etc/resolv.conf指向服务kube-dns(10.96.0.10)并具有正确的搜索:

kubectl describe service kube-dns -n kube-system
Name:              kube-dns
Namespace:         kube-system
Labels:            k8s-app=kube-dns
                   kubernetes.io/cluster-service=true
                   kubernetes.io/name=KubeDNS
Annotations:       prometheus.io/port: 9153
                   prometheus.io/scrape: true
Selector:          k8s-app=kube-dns
Type:              ClusterIP
IP:                10.96.0.10
Port:              dns  53/UDP
TargetPort:        53/UDP
Endpoints:         10.32.0.2:53,10.32.0.9:53
Port:              dns-tcp  53/TCP
TargetPort:        53/TCP
Endpoints:         10.32.0.2:53,10.32.0.9:53
Port:              metrics  9153/TCP
TargetPort:        9153/TCP
Endpoints:         10.32.0.2:9153,10.32.0.9:9153
Session Affinity:  None
Events:            <none>

kubectl get pods -n kube-system -l k8s-app=kube-dns -o wide
NAME                      READY   STATUS    RESTARTS   AGE     IP          NODE                     NOMINATED NODE   READINESS GATES
coredns-fb8b8dccf-42285   1/1     Running   0          3h26m   10.32.0.9   kubernetessandbox-1-vm   <none>           <none>
coredns-fb8b8dccf-87j5v   1/1     Running   0          3h26m   10.32.0.2   kubernetessandbox-1-vm   <none>           <none>

但是与此同时,我的nginx入口控制器容器具有cat /etc/resolv.conf search kube-system.svc.cluster.local svc.cluster.local cluster.local c.myproj.internal. google.internal. nameserver 10.96.0.10 options ndots:5 ,甚至无法nslookup甚至kubernetes.default

nameserver 169.254.169.254

不知道您在cat /etc/resolv.conf search c.myproj.internal. google.internal. nameserver 169.254.169.254 中的交通小豆荚里有什么,但是问题出在那儿。而您拥有的/etc/resolv.conf来自您的节点

如果入口使用hostNetwork,则设置dnsPolicy:ClusterFirstWithHostNet而不是dnsPolicy:ClusterFirst应该解决此问题。

来自dns-pod-service documentation

  

“ ClusterFirstWithHostNet”:对于与hostNetwork一起运行的Pod,您可以   应该明确设置其DNS策略“ ClusterFirstWithHostNet”。

编辑nginx-ingress-controller部署后
/etc/resolv.conf

  dnsPolicy: ClusterFirst
  hostNetwork: true

pod已使用所需的/etc/resolv.conf重新创建:

  dnsPolicy: ClusterFirstWithHostNet
  hostNetwork: true

很少有与hostNetwork / dnsPolicy相关的问题和解释的URL。这是正确配置Traefik的重要部分:

1)Traefik on k8s not listening externally without changing deployment

2)Stack traefik question

3)Ingress with Traefik文章:

cat /etc/resolv.conf
search kube-system.svc.cluster.local svc.cluster.local cluster.local c.myproj.internal. google.internal.
nameserver 10.96.0.10
options ndots:5

nslookup kubernetes.default
Server:         10.96.0.10
Address:        10.96.0.10#53

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

此设置很重要。它将配置Traefik吊舱以使用   Kubernetes集群内部DNS服务器(最有可能是KubeDNS或   也许是CoreDNS)。这意味着pods /etc/resolv.conf将是   配置为使用Kubernetes DNS服务器。否则,DNS服务器   将使用Kubernetes节点的(基本上是/etc/resolv.conf   工作节点,但无法解析cluster.local DNS。)

希望有帮助

答案 1 :(得分:0)

默认的ndots:n为5。这意味着,如果名称中包含的点数少于5个,则系统调用将尝试依次解决所有本地搜索域中的问题,并且在没有成功的情况下,将对其进行解析。最后只能是绝对名称。