Ubuntu 虚拟机只有一个网卡时,如何在固定 IP 和 DHCP(手机热点)之间切换

适用场景:

  • Ubuntu 20.04 / 22.04
  • 虚拟机(VMware / Hyper-V / VirtualBox)
  • 只有一个网卡(eth0 / ens / enx...)
  • 需要在 固定 IP(如 10.10.10.20)DHCP(如 192.168.x.x,手机热点) 之间切换

一、问题背景

在做 Kubernetes 主从验证时,我的环境是:

  • 一台 Ubuntu 物理服务器(Master)
  • 一台 Windows 上的 Ubuntu 虚拟机(Worker)
  • 虚拟机只有一个网卡

正常情况下我给虚拟机配置的是固定 IP:

复制代码
10.10.10.20/24

但在以下场景中经常会遇到问题:

  • 服务器没外网
  • 拉不到 K8s / Calico / CoreDNS 镜像
  • 临时需要用 手机 USB 热点

结果就是:

插上手机热点后,IP 变成了 192.168.42.x

重启后又变回 10.10.10.20

Kubernetes 通信直接炸掉 😅


二、核心原理(一定要懂)

1️⃣ 192.168.x.x 是怎么来的?

不是系统乱配的,而是 DHCP

  • 手机热点 = DHCP Server
  • Ubuntu = DHCP Client
  • 一插热点 → 自动分配 192.168.42.x

👉 这是临时 IP


2️⃣ 10.10.10.20 是什么?

这是你通过 netplan 手动配置的静态 IP

yaml 复制代码
dhcp4: no
addresses:
  - 10.10.10.20/24

👉 这是固定 IP


3️⃣ 为什么会"同时存在两个 IP"?

因为你做过其中一件事:

  • 开过 dhcp4: true
  • /etc/netplan 里有多个 .yaml
  • 没清理旧配置

于是结果变成:

text 复制代码
eth0:
  10.10.10.20   (静态)
  192.168.42.89 (DHCP)

⚠️ 对 Kubernetes 来说,这是灾难配置


三、正确的做法(强烈推荐)

原则一句话:

同一时间,只能用一种方式:要么 DHCP,要么静态 IP


四、方案一:切到手机热点(DHCP)

适合:

  • 拉镜像
  • 临时上网
  • 不跑 K8s

1️⃣ 删除所有旧 netplan 配置

bash 复制代码
sudo rm -f /etc/netplan/*.yaml

2️⃣ 新建 DHCP 配置(只有一个文件)

bash 复制代码
sudo tee /etc/netplan/01-dhcp.yaml <<EOF
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: true
EOF

⚠️ 如果网卡不是 eth0,用 ip -br a 查看实际名称


3️⃣ 修复权限(非常重要)

bash 复制代码
sudo chmod 600 /etc/netplan/01-dhcp.yaml

4️⃣ 应用配置

bash 复制代码
sudo netplan apply

5️⃣ 验证

bash 复制代码
ip a

你应该看到类似:

text 复制代码
inet 192.168.42.x/24

五、方案二:切回固定 IP(10.10.10.20)

适合:

  • Kubernetes 主从通信
  • 内网集群
  • 稳定运行

1️⃣ 删除 DHCP 配置

bash 复制代码
sudo rm -f /etc/netplan/01-dhcp.yaml

2️⃣ 写固定 IP 配置

bash 复制代码
sudo tee /etc/netplan/01-static.yaml <<EOF
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
      addresses:
        - 10.10.10.20/24
      gateway4: 10.10.10.1
      nameservers:
        addresses:
          - 8.8.8.8
          - 114.114.114.114
EOF

3️⃣ 修复权限

bash 复制代码
sudo chmod 600 /etc/netplan/01-static.yaml

4️⃣ 应用配置

bash 复制代码
sudo netplan apply

5️⃣ 验证

bash 复制代码
ip a

应只看到:

text 复制代码
inet 10.10.10.20/24

六、常见坑总结(血泪经验)

❌ 同时存在多个 netplan 文件

bash 复制代码
ls /etc/netplan

👉 只保留一个


❌ 文件权限不对

text 复制代码
Permissions too open

解决:

bash 复制代码
sudo chmod 600 /etc/netplan/*.yaml

❌ 同时开启 DHCP + 静态 IP

👉 表面能用

👉 K8s 一定出问题


七、和 Kubernetes 的关系(重点)

场景 是否适合
192.168.x(热点) ❌ 不适合集群
10.10.10.x(静态) ✅ 强烈推荐
IP 变化 ❌ kubelet 会反复重连
固定 IP ✅ Node 稳定 Ready

八、最终结论

手机热点 IP 是临时的,不会持久
netplan 写死的 IP 才是"开机必定生效的"

只要你:

  • /etc/netplan 里只有一个文件
  • dhcp4: no
  • 写死 10.10.10.20

那么:

重启多少次,IP 都不会变


相关推荐
gsgbgxp2 小时前
安装库是优先用conda还是pip
深度学习·ubuntu·conda·pip
他人是一面镜子,保持谦虚的态度3 小时前
ubuntu 18.04 压缩 激光雷达点云和图像 topic,并录制bag 数据包
linux·运维·ubuntu
mobai74 小时前
Ubuntu环境上安装NTP服务
linux·运维·ubuntu
胡斌附体16 小时前
linux(ubuntu)拉取源码进行docker容器部署
linux·git·ubuntu·docker·node·nvm
松涛和鸣17 小时前
DAY63 IMX6ULL ADC Driver Development
linux·运维·arm开发·单片机·嵌入式硬件·ubuntu
YMWM_20 小时前
cursor连接Ubuntu远程
linux·运维·ubuntu
木卫二号Coding21 小时前
Docker-构建自己的Web-Linux系统-镜像colinchang/ubuntu-desktop:22.04
linux·ubuntu·docker
维度攻城狮21 小时前
Ubuntu突然无法中文输入的问题解决办法
linux·运维·ubuntu
wacpguo1 天前
Ubuntu 24.04 安装 Docker
linux·ubuntu·docker