You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Kubernetes 1.10下kube-dns与Flannel配置问题求助(containerd作为CRI)

Kubernetes 1.10 + containerd + Flannel:kube-dns "no route to host" 问题解决指南

我之前维护K8s 1.10集群的时候,碰到过和你完全一样的kube-dns报错问题——getsockopt no route to host,结合你用containerd做CRI、Flannel做网络插件的环境,大概率是网络插件和CRI的适配没做好,或者集群网络路由出了问题。咱们一步步来排查解决:

1. 先确认Flannel的CNI配置是否被containerd正确读取

K8s 1.10搭配的containerd版本一般是1.2.x,containerd默认从/etc/cni/net.d/加载CNI配置。先检查这个目录里有没有Flannel生成的配置文件:

ls /etc/cni/net.d/

正常情况下应该能看到类似10-flannel.conf的文件。如果没有,说明Flannel的DaemonSet没正确生成配置,先重启Flannel的Pod:

kubectl delete pod -n kube-system -l app=flannel

然后查看Flannel Pod的日志,确认它是否成功写入CNI配置:

kubectl logs -n kube-system -l app=flannel

日志里应该有类似「Writing CNI config to /etc/cni/net.d/10-flannel.conf」的提示。

2. 验证containerd的CNI插件路径配置

containerd的配置文件通常在/etc/containerd/config.toml,需要确保里面的CNI相关路径正确。找到[plugins."io.containerd.grpc.v1.cri".cni]这一段,检查:

[plugins."io.containerd.grpc.v1.cri".cni]
  bin_dir = "/opt/cni/bin"
  conf_dir = "/etc/cni/net.d"

如果路径不对,containerd会找不到CNI插件或者配置文件,导致Pod网络异常。修改后重启containerd服务:

systemctl restart containerd

3. 检查节点的Flannel子网路由

每个节点上都应该有Flannel分配的子网路由,用ip route查看:

ip route

正常会看到一条指向Flannel网桥(比如flannel.1)的路由,格式类似:10.244.1.0/24 dev flannel.1 proto kernel scope link src 10.244.1.0。如果没有这条路由,说明Flannel网络初始化失败,先检查节点内核是否支持VXLAN(Flannel默认用VXLAN后端):

modprobe vxlan
lsmod | grep vxlan

如果模块没加载,手动加载后再重启Flannel Pod。

4. 测试kube-dns Pod的网络连通性

进入kube-dns的Pod,尝试ping K8s API Server的IP,看看是否能连通:

kubectl exec -n kube-system kube-dns-595fdb6c46-9tvn9 -c kubedns -- ping <你的API_SERVER_IP>

如果ping不通,说明Pod到API Server的网络有问题。再检查kube-dns的Service和Endpoints是否正常:

kubectl get svc kube-dns -n kube-system
kubectl get endpoints kube-dns -n kube-system

如果Endpoints是空的,说明kube-dns Pod没成功注册到Service,可能是Pod标签和Service的选择器不匹配,或者Pod本身状态异常。

5. 排查防火墙与SELinux的干扰

老版本集群里,防火墙(比如firewalld、iptables)或者SELinux经常会阻断Pod间的通信。可以临时关闭防火墙测试:

systemctl stop firewalld
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X

如果关闭后kube-dns恢复正常,就需要配置防火墙规则允许Flannel和K8s的网络流量。关于SELinux,可以临时设为宽容模式:

setenforce 0

如果有效,再修改/etc/selinux/config永久调整或者配置对应的规则。


内容的提问来源于stack exchange,提问作者junglie85

火山引擎 最新活动