使用Vagrant+Virtualbox搭建K3s集群,跨节点Pod网络不通求助
K3s跨主机Pod网络不通问题修复
问题背景
使用Vagrant + VirtualBox搭建K3s集群,已确认:
- 节点间可互相连通
- Pod DNS解析正常,能访问互联网
- 同一主机上的Pod可通信
- 跨主机Pod网络无法正常工作
已做调整:将原host-only网络改为VirtualBox内部网络;改用wireguard-native作为Flannel后端解决了DNS解析异常问题。
Vagrantfile原配置如下:
Vagrant.configure("2") do |config| config.vm.provider "virtualbox" do |vb| vb.memory = "1536" end config.vm.define "server" do |server| server.vm.box = "ubuntu/jammy64" server.vm.hostname = "server" server.vm.network "forwarded_port", guest: 6443, host: 6443 server.vm.network :private_network, ip: '172.20.20.10', virtualbox__intnet: true server.vm.provision "shell", inline: "curl -sfL https://get.k3s.io | sh -s - server --write-kubeconfig /vagrant/config --write-kubeconfig-mode 666 --token=SECRET --tls-san 172.20.20.10 --flannel-iface enp0s8 --flannel-backend=wireguard-native --kube-apiserver-arg advertise-address=172.20.20.10 --node-external-ip=172.20.20.10 --node-ip=172.20.20.10" end config.vm.define "agent1" do |agent| agent.vm.box = "ubuntu/jammy64" agent.vm.hostname = "agent1" agent.vm.network :private_network, ip: '172.20.20.11', virtualbox__intnet: true agent.vm.provision "shell", inline: "curl -sfL https://get.k3s.io | K3S_URL=https://172.20.20.10:6443 K3S_TOKEN=SECRET sh -s - --node-ip=172.20.20.11 --node-external-ip=172.20.20.11" end config.vm.define "agent2" do |agent| agent.vm.box = "ubuntu/jammy64" agent.vm.hostname = "agent2" agent.vm.network :private_network, ip: '172.20.20.12', virtualbox__intnet: true agent.vm.provision "shell", inline: "curl -sfL https://get.k3s.io | K3S_URL=https://172.20.20.10:6443 K3S_TOKEN=SECRET sh -s - --node-ip=172.20.20.12 --node-external-ip=172.20.20.12" end end
问题原因
Server节点指定了Flannel使用的网卡enp0s8和wireguard-native后端,但Agent节点未配置这两个参数:
- 未指定
--flannel-iface时,Flannel可能会选择默认的外网网卡(而非内部私有网络网卡),导致节点间隧道无法建立 - Agent与Server使用不同的Flannel后端配置,无法正常协商跨节点网络
修复方案
修改Agent节点的provision脚本,添加与Server一致的Flannel配置参数:
修改后的Vagrantfile Agent部分
config.vm.define "agent1" do |agent| agent.vm.box = "ubuntu/jammy64" agent.vm.hostname = "agent1" agent.vm.network :private_network, ip: '172.20.20.11', virtualbox__intnet: true agent.vm.provision "shell", inline: "curl -sfL https://get.k3s.io | K3S_URL=https://172.20.20.10:6443 K3S_TOKEN=SECRET sh -s - --node-ip=172.20.20.11 --node-external-ip=172.20.20.11 --flannel-iface enp0s8 --flannel-backend=wireguard-native" end config.vm.define "agent2" do |agent| agent.vm.box = "ubuntu/jammy64" agent.vm.hostname = "agent2" agent.vm.network :private_network, ip: '172.20.20.12', virtualbox__intnet: true agent.vm.provision "shell", inline: "curl -sfL https://get.k3s.io | K3S_URL=https://172.20.20.10:6443 K3S_TOKEN=SECRET sh -s - --node-ip=172.20.20.12 --node-external-ip=172.20.20.12 --flannel-iface enp0s8 --flannel-backend=wireguard-native" end
验证步骤
- 销毁现有集群并重新部署:
vagrant destroy -f && vagrant up - 确认所有节点状态为Ready:
kubectl get nodes - 在不同Agent节点创建测试Pod并验证连通性:
# 在agent1节点调度一个测试Pod kubectl run test-agent1 --image=busybox --overrides='{"spec":{"nodeName":"agent1"}}' --command -- sleep 3600 # 在agent2节点调度一个测试Pod kubectl run test-agent2 --image=busybox --overrides='{"spec":{"nodeName":"agent2"}}' --command -- sleep 3600 # 获取test-agent2的Pod IP POD_IP=$(kubectl get pod test-agent2 -o jsonpath='{.status.podIP}') # 在test-agent1中ping test-agent2的IP kubectl exec -it test-agent1 -- ping $POD_IP
内容的提问来源于stack exchange,提问作者Tacsiazuma
相关产品推荐
相关产品推荐

