没有从一些Kubernetes容器到同一集群中其他容器的主机路由



这是一个使用calico的Kubesray部署。除了有一个代理之外,所有默认值都保持原样。Kubespray毫无问题地跑到了终点。

访问Kubernetes服务开始失败,经过调查,没有coredns服务的主机路由。通过IP访问K8S服务成功。其他一切似乎都是正确的,所以我只剩下一个可以工作的集群,但没有DNS。

以下是一些背景信息:启动busybox容器:

# nslookup kubernetes.default
Server:     169.254.25.10
Address:    169.254.25.10:53
** server can't find kubernetes.default: NXDOMAIN
*** Can't find kubernetes.default: No answer

现在,在明确定义其中一个CoreDNS pod的IP时的输出:

# nslookup kubernetes.default 10.233.0.3
;; connection timed out; no servers could be reached

请注意,到Kubernetes API的telnet有效:

# telnet 10.233.0.1 443
Connected to 10.233.0.1

kube代理日志:102.33.0.3是coredns的服务IP。最后一行看起来令人担忧,尽管它是INFO。

$ kubectl logs kube-proxy-45v8n -nkube-system
I1114 14:19:29.657685       1 node.go:135] Successfully retrieved node IP: X.59.172.20
I1114 14:19:29.657769       1 server_others.go:176] Using ipvs Proxier.
I1114 14:19:29.664959       1 server.go:529] Version: v1.16.0
I1114 14:19:29.665427       1 conntrack.go:52] Setting nf_conntrack_max to 262144
I1114 14:19:29.669508       1 config.go:313] Starting service config controller
I1114 14:19:29.669566       1 shared_informer.go:197] Waiting for caches to sync for service config
I1114 14:19:29.669602       1 config.go:131] Starting endpoints config controller
I1114 14:19:29.669612       1 shared_informer.go:197] Waiting for caches to sync for endpoints config
I1114 14:19:29.769705       1 shared_informer.go:204] Caches are synced for service config 
I1114 14:19:29.769756       1 shared_informer.go:204] Caches are synced for endpoints config 
I1114 14:21:29.666256       1 graceful_termination.go:93] lw: remote out of the list: 10.233.0.3:53/TCP/10.233.124.23:53
I1114 14:21:29.666380       1 graceful_termination.go:93] lw: remote out of the list: 10.233.0.3:53/TCP/10.233.122.11:53

所有pod都在运行,没有崩溃/重新启动等,否则服务运行正常。

IPVS看起来是正确的。CoreDNS服务定义如下:

# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.233.0.1:443 rr
-> x.59.172.19:6443           Masq    1      0          0         
-> x.59.172.20:6443           Masq    1      1          0         
TCP  10.233.0.3:53 rr
-> 10.233.122.12:53             Masq    1      0          0         
-> 10.233.124.24:53             Masq    1      0          0         
TCP  10.233.0.3:9153 rr
-> 10.233.122.12:9153           Masq    1      0          0         
-> 10.233.124.24:9153           Masq    1      0          0         
TCP  10.233.51.168:3306 rr
-> x.59.172.23:6446           Masq    1      0          0         
TCP  10.233.53.155:44134 rr
-> 10.233.89.20:44134           Masq    1      0          0         
UDP  10.233.0.3:53 rr
-> 10.233.122.12:53             Masq    1      0          314       
-> 10.233.124.24:53             Masq    1      0          312

主机路由看起来也正确。

# ip r
default via x.59.172.17 dev ens3 proto dhcp src x.59.172.22 metric 100 
10.233.87.0/24 via x.59.172.21 dev tunl0 proto bird onlink 
blackhole 10.233.89.0/24 proto bird 
10.233.89.20 dev calib88cf6925c2 scope link 
10.233.89.21 dev califdffa38ed52 scope link 
10.233.122.0/24 via x.59.172.19 dev tunl0 proto bird onlink 
10.233.124.0/24 via x.59.172.20 dev tunl0 proto bird onlink 
x.59.172.16/28 dev ens3 proto kernel scope link src x.59.172.22 
x.59.172.17 dev ens3 proto dhcp scope link src x.59.172.22 metric 100 
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown

我已经在不同的环境中重新部署了相同的集群,使用法兰绒和印花布,使用iptables而不是ipv。我还暂时禁用了部署后的dockerhttp代理。这些都没有任何区别。

此外:kube_service_addresss:10.233.0.0/18kube_pods_subnet:10.233.64.0/18(它们不重叠(

调试此问题的下一步是什么?

我强烈建议您避免使用最新的busybox映像来排除DNS故障。在更新到1.28的版本上,关于dnslookup的问题报道很少。

v 1.28.4

user@node1:~$ kubectl exec -ti busybox busybox | head -1
BusyBox v1.28.4 (2018-05-22 17:00:17 UTC) multi-call binary.
user@node1:~$ kubectl exec -ti busybox -- nslookup kubernetes.default 
Server:    169.254.25.10
Address 1: 169.254.25.10
Name:      kubernetes.default
Address 1: 10.233.0.1 kubernetes.default.svc.cluster.local

v 1.31.1

user@node1:~$ kubectl exec -ti busyboxlatest busybox | head -1
BusyBox v1.31.1 (2019-10-28 18:40:01 UTC) multi-call binary.
user@node1:~$ kubectl exec -ti busyboxlatest -- nslookup kubernetes.default 
Server:     169.254.25.10
Address:    169.254.25.10:53
** server can't find kubernetes.default: NXDOMAIN
*** Can't find kubernetes.default: No answer
command terminated with exit code 1

更深入地探索更多的可能性,我在GCP上重现了你的问题,经过一番挖掘,我能够找出是什么导致了这个沟通问题。

默认情况下,GCE(谷歌计算引擎(会阻止主机之间的流量;我们必须允许Calico流量在不同主机上的容器之间流动。

根据calico文档,您可以通过创建允许以下通信规则的防火墙来实现:

gcloud compute firewall-rules create calico-ipip --allow 4 --network "default" --source-ranges "10.128.0.0/9"

您可以使用以下命令验证规则:

gcloud compute firewall-rules list

这并没有出现在最新的印花布文件中,但它仍然是真实和必要的。

创建防火墙规则之前:

user@node1:~$ kubectl exec -ti busybox2 -- nslookup kubernetes.default 
Server:    10.233.0.3
Address 1: 10.233.0.3 coredns.kube-system.svc.cluster.local
nslookup: can't resolve 'kubernetes.default'
command terminated with exit code 1

创建防火墙规则后:

user@node1:~$ kubectl exec -ti busybox2 -- nslookup kubernetes.default 
Server:    10.233.0.3
Address 1: 10.233.0.3 coredns.kube-system.svc.cluster.local
Name:      kubernetes.default
Address 1: 10.233.0.1 kubernetes.default.svc.cluster.local

无论你是使用kubespray还是kubeadm引导集群,这个问题都会发生,因为calico需要在节点之间通信,而GCE默认会阻止它。

这对我来说是有效的,我尝试使用kubespray安装我的k8s集群,配置calico作为CNI,containerd作为容器运行时

iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -F
[delete coredns pod]