gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 12:02:45 25 4
gpt4 key购买 nike

这是使用calico的Kubespray部署。除存在代理外,所有默认设置均保持原样。 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-proxy日志:
10.233.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而不是ipvs在不同的环境中重新部署了同一群集。临时部署后,我还禁用了docker http代理。没有任何区别。

也:
kube_service_addresses:10.233.0.0/18
kube_pods_subnet:10.233.64.0/18
(它们不重叠)

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

最佳答案

我强烈建议您避免使用最新的busybox镜像对DNS进行故障排除。关于dnslookup的报道,在1.28以后的版本中,issues很少。

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(Google Compute Engine)会阻止主机之间的流量;我们必须允许Calico流量在不同主机上的容器之间流动。

根据calico documentation,您可以通过创建允许此通信规则的防火墙来做到这一点:

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

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

gcloud compute firewall-rules list

在最新的calico文档中没有提供此功能,但这仍然是正确且必要的。

创建防火墙规则之前:

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默认将其阻止,所以会发生此问题。

关于kubernetes - 从某些Kubernetes容器到同一集群中其他容器的主机没有路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58860745/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com