在某些查询中附加了 Kubernetes DNS 搜索域



我正在运行一个带有主节点和 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 解析系统。在此页面上,使用 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

这是怎么回事?!文档是否错误或我的集群内有问题?

默认的 ndots:n 是 5。这意味着,如果名称中包含少于 5 个点,则 syscall 将尝试首先通过所有本地搜索域按顺序解析它,并且 - 如果没有成功 - 将它解析为绝对名称。

我将使用 nginx 入口控制器示例向您展示和解释。我相信 traefik 入口控制器的情况是一样的。

所以首先 - 关于你所描述kube-dnscoredns混乱: 这是通过设计实现的。你可以参考 GitHub CoreDNS 仍然标记为 kube-DNS 问题 阅读更多内容。

在我的集群中,我还有coredns称为kube-dns的服务,它指的是coredns具有k8s-app=kube-dns标签的 pod

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>

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

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

但与此同时,我的nginx入口控制器pod已经nameserver 169.254.169.254,甚至无法nslookup

cat /etc/resolv.conf
search c.myproj.internal. google.internal.
nameserver 169.254.169.254

不确定您在 traefic pod 上/etc/resolv.conf有什么,但问题就在那里。您拥有的/etc/resolv.conf从节点开始

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

来自 dns-pod-service 文档:

"ClusterFirstWithHostNet":对于使用hostNetwork运行的Pod,您 应明确设置其DNS策略"ClusterFirstWithHostNet"。

从以下位置编辑 nginx-入口控制器部署后

dnsPolicy: ClusterFirst
hostNetwork: true

dnsPolicy: ClusterFirstWithHostNet
hostNetwork: true

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

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

几个网址,其中包含与主机网络/dnsPolicy 相关的问题和解释。这是正确配置 Traefik 的重要部分:

1) k8s 上的 Traefik 不在不更改部署的情况下不侦听外部

2)堆栈问题

3)与特雷菲克文章的入口:

dnsPolicy: ClusterFirstWithHostNet

此设置很重要。它将配置要使用的 Traefik pod Kubernetes 集群内部 DNS 服务器(很可能是 KubeDNS 或 也许是核心DNS)。这意味着 pods/etc/resolv.conf 将是 配置为使用 Kubernetes DNS 服务器。否则 DNS 服务器 的 Kubernetes 节点将被使用(基本上是/etc/resolv.conf 的 工作节点,但无法解析集群.本地 DNS,例如)。

希望对你有帮助

最新更新