我正在运行一个带有主节点和 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-dns
和coredns
混乱: 这是通过设计实现的。你可以参考 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,例如)。
希望对你有帮助