Rancher:kubernetes 集群卡在待定状态。 "No route to host"
Rancher: kubernetes cluster stuck in pending. "No route to host"
我先在CentOS 8上搭建了一个kubernetes集群。我遵循了此处的操作方法:https://www.tecmint.com/install-a-kubernetes-cluster-on-centos-8/
然后我构建了一个 Ubuntu 18.04 VM 并在其上安装了 Rancher。我可以很好地访问 Rancher 网站,一切似乎都在 Rancher 端工作,除了我无法将我的 kubernetes 集群添加到它。
当我使用“添加集群”功能时,我选择了“其他集群”选项,为其命名,然后单击创建。然后我将不安全的“集群注册命令”复制到主节点。它似乎可以很好地执行命令。
在故障排除中,我发出了以下命令:kubectl -n cattle-system logs -l app=cattle-cluster-agent
我得到的输出如下:
INFO: Environment: CATTLE_ADDRESS=10.42.0.1 CATTLE_CA_CHECKSUM=94ad10e756d390cdf8b25465f938c04344a396b16b4ff6c0922b9cd6b9fc454c CATTLE_CLUSTER=true CATTLE_CLUSTER_REGISTRY= CATTLE_FEATURES= CATTLE_INTERNAL_ADDRESS= CATTLE_IS_RKE=false CATTLE_K8S_MANAGED=true CATTLE_NODE_NAME=cattle-cluster-agent-7b9df685cf-9kr4p CATTLE_SERVER=https://192.168.188.189:8443
INFO: Using resolv.conf: nameserver 10.96.0.10 search cattle-system.svc.cluster.local svc.cluster.local cluster.local options ndots:5
ERROR: https://192.168.188.189:8443/ping is not accessible (Failed to connect to 192.168.188.189 port 8443: No route to host)
INFO: Environment: CATTLE_ADDRESS=10.40.0.0 CATTLE_CA_CHECKSUM=94ad10e756d390cdf8b25465f938c04344a396b16b4ff6c0922b9cd6b9fc454c CATTLE_CLUSTER=true CATTLE_CLUSTER_REGISTRY= CATTLE_FEATURES= CATTLE_INTERNAL_ADDRESS= CATTLE_IS_RKE=false CATTLE_K8S_MANAGED=true CATTLE_NODE_NAME=cattle-cluster-agent-7bc7687557-tkvzt CATTLE_SERVER=https://192.168.188.189:8443
INFO: Using resolv.conf: nameserver 10.96.0.10 search cattle-system.svc.cluster.local svc.cluster.local cluster.local options ndots:5
ERROR: https://192.168.188.189:8443/ping is not accessible (Failed to connect to 192.168.188.189 port 8443: No route to host)
[root@k8s-master ~]# ping 192.168.188.189
PING 192.168.188.189 (192.168.188.189) 56(84) bytes of data.
64 bytes from 192.168.188.189: icmp_seq=1 ttl=64 time=0.432 ms
64 bytes from 192.168.188.189: icmp_seq=2 ttl=64 time=0.400 ms
^C
--- 192.168.188.189 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.400/0.416/0.432/0.016 ms
如您所见,我收到了“没有主机路由”错误消息。但是,我可以使用其 IP 地址 ping rancher VM。
它似乎试图在集群内使用 resolv.conf 并希望使用 10.96.0.10 来解析 192.168.188.189(我的 Rancher VM)的 IP 地址。但它似乎无法解决它。
我想我有某种 DNS 问题阻止我使用主机名。虽然我已经编辑了主节点和工作节点上的 /etc/hosts 文件以包含每个设备的条目。我可以使用它们的主机名 ping 设备,但我无法使用 :.当我尝试这样做时,我也收到“没有主机路由”错误消息。看这里:
[root@k8s-master ~]# ping k8s-worker1
PING k8s-worker1 (192.168.188.191) 56(84) bytes of data.
64 bytes from k8s-worker1 (192.168.188.191): icmp_seq=1 ttl=64 time=0.478 ms
64 bytes from k8s-worker1 (192.168.188.191): icmp_seq=2 ttl=64 time=0.449 ms
^C
--- k8s-worker1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.449/0.463/0.478/0.025 ms
[root@k8s-master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hello-world NodePort 10.103.5.49 <none> 8080:30370/TCP 45m
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 26h
nginx NodePort 10.97.172.245 <none> 80:30205/TCP 3h43m
[root@k8s-master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
hello-world-7884c6997d-2dc9z 1/1 Running 0 28m 10.40.0.4 k8s-worker3 <none> <none>
hello-world-7884c6997d-562lh 1/1 Running 0 28m 10.35.0.8 k8s-worker2 <none> <none>
hello-world-7884c6997d-78dmm 1/1 Running 0 28m 10.36.0.3 k8s-worker1 <none> <none>
hello-world-7884c6997d-7vt4f 1/1 Running 0 28m 10.40.0.6 k8s-worker3 <none> <none>
hello-world-7884c6997d-bpq5g 1/1 Running 0 49m 10.36.0.2 k8s-worker1 <none> <none>
hello-world-7884c6997d-c529d 1/1 Running 0 28m 10.35.0.6 k8s-worker2 <none> <none>
hello-world-7884c6997d-ddk7k 1/1 Running 0 28m 10.36.0.5 k8s-worker1 <none> <none>
hello-world-7884c6997d-fq8hx 1/1 Running 0 28m 10.35.0.7 k8s-worker2 <none> <none>
hello-world-7884c6997d-g5lxs 1/1 Running 0 28m 10.40.0.3 k8s-worker3 <none> <none>
hello-world-7884c6997d-kjb7f 1/1 Running 0 49m 10.35.0.3 k8s-worker2 <none> <none>
hello-world-7884c6997d-nfdpc 1/1 Running 0 28m 10.40.0.5 k8s-worker3 <none> <none>
hello-world-7884c6997d-nnd6q 1/1 Running 0 28m 10.36.0.7 k8s-worker1 <none> <none>
hello-world-7884c6997d-p6gxh 1/1 Running 0 49m 10.40.0.1 k8s-worker3 <none> <none>
hello-world-7884c6997d-p7v4b 1/1 Running 0 28m 10.35.0.4 k8s-worker2 <none> <none>
hello-world-7884c6997d-pwpxr 1/1 Running 0 28m 10.36.0.4 k8s-worker1 <none> <none>
hello-world-7884c6997d-qlg9h 1/1 Running 0 28m 10.40.0.2 k8s-worker3 <none> <none>
hello-world-7884c6997d-s89c5 1/1 Running 0 28m 10.35.0.5 k8s-worker2 <none> <none>
hello-world-7884c6997d-vd8ch 1/1 Running 0 28m 10.40.0.7 k8s-worker3 <none> <none>
hello-world-7884c6997d-wvnh7 1/1 Running 0 28m 10.36.0.6 k8s-worker1 <none> <none>
hello-world-7884c6997d-z57kx 1/1 Running 0 49m 10.36.0.1 k8s-worker1 <none> <none>
nginx-6799fc88d8-gm5ls 1/1 Running 0 4h11m 10.35.0.1 k8s-worker2 <none> <none>
nginx-6799fc88d8-k2jtw 1/1 Running 0 4h11m 10.44.0.1 k8s-worker1 <none> <none>
nginx-6799fc88d8-mc5mz 1/1 Running 0 4h12m 10.36.0.0 k8s-worker1 <none> <none>
nginx-6799fc88d8-qn6mh 1/1 Running 0 4h11m 10.35.0.2 k8s-worker2 <none> <none>
[root@k8s-master ~]# curl k8s-worker1:30205
curl: (7) Failed to connect to k8s-worker1 port 30205: No route to host
我怀疑这是我无法加入集群到rancher的根本原因。
编辑:我想为这个问题添加额外的细节。我的每个节点(主节点和工作节点)都在防火墙上打开了以下端口:
firewall-cmd --list-ports
6443/tcp 2379-2380/tcp 10250/tcp 10251/tcp 10252/tcp 10255/tcp 6783/tcp 6783/udp 6784/udp
对于 CNI,Kubernetes 集群使用 Weavenet。
每个节点(主节点和工作节点)都配置为在其网络配置中使用我的主要家庭 DNS 服务器(这也是一个 Active Directory 域控制器)。我已经为 DNS 服务器中的每个节点创建了 AAA 记录。节点未加入域。但是,我还编辑了每个节点的 /etc/hosts 文件以包含以下记录:
# more /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.188.190 k8s-master
192.168.188.191 k8s-worker1
192.168.188.192 k8s-worker2
192.168.188.193 k8s-worker3
我发现我可以使用“curl k8s-worker1.mydomain.com:30370”,成功率约为 33%。但我本以为 /etc/hosts 文件会优先于使用我的家庭 DNS 服务器。
最后,我注意到一个额外的异常。我发现集群没有在三个工作节点之间进行负载平衡。如上所示,我是 运行 一个名为“hello-world”的部署,该部署基于具有 20 个副本的 bashofmann/rancher-demo 图像。我还为 hello-world 创建了一个节点端口服务,它将节点端口 30370 映射到每个相应 pod 上的端口 8080。
如果我打开我的网络浏览器并转到 http://192.168.188.191:30370 然后它将加载该网站,但仅由 pods 在 k8s-worker1 上提供。它永远不会加载任何其他工作节点上任何 pods 提供的网站。这可以解释为什么我只能获得 ~33% 的成功,只要它是由我在 url.
中指定的同一个工作节点提供的
OP 确认问题是由防火墙规则引起的。这是通过禁用防火墙进行调试的,这导致所需的操作(集群添加)成功。
为了 nodePort 服务正常工作,端口范围 30000 - 32767
应该可以在集群的所有节点上访问。
我还发现禁用防火墙“修复”了这个问题,但这不是一个很好的解决方法。此外,为 tcp/udp 添加端口 30000-32767 对我不起作用。仍然没有通往主机的路径。
我先在CentOS 8上搭建了一个kubernetes集群。我遵循了此处的操作方法:https://www.tecmint.com/install-a-kubernetes-cluster-on-centos-8/
然后我构建了一个 Ubuntu 18.04 VM 并在其上安装了 Rancher。我可以很好地访问 Rancher 网站,一切似乎都在 Rancher 端工作,除了我无法将我的 kubernetes 集群添加到它。
当我使用“添加集群”功能时,我选择了“其他集群”选项,为其命名,然后单击创建。然后我将不安全的“集群注册命令”复制到主节点。它似乎可以很好地执行命令。
在故障排除中,我发出了以下命令:kubectl -n cattle-system logs -l app=cattle-cluster-agent
我得到的输出如下:
INFO: Environment: CATTLE_ADDRESS=10.42.0.1 CATTLE_CA_CHECKSUM=94ad10e756d390cdf8b25465f938c04344a396b16b4ff6c0922b9cd6b9fc454c CATTLE_CLUSTER=true CATTLE_CLUSTER_REGISTRY= CATTLE_FEATURES= CATTLE_INTERNAL_ADDRESS= CATTLE_IS_RKE=false CATTLE_K8S_MANAGED=true CATTLE_NODE_NAME=cattle-cluster-agent-7b9df685cf-9kr4p CATTLE_SERVER=https://192.168.188.189:8443
INFO: Using resolv.conf: nameserver 10.96.0.10 search cattle-system.svc.cluster.local svc.cluster.local cluster.local options ndots:5
ERROR: https://192.168.188.189:8443/ping is not accessible (Failed to connect to 192.168.188.189 port 8443: No route to host)
INFO: Environment: CATTLE_ADDRESS=10.40.0.0 CATTLE_CA_CHECKSUM=94ad10e756d390cdf8b25465f938c04344a396b16b4ff6c0922b9cd6b9fc454c CATTLE_CLUSTER=true CATTLE_CLUSTER_REGISTRY= CATTLE_FEATURES= CATTLE_INTERNAL_ADDRESS= CATTLE_IS_RKE=false CATTLE_K8S_MANAGED=true CATTLE_NODE_NAME=cattle-cluster-agent-7bc7687557-tkvzt CATTLE_SERVER=https://192.168.188.189:8443
INFO: Using resolv.conf: nameserver 10.96.0.10 search cattle-system.svc.cluster.local svc.cluster.local cluster.local options ndots:5
ERROR: https://192.168.188.189:8443/ping is not accessible (Failed to connect to 192.168.188.189 port 8443: No route to host)
[root@k8s-master ~]# ping 192.168.188.189
PING 192.168.188.189 (192.168.188.189) 56(84) bytes of data.
64 bytes from 192.168.188.189: icmp_seq=1 ttl=64 time=0.432 ms
64 bytes from 192.168.188.189: icmp_seq=2 ttl=64 time=0.400 ms
^C
--- 192.168.188.189 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.400/0.416/0.432/0.016 ms
如您所见,我收到了“没有主机路由”错误消息。但是,我可以使用其 IP 地址 ping rancher VM。
它似乎试图在集群内使用 resolv.conf 并希望使用 10.96.0.10 来解析 192.168.188.189(我的 Rancher VM)的 IP 地址。但它似乎无法解决它。
我想我有某种 DNS 问题阻止我使用主机名。虽然我已经编辑了主节点和工作节点上的 /etc/hosts 文件以包含每个设备的条目。我可以使用它们的主机名 ping 设备,但我无法使用 :.当我尝试这样做时,我也收到“没有主机路由”错误消息。看这里:
[root@k8s-master ~]# ping k8s-worker1
PING k8s-worker1 (192.168.188.191) 56(84) bytes of data.
64 bytes from k8s-worker1 (192.168.188.191): icmp_seq=1 ttl=64 time=0.478 ms
64 bytes from k8s-worker1 (192.168.188.191): icmp_seq=2 ttl=64 time=0.449 ms
^C
--- k8s-worker1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.449/0.463/0.478/0.025 ms
[root@k8s-master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hello-world NodePort 10.103.5.49 <none> 8080:30370/TCP 45m
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 26h
nginx NodePort 10.97.172.245 <none> 80:30205/TCP 3h43m
[root@k8s-master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
hello-world-7884c6997d-2dc9z 1/1 Running 0 28m 10.40.0.4 k8s-worker3 <none> <none>
hello-world-7884c6997d-562lh 1/1 Running 0 28m 10.35.0.8 k8s-worker2 <none> <none>
hello-world-7884c6997d-78dmm 1/1 Running 0 28m 10.36.0.3 k8s-worker1 <none> <none>
hello-world-7884c6997d-7vt4f 1/1 Running 0 28m 10.40.0.6 k8s-worker3 <none> <none>
hello-world-7884c6997d-bpq5g 1/1 Running 0 49m 10.36.0.2 k8s-worker1 <none> <none>
hello-world-7884c6997d-c529d 1/1 Running 0 28m 10.35.0.6 k8s-worker2 <none> <none>
hello-world-7884c6997d-ddk7k 1/1 Running 0 28m 10.36.0.5 k8s-worker1 <none> <none>
hello-world-7884c6997d-fq8hx 1/1 Running 0 28m 10.35.0.7 k8s-worker2 <none> <none>
hello-world-7884c6997d-g5lxs 1/1 Running 0 28m 10.40.0.3 k8s-worker3 <none> <none>
hello-world-7884c6997d-kjb7f 1/1 Running 0 49m 10.35.0.3 k8s-worker2 <none> <none>
hello-world-7884c6997d-nfdpc 1/1 Running 0 28m 10.40.0.5 k8s-worker3 <none> <none>
hello-world-7884c6997d-nnd6q 1/1 Running 0 28m 10.36.0.7 k8s-worker1 <none> <none>
hello-world-7884c6997d-p6gxh 1/1 Running 0 49m 10.40.0.1 k8s-worker3 <none> <none>
hello-world-7884c6997d-p7v4b 1/1 Running 0 28m 10.35.0.4 k8s-worker2 <none> <none>
hello-world-7884c6997d-pwpxr 1/1 Running 0 28m 10.36.0.4 k8s-worker1 <none> <none>
hello-world-7884c6997d-qlg9h 1/1 Running 0 28m 10.40.0.2 k8s-worker3 <none> <none>
hello-world-7884c6997d-s89c5 1/1 Running 0 28m 10.35.0.5 k8s-worker2 <none> <none>
hello-world-7884c6997d-vd8ch 1/1 Running 0 28m 10.40.0.7 k8s-worker3 <none> <none>
hello-world-7884c6997d-wvnh7 1/1 Running 0 28m 10.36.0.6 k8s-worker1 <none> <none>
hello-world-7884c6997d-z57kx 1/1 Running 0 49m 10.36.0.1 k8s-worker1 <none> <none>
nginx-6799fc88d8-gm5ls 1/1 Running 0 4h11m 10.35.0.1 k8s-worker2 <none> <none>
nginx-6799fc88d8-k2jtw 1/1 Running 0 4h11m 10.44.0.1 k8s-worker1 <none> <none>
nginx-6799fc88d8-mc5mz 1/1 Running 0 4h12m 10.36.0.0 k8s-worker1 <none> <none>
nginx-6799fc88d8-qn6mh 1/1 Running 0 4h11m 10.35.0.2 k8s-worker2 <none> <none>
[root@k8s-master ~]# curl k8s-worker1:30205
curl: (7) Failed to connect to k8s-worker1 port 30205: No route to host
我怀疑这是我无法加入集群到rancher的根本原因。
编辑:我想为这个问题添加额外的细节。我的每个节点(主节点和工作节点)都在防火墙上打开了以下端口:
firewall-cmd --list-ports
6443/tcp 2379-2380/tcp 10250/tcp 10251/tcp 10252/tcp 10255/tcp 6783/tcp 6783/udp 6784/udp
对于 CNI,Kubernetes 集群使用 Weavenet。
每个节点(主节点和工作节点)都配置为在其网络配置中使用我的主要家庭 DNS 服务器(这也是一个 Active Directory 域控制器)。我已经为 DNS 服务器中的每个节点创建了 AAA 记录。节点未加入域。但是,我还编辑了每个节点的 /etc/hosts 文件以包含以下记录:
# more /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.188.190 k8s-master
192.168.188.191 k8s-worker1
192.168.188.192 k8s-worker2
192.168.188.193 k8s-worker3
我发现我可以使用“curl k8s-worker1.mydomain.com:30370”,成功率约为 33%。但我本以为 /etc/hosts 文件会优先于使用我的家庭 DNS 服务器。
最后,我注意到一个额外的异常。我发现集群没有在三个工作节点之间进行负载平衡。如上所示,我是 运行 一个名为“hello-world”的部署,该部署基于具有 20 个副本的 bashofmann/rancher-demo 图像。我还为 hello-world 创建了一个节点端口服务,它将节点端口 30370 映射到每个相应 pod 上的端口 8080。
如果我打开我的网络浏览器并转到 http://192.168.188.191:30370 然后它将加载该网站,但仅由 pods 在 k8s-worker1 上提供。它永远不会加载任何其他工作节点上任何 pods 提供的网站。这可以解释为什么我只能获得 ~33% 的成功,只要它是由我在 url.
中指定的同一个工作节点提供的OP 确认问题是由防火墙规则引起的。这是通过禁用防火墙进行调试的,这导致所需的操作(集群添加)成功。
为了 nodePort 服务正常工作,端口范围 30000 - 32767
应该可以在集群的所有节点上访问。
我还发现禁用防火墙“修复”了这个问题,但这不是一个很好的解决方法。此外,为 tcp/udp 添加端口 30000-32767 对我不起作用。仍然没有通往主机的路径。