weave net 不是“装完就通”的黑盒,常见网络不通、pod 间 ping 不通、dns 解析失败等问题多源于节点环境或参数适配,而非 weave 本身故障;需重点检查节点网络、内核模块(如 br_netfilter)、防火墙(udp 6783)、mtu 匹配及 dns 服务依赖(如 coredns rbac 与网络连通性)。

直接上结论:Weave Net 不是“装完就通”的黑盒,kubectl apply -f 一行命令能跑起来,但网络不通、Pod 间 ping 不通、DNS 解析失败——这些常见问题几乎都出在节点环境或参数适配上,而不是 Weave 本身坏了。
为什么 kubectl apply -f https://cloud.weave.works/k8s/net?k8s-version=... 常常失败
这条命令看似简单,实际隐含三个关键依赖点:
-
kubectl version输出必须能被base64正确编码,且中间不能有换行或空格(tr -d '\n'比tr -d ' '更可靠) - 集群节点必须能直连
cloud.weave.works(国内环境常被 DNS 污染或防火墙拦截,建议先curl -I https://cloud.weave.works/k8s/net测试) - Weave 的 DaemonSet 默认使用
hostNetwork: true,若节点启用了systemd-resolved或自定义 DNS 配置,容器内可能无法解析kubernetes.default.svc
更稳妥的做法是下载 YAML 后离线修改:wget https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n'),再用 sed 替换镜像地址为内网 registry 或加 --force 跳过 TLS 验证(仅限测试环境)。
weave-net Pod 一直 CrashLoopBackOff 怎么查
核心检查顺序是:宿主机网络 → 内核模块 → Weave 自身日志。不是先看 Weave 日志,而是先确认基础是否成立:
针对 Kubernetes 仪表板和 Web UI 的浏览器自动化。适用于与 Kubernetes Dashboard、Grafana、ArgoCD UI 或其他 Web 界面交互。需要设置 MCP_BROWSER_ENABLED=true。
- 执行
ip link show weave:如果不存在,说明 Weave 启动失败在初始化阶段(常见于br_netfilter模块未加载) - 运行
lsmod | grep br_netfilter,若无输出,需手动sudo modprobe br_netfilter并写入/etc/modules - 进
weave-netPod:kubectl logs -n kube-system <weave-pod-name> -c weave</weave-pod-name>,重点搜failed to obtain IP address(IPAM 冲突)、no route to host(节点间 UDP 6783 端口不通) - Weave 默认用 UDP 6783 建隧道,确保所有节点防火墙放行:
sudo ufw allow 6783/udp或iptables -I INPUT -p udp --dport 6783 -j ACCEPT
如何让 Weave 使用指定 CIDR 而不和宿主机网络冲突
Weave 的默认 CIDR 是 10.32.0.0/12,但它只是 Pod 网络段,**不控制节点路由表**。真正影响通信的是 Weave 在每个节点上添加的路由规则。修改方式有两种:
- 部署前改 YAML:找到
spec.template.spec.containers[0].args数组,在末尾加--ipalloc-range=172.16.0.0/16(注意格式,不能带空格) - 部署后热更新(不推荐):删掉 DaemonSet,改 ConfigMap
weave-net中的net-conf.json字段,再重启所有weave-netPod - 关键提醒:若宿主机已有
172.16.0.0/16网段(比如 Docker 默认 bridge),Weave 会静默跳过分配,导致部分节点获取不到 IP —— 这时必须用--ipalloc-default-subnet强制指定子网
Pod 能通但 DNS 不通?别只盯 CoreDNS
Weave 本身不提供 DNS 服务,它只负责转发流量。DNS 失败通常是因为:
- CoreDNS Pod 运行在
weave网络下,但它的serviceAccount缺少pod-network相关 RBAC 权限(Weave 不自动处理这个) - Weave 的 MTU 默认是 1376,而某些云厂商网卡 MTU 是 9001;MTU 不匹配会导致 DNS 查询包被丢弃(现象:
nslookup超时,tcpdump -i weave port 53看不到响应) - 解决方案:在 Weave YAML 中给容器 args 加
--mtu=9001,或统一把节点物理网卡 MTU 改成 1376(ip link set eth0 mtu 1376)
最易被忽略的一点:Weave 的 weave-kube 容器启动时会读取节点的 /proc/sys/net/bridge/bridge-nf-call-iptables,如果该值为 0(常见于某些 CentOS 7 镜像),Weave 流量就不会被 iptables 规则跟踪,导致 SNAT 失效、跨节点 DNS 请求发不出去。










