coredns无法正确解析服务名称

时间:2018-11-16 06:56:48

标签: kubernetes coredns

我使用Kubernetes v1.11.3,它使用coredns解析主机或服务名称,但是我在pod中找到了,解析无法正常工作,

# kubectl get services --all-namespaces -o wide
NAMESPACE     NAME          TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE       SELECTOR
default       kubernetes    ClusterIP   10.96.0.1       <none>        443/TCP          50d       <none>
kube-system   calico-etcd   ClusterIP   10.96.232.136   <none>        6666/TCP         50d       k8s-app=calico-etcd
kube-system   kube-dns      ClusterIP   10.96.0.10      <none>        53/UDP,53/TCP    50d       k8s-app=kube-dns
kube-system   kubelet       ClusterIP   None            <none>        10250/TCP        32d       <none>
testalex      grafana       NodePort    10.96.51.173    <none>        3000:30002/TCP   2d        app=grafana
testalex      k8s-alert     NodePort    10.108.150.47   <none>        9093:30093/TCP   13m       app=alertmanager
testalex      prometheus    NodePort    10.96.182.108   <none>        9090:30090/TCP   16m       app=prometheus

以下命令无响应

# kubectl exec -it k8s-monitor-7ddcb74b87-n6jsd -n testalex /bin/bash
[root@k8s-monitor-7ddcb74b87-n6jsd /]# ping k8s-alert
PING k8s-alert.testalex.svc.cluster.local (10.108.150.47) 56(84) bytes of data.

没有警戒线输出日志

# kubectl logs coredns-78fcdf6894-h78sd -n kube-system

我认为也许是有问题,但是我找不到问题所在,另一个问题是为什么主节点上有两个coredns pod,而每个节点上却有一个

更新

似乎coredns可以正常工作,但我不理解ping命令不返回

[root@k8s-monitor-7ddcb74b87-n6jsd yum.repos.d]# 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

[root@k8s-monitor-7ddcb74b87-n6jsd yum.repos.d]# cat /etc/resolv.conf
nameserver 10.96.0.10
search testalex.svc.cluster.local svc.cluster.local cluster.local
options ndots:5

# kubectl get ep kube-dns --namespace=kube-system

NAME       ENDPOINTS                                                        AGE
kube-dns   192.168.121.3:53,192.168.121.4:53,192.168.121.3:53 + 1 more...   50d

也无法访问dns服务器

# kubectl exec -it k8s-monitor-7ddcb74b87-n6jsd -n testalex /bin/bash
[root@k8s-monitor-7ddcb74b87-n6jsd /]# cat /etc/resolv.conf
nameserver 10.96.0.10
search testalex.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
[root@k8s-monitor-7ddcb74b87-n6jsd /]# ping 10.96.0.10
PING 10.96.0.10 (10.96.0.10) 56(84) bytes of data.
^C
--- 10.96.0.10 ping statistics ---
9 packets transmitted, 0 received, 100% packet loss, time 8000ms

我认为也许我配置了错误的网络 这是我的集群初始化命令

 kubeadm init --kubernetes-version=v1.11.3  --apiserver-advertise-address=10.100.1.20 --pod-network-cidr=172.16.0.0/16 

这是calico IP池集

# kubectl exec -it calico-node-77m9l -n kube-system /bin/sh
Defaulting container name to calico-node.
Use 'kubectl describe pod/calico-node-77m9l -n kube-system' to see all of the containers in this pod.
/ # cd /tmp
/tmp # ls
calicoctl  tunl-ip
/tmp # ./calicoctl get ipPool
CIDR
192.168.0.0/16

4 个答案:

答案 0 :(得分:1)

您可以先检查dns是否正常工作

从Pod k8s-monitor-7ddcb74b87-n6jsd内部在kubernetes.default上运行nslookup,检查其是否正常工作。

[root@k8s-monitor-7ddcb74b87-n6jsd /]# 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

如果返回输出,则表示coredns一切正常。如果输出不正确,请查看Pod k8s-monitor-7ddcb74b87-n6jsd内的resolve.conf,它应该返回如下输出:

[root@metrics-master-2 /]# cat /etc/resolv.conf 
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local ec2.internal
options ndots:5

最后使用以下命令检查coredns端点是否公开:

kubectl get ep kube-dns --namespace=kube-system
NAME       ENDPOINTS                       AGE
kube-dns   10.180.3.17:53,10.180.3.17:53    1h

您可以通过将日志插件添加到CoreDNS配置(也称为Corefile)中来验证CoreDNS是否正在接收查询。 CoreDNS Corefile保存在名为coredns的ConfigMap中

希望这会有所帮助。

编辑:

您可能遇到此问题,请看一下:

https://github.com/kubernetes/kubeadm/issues/1056

答案 1 :(得分:0)

感谢您的回答。这是输出。 IP肯定不是真实的。

[root@master ~]# nslookup kubernetes.default
Server:         203.150.92.12
Address:        203.150.92.12#53

** server can't find kubernetes.default: NXDOMAIN

[root@master ~]# kubectl cluster-info
Kubernetes master is running at https://203.150.72.81:6443
coredns is running at https://203.150.72.81:6443/api/v1/namespaces/kube-system/services/coredns:dns/proxy
kubernetes-dashboard is running at https://203.150.72.81:6443/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy
metrics-server is running at https://203.150.72.81:6443/api/v1/namespaces/kube-system/services/https:metrics-server:/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
[root@master ~]# cat /etc/resolv.conf
search invalid
nameserver 203.150.92.12
nameserver 203.150.92.10
nameserver 1111:c207::2:55
[root@master ~]# kubectl get ep kube-dns --namespace=kube-system
Error from server (NotFound): endpoints "kube-dns" not found
[root@master ~]#

答案 2 :(得分:0)

我认为您无法ping通的原因是因为您使用iptables将请求重定向到服务群集IP到正确的Pod。 iptables规则将仅将流量重定向到具有导出端口的服务集群IP。 icmp请求永远不会重定向到真实端点。

答案 3 :(得分:0)

您不能始终ping服务群集的IP地址或主机名,因为它是虚拟IP

服务的群集IP是一个虚拟IP,仅在与服务端口结合使用时才有意义。您可以通过srv recored(虚拟ip和端口的组合)尝试相同的操作(通过标记luksa引用kubernetes)