kubectl命令报错:Unable to connect to the server: dial tcp XXX:16443: connect: no route to host

文章讲述了在使用kubectl连接kubernetes集群时遇到的两种错误:一种是noroutetohost,另一种是connectiontimeout。作者分析了可能的原因,包括集群故障、配置文件中的IP错误以及haproxy设置问题。解决方案是检查并修正配置文件中的IP地址,确保其指向正确的虚拟IP和端口号。经过修改,kubectl命令可以正常工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前提

架构:keepalived+haproxy+kubernetes

问题说明

kubernetes集群好久不用了,今天打开集群执行一个kubectl get nodes命令,报错如下:
Unable to connect to the server: dial tcp 192.168.2.XXX:16443: connect: no route to host

分析原因

出现这个问题几种原因,

  1. 集群坏了:如果报错的IP是master1的节点IP或虚拟IP(vip)加16443端口号,执行kubectl命令还报上面的错误,说明集群坏了,需要逐步排查原因。
  2. /root/.kube/config中的IP地址错误:如果错误中的IP地址不是master1的节点IP或虚拟IP(vip)加16443端口号,需要修改配置文件中的IP。一般改为虚拟IP(vip)+16443端口号。
  3. haproxy:由于haproxy配置的是监听16443端口,也是集群的入口。因为报错的端口号是16443,所以要检查是否是haproxy的IP问题,如果是的话要修改haproxy配置文件,然后重启haproxysystemctl restart haproxy

解决问题

经排查,我的问题属于第二种,因为报错的意思是没有找不到192.168.2.XXX:16443这个路由,于是检查config文件:

vim /root/.kube/config

查看IP是否正确,经检查,我虚拟IP为:192.168.2.249,而这里显然不是,将IP修改为192.168.2.249:16443
在这里插入图片描述

保存退出后再次查看节点状态,kubectl命令就可以正常使用了。
在这里插入图片描述

另一中错误:Unable to connect to the server: dial tcp 123.56.91.155:6443: i/o timeout

Unable to connect to the server: dial tcp 123.56.91.155:6443: i/o timeout
刚开始爆出的错误是这个,一看这个IP就不是我当初创建集群时的IP,而是一个阿里云公网IP,其实进入config文件中修改成自己集群的IP就可以了。

### 解决 'no route to host' 错误 当遇到 `dial tcp: lookup on no route to host` 的错误提示时,这通常意味着客户端尝试连接的目标主机不可达。对于 Kubernetes API Server (10.10.10.120:6443) 出现此类问题的情况,可以从以下几个方面进行排查: #### 1. 验证网络连通性 确保本地机器能够到达目标 IP 地址 10.10.10.120。可以使用 ping 或者 traceroute 工具来测试。 ```bash ping 10.10.10.120 traceroute 10.10.10.120 ``` 如果这些命令返回失败,则说明存在路由配置不当或防火墙阻止等问题[^1]。 #### 2. 检查防火墙设置 确认源端与目的端之间的任何中间设备上的防火墙规则允许 TCP 流量通过端口 6443。可以通过临时关闭防火墙来进行验证(注意安全风险),或者添加特定的放行规则。 ```bash sudo ufw allow 6443/tcp # 对于 UFW 用户空间工具 firewall-cmd --add-port=6443/tcp --permanent # 对于 firewalld ``` #### 3. DNS解析检查 虽然题目中的情况看起来像是直接指定了 IP 地址而不是域名,但如果涉及到其他服务发现机制的话,仍然要确保DNS正常工作并能正确解析相关名称。 #### 4. 容器平台内部通信状况评估 如果是容器化环境中部署的应用程序遇到了这个问题,还需要考虑集群内各节点间的网络插件是否安装配置得当以及CNI组件的工作状态如何。 #### 5. 使用 telnet 或 curl 命令进一步诊断 可以直接利用简单的命令行工具像telnet去探测远程服务器上指定的服务端口是否开放;也可以借助curl发起HTTP请求查看响应结果。 ```bash telnet 10.10.10.120 6443 curl https://10.10.10.120:6443/version --insecure ``` 以上方法可以帮助定位具体原因所在,并采取相应措施解决问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是小bā吖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值