Featured image of post K8s 从零到实战 00(上):虚拟机与系统初始化(Lima + Rocky 9)

K8s 从零到实战 00(上):虚拟机与系统初始化(Lima + Rocky 9)

在装有企业安全软件的 Mac 上用 Lima 创建 Rocky 9 虚拟机:镜像下载、换源踩坑(sed 静默失败)、swap 与 SELinux 原理,附完整网络分层排查实录。

目标:得到一台 Rocky Linux 9 机器,并完成最基础的系统设置(软件源、swap、防火墙、SELinux)。本篇不涉及任何 k8s 安装。 本地练习用 Lima 在 Mac 上创建虚拟机;如果是真实服务器,直接从「第 2 步」开始。 网络异常(dnf 卡住 / 虚拟机无法出网)直接看文末「附录 A:网络分层排查实录」。 本篇为阶段 0 上半部分;内核参数与容器运行时见 阶段 0(下)。

1. 创建 Rocky Linux 9 虚拟机(仅 Mac 本地练习需要)

1.1 搭建思路(小白视角)

在动手前,先搞清楚"我们到底在造什么东西":

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
你的 Mac(macOS,没有 Linux 内核)
   │  k8s 是纯粹的 Linux 技术,macOS 上跑不了
   ▼
需要一个"电脑里的电脑" = 虚拟机
   │  Lima:开源虚拟机工具(brew 安装),底层用 macOS 自带的虚拟化框架
   ▼
虚拟机开机需要两样东西:
   ① 系统盘镜像 = 一个"装好 Rocky 9 系统的硬盘文件"(qcow2,约 496MB)
   ② 规格说明书 = 模板文件 lima/rocky-9-ustc.yaml(用哪个镜像、几张网卡、挂什么目录)
   ▼
limactl start 读模板 → 校验镜像 → 复制扩容成 30G 系统盘 → 开机 → 自动配好 SSH
   ▼
limactl shell 进去,就是一台标准的 Rocky Linux 9 服务器

为什么要手动下载镜像(而不是让 Lima 自己下):Rocky 官方源国内只有约 50KB/s, 国内最快的中科大镜像站会用 WAF 拦截 Lima 的多线程下载器(403)。 所以用 curl 单线程先下载到本地(1~2 分钟),模板直接指向本地文件—— 创建虚拟机时完全不需要联网下载,重建也只要几分钟。

1.2 操作命令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# ① 安装 Lima(开源虚拟机工具)
brew install lima

# 验证安装:版本号 ≥ 2.0.0 即满足模板门槛(minimumLimaVersion: 2.0.0)
brew info lima | head -2
# 预期输出:==> lima ✔: stable 2.2.0 (bottled), HEAD
# 注:Caveats 里提到的 lima-additional-guestagents 是给"跨架构模拟"用的
#(M 系列芯片跑 x86 虚拟机才需要),aarch64 虚拟机 + Apple Silicon 是同架构,不用装。

# ② 从中科大镜像站手动下载 Rocky 9.8 镜像(约496MB,1~2分钟)
curl -o lima/images/rocky-9.8-aarch64.qcow2 \
  https://mirrors.ustc.edu.cn/rocky/9/images/aarch64/Rocky-9-GenericCloud-Base-9.8-20260525.0.aarch64.qcow2

# (可选)校验镜像完整性:输出必须等于模板里的 digest
shasum -a 256 lima/images/rocky-9.8-aarch64.qcow2
# 预期输出:24692a444f1f0b8bb95375c38c8b43f8099a115347623691be2c330b40c8a1fe

# ③ 创建并启动虚拟机(4核/6GB内存/30GB磁盘),模板 lima/rocky-9-ustc.yaml 指向上面的本地镜像
limactl start --name=k8s-rocky --cpus=4 --memory=6 --disk=30 --tty=false lima/rocky-9-ustc.yaml

预期输出(创建完成后):

1
INFO[...] READY. Run `limactl shell k8s-rocky` to open the shell.

④ 确认虚拟机创建成功(三连验证,都在 Mac 上执行):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 第一看状态:STATUS 是 Running,且规格符合预期(4核/6GiB/30GiB)
limactl list
# 预期输出:
# NAME        STATUS    SSH               VMTYPE    ARCH      CPUS    MEMORY    DISK
# k8s-rocky   Running   127.0.0.1:xxxxx   vz        aarch64   4       6GiB      30GiB

# 第二看系统:能读出 Rocky Linux 9 的系统信息
limactl shell k8s-rocky -- cat /etc/os-release | head -2
# 预期输出:NAME="Rocky Linux" / VERSION="9.8 (Blue Onyx)"

# 第三看架构:aarch64(与模板 arch 一致)
limactl shell k8s-rocky -- uname -m
# 预期输出:aarch64
1
2
# ⑤ 进入虚拟机(之后所有操作都在虚拟机里执行)
limactl shell k8s-rocky

真实服务器:跳过本步,直接 SSH 登录你的 Rocky 9 服务器即可。 以下所有命令在两种环境下完全一致。

1.3 模板文件逐行解读(lima/rocky-9-ustc.yaml)

模板全文如下(它就是你这台虚拟机的"出生证明"):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# Lima 虚拟机模板:Rocky Linux 9 (aarch64)
minimumLimaVersion: 2.0.0

images:
- location: "/Users/wyf/work/agentproject/k8study/lima/images/rocky-9.8-aarch64.qcow2"
  arch: "aarch64"
  digest: "sha256:24692a444f1f0b8bb95375c38c8b43f8099a115347623691be2c330b40c8a1fe"

mounts:
- location: "~"

mountTypesUnsupported: [9p]

# 使用 macOS Virtualization.framework 的 NAT 网络(vzNAT)
networks:
- vzNAT: true

逐字段拆解:

minimumLimaVersion: 2.0.0 — 版本门槛 Lima 低于 2.0.0 会直接拒绝启动这个模板,而不是做到一半出错。相当于软件包装盒上的"系统要求"。

images: — 虚拟机的系统盘从哪来

字段含义
location镜像文件位置。可以是 URL(Lima 会联网下载),这里写死本地绝对路径 → 创建时零下载
arch镜像的 CPU 架构。aarch64 = ARM64,对应 Apple Silicon;Intel Mac 要用 x86_64
digest镜像的 SHA256 校验值。Lima 用前必校验,文件损坏或被篡改就拒绝启动

手动校验镜像完整性的方法(算法必须和模板里一致,MD5 和 SHA256 没有可比性):

1
2
shasum -a 256 lima/images/rocky-9.8-aarch64.qcow2
# 输出应等于 24692a444f1f0b8bb95375c38c8b43f8099a115347623691be2c330b40c8a1fe

mounts: - location: "~" — 把 Mac 主目录共享进虚拟机 Mac 的 /Users/wyf 会原样出现在虚拟机的 /Users/wyf(同路径、同数据、实时同步)。 所以虚拟机里能直接看到本教程的 docs 和 scripts,不用来回拷贝。 默认只读(没写 writable: true),虚拟机改不了 Mac 的文件——这是安全设计。 实物证据:开机后这行配置被翻译成虚拟机 /etc/fstab 里的一条记录 lima-... /Users/wyf virtiofs ro,nofail,...(virtiofs 文件系统 + ro 只读)。 附带福利:limactl shell 进虚拟机会自动 cd 到你 Mac 上当前所在的目录。

mountTypesUnsupported: [9p] — 禁用一种挂载实现 目录共享有多种后端技术,9p 是老牌协议但 Rocky 9 内核支持不好。 声明不支持后,Lima 改用 virtiofs(macOS 原生虚拟化框架自带,快且稳)。

networks: - vzNAT: true — 让 Mac 能直接访问虚拟机(关键) 不加这行时,虚拟机只有默认的 usernet 网卡(192.168.5.x),Mac 访问不到虚拟机 IP。 加了 vzNAT 后,macOS 系统框架给虚拟机第二张网卡(lima0,192.168.64.x), Mac 浏览器可以直接访问——后续在 Mac 上访问 NodePort/Ingress 就用这个 IP:

1
limactl shell k8s-rocky hostname -I    # 取 192.168.64.x 那个

等价于 Lima 的 shared 网络,但 vzNAT 不需要安装 socket_vmnet、不需要 sudo,零配置。

命令行参数与模板的关系:--cpus=4 --memory=6 --disk=30 是创建时的规格 (模板里没写,也可以写进模板);--name=k8s-rocky 给虚拟机命名; --tty=false 表示创建过程无需交互。这些只在创建时有效,之后用 limactl stop / start 开关机即可,参数已固化在 ~/.lima/k8s-rocky/ 里。

附:Lima 日常管理命令速查(都在 Mac 上执行)

命令作用
limactl list查看所有虚拟机及状态(Running/Stopped)
limactl shell k8s-rocky进入虚拟机终端
limactl shell k8s-rocky -- <命令>不进入虚拟机,直接在 Mac 终端执行一条虚拟机里的命令
limactl stop k8s-rocky关机(虚拟机里所有配置和数据保留)
limactl start k8s-rocky开机(= 重启就是 stop 再 start)
limactl show-ssh k8s-rocky查看 SSH 连接方式(可用标准 ssh 命令进虚拟机)
limactl delete k8s-rocky删除(卸载)虚拟机,数据全丢、不可逆,只影响 ~/.lima/k8s-rocky,不动 Mac 任何东西

推倒重建(想从头再练一遍时):

1
2
3
4
limactl stop k8s-rocky
limactl delete k8s-rocky
# 镜像已下载在 lima/images/,重建只需 2~3 分钟:
limactl start --name=k8s-rocky --cpus=4 --memory=6 --disk=30 --tty=false lima/rocky-9-ustc.yaml

💡 记忆法:limactl 开头的命令都在 Mac 上执行(管理虚拟机); 本文第 2 步开始的命令都在虚拟机里执行(折腾系统)。拿不准在哪,敲 hostname。

2. 切换到 root,软件源换国内镜像

后续命令都以 root 执行(kubeadm 官方文档也是如此):

1
sudo -i

网络预检(30 秒钟,避免后面卡死。虚拟机出网状态会随 Mac 的网络环境变化—— 换网络、开关代理软件都可能改变它,所以环境有变化就先预检):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# ① 先清理可能残留的代理配置——代理软件关着、配置却还指向它,
#    会造成"假性网络故障",先排除这个干扰项:
grep proxy /etc/dnf/dnf.conf
# 有输出(proxy=http://...)则删掉:
sed -i '/^proxy=/d' /etc/dnf/dnf.conf

env | grep -i proxy
# 有输出(http_proxy=... 等)则清掉:
unset http_proxy https_proxy

# ② 确认 Mac 上的代理软件状态(在 Mac 终端执行,空输出=没在运行):
ps aux | grep -iE 'clash|verge|mihomo' | grep -v grep

# ③ 直连测试(虚拟机里执行。不用 -s:成功显示响应头,失败显示明确报错):
curl -I -m 8 https://mirrors.ustc.edu.cn/rocky/
# 看到 HTTP/2 200 等响应头     → 直连正常,继续往下
# 看到 curl: (28) 超时等报错   → 直连出网被拦(常见于 Mac 装有企业安全软件),
#                                打开 Mac 上的 Clash(需开启"允许局域网连接"),
#                                然后去「附录 A.3」配好代理再回来
# 想看更详细过程时用 curl -v -m 10 <URL>,能看清卡在 DNS / TCP / TLS 哪一步

Rocky 官方源国内很慢,换成中科大镜像(真实服务器如果网络好可跳过)。

第一步永远是"先看清楚"(改配置的黄金法则:先看 → 再改 → 后验证):

1
2
# 动手前先确认目标文件的真实格式,顺便验证待会儿 sed 的模式能不能匹配上:
grep -nE '^(metalink|mirrorlist|#?baseurl)' /etc/yum.repos.d/rocky.repo | head -6

预期输出(Rocky 9.8 的出厂状态,实测):

1
2
3
4
5
6
13:mirrorlist=https://mirrors.rockylinux.org/mirrorlist?arch=$basearch&repo=BaseOS-$releasever$rltype
14:#baseurl=http://dl.rockylinux.org/$contentdir/$releasever/BaseOS/$basearch/os/
23:mirrorlist=https://mirrors.rockylinux.org/mirrorlist?arch=$basearch&repo=BaseOS-$releasever-debug$rltype
24:#baseurl=http://dl.rockylinux.org/$contentdir/$releasever/BaseOS/$basearch/debug/tree/
32:mirrorlist=https://mirrors.rockylinux.org/mirrorlist?arch=source&repo=BaseOS-$releasever-source$rltype
33:#baseurl=http://dl.rockylinux.org/$contentdir/$releasever/BaseOS/source/tree/

读法:mirrorlist= 行(未注释)= 启用的官方动态源(国内慢,就是要换掉的对象); #baseurl= 行(带 #)= 注释掉的备用地址(等下要启用并指向中科大)。 每个仓库段(BaseOS / debug / source / AppStream……)都是同样两行成对出现。

💡 老版本 Rocky 显示的是 metalink= + #baseurl=https://...,格式不同。 这正是换源 sed 要兼容两种格式的原因;如果将来版本又变了,以这一步看到的实际格式为准。

确认格式后执行换源(兼容新老两种格式的写法):

1
sed -e 's|^metalink=|#metalink=|g' -e 's|^mirrorlist=|#mirrorlist=|g' -e 's|^#baseurl=https\?://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.ustc.edu.cn/rocky|g' -i.bak /etc/yum.repos.d/rocky*.repo

⚠️ 三个坑都要防: ① sed 匹配不到时静默成功、不报错,必须验证(很多人栽在这里); ② -i.bak 每次执行都会重新备份当前文件,重复执行会把"原始备份"覆盖成"改后的文件"。 想稳妥留底,动手前先手动存一份:cp /etc/yum.repos.d/rocky.repo{,.orig}(还原:cp 反向拷贝); ③ 多行命令(带 \ 续行)粘贴到终端容易断行,报 command not found / sed: can't read 时, 把命令拼成单行重贴(本文给的换源 sed 就是单行版,可直接复制)。

验证(必须两项都过):

1
2
3
4
5
6
7
grep -E '^baseurl' /etc/yum.repos.d/rocky.repo | head -3
# 必须看到输出:baseurl=https://mirrors.ustc.edu.cn/rocky/$releasever/BaseOS/$basearch/os/ 等

grep -cE '^(metalink|mirrorlist)' /etc/yum.repos.d/rocky.repo
# 必须是 0(动态源全部被注释)

dnf -y update

💡 不换源也能跑? mirrorlist 会按你的 IP 动态分配镜像,运气好分到国内 CDN 也快—— 但那是赌手气,不可复现。换中科大 baseurl 的意义是任何时间、任何网络环境都快且稳定, 后面装 containerd、kubeadm、拉镜像全是大流量下载,把不确定性压到最低。

3. 关闭 swap(必须)

为什么必须:k8s 调度器按"容器申请多少内存"做调度决策。开着 swap 时, 内存不够系统会偷偷把内存页换到磁盘,kubelet 看到的内存使用量就失真了, 调度决策变得不可预测——所以 kubelet 检测到 swap 开启会拒绝启动。

1
2
3
4
5
swapoff -a
# 永久关闭:注释掉 /etc/fstab 中含 swap 的行
sed -i '/swap/s/^/#/' /etc/fstab
# 验证:应输出空行
swapon --show

💡 Rocky 云镜像(GenericCloud)默认就没有 swap(/etc/fstab 里无 swap 条目、free -h 的 Swap 全 0), 这两条命令对它是无害的空操作,但必须执行——真实服务器默认有 swap,习惯要养成。 (k8s 1.28+ 有实验性 swap 支持,学习阶段不启用。)

4. 配置防火墙与 SELinux(学习环境简化处理)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 学习环境:直接关闭防火墙,避免端口问题干扰学习
#(Rocky 云镜像默认未安装 firewalld,报 "Unit could not be found" 属正常,跳过即可)
systemctl stop firewalld
systemctl disable firewalld

# SELinux 设为宽容模式(容器运行时需要,云镜像默认 Enforcing,必须改)
setenforce 0
sed -i 's/^SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config

# 验证:应输出 Permissive
getenforce

SELinux 是什么:Linux 普通权限(rwx、属主)管的是"用户能不能访问文件", SELinux 更进一步,在内核里给每个进程也戴上镣铐——即使是 root 进程, 也只能碰安全策略允许的东西(Rocky/RHEL 系默认开启的强制访问控制)。三种模式:

模式行为类比
Enforcing(强制)违规操作直接拒绝并记日志保安:当场拦下
Permissive(宽容)违规操作放行,只记日志摄像头:不拦,全拍下
Disabled(关闭)完全不工作纪委下班

学习环境用 Permissive:containerd/k8s 的某些文件操作会被默认策略误拦, Enforcing 会导致 Pod 莫名其妙起不来;Permissive 不挡路又保留日志, 事后可用 ausearch -m avc -ts recent 翻看"如果开着会拦什么"。 两条命令的分工:setenforce 0 管"现在"(重启失效),/etc/selinux/config 管"重启后"。

⚠️ 生产环境不要直接关防火墙,应放行 k8s 所需端口 (6443、2379-2380、10250、10259、10257 及 NodePort 30000-32767)。 等学到阶段 9(NetworkPolicy)时你会理解得更深。

常见问题

Q: 换源 sed 执行后 dnf update 依然卡住? 先跑验证命令 grep -E '^baseurl' /etc/yum.repos.d/rocky.repo | head -3。输出为空说明 sed 没匹配到 (Rocky 9.8 是 mirrorlist+http://,老版本是 metalink+https://,本文第 2 步已兼容两种格式)。 输出正常但 dnf 仍卡 0 字节 → 虚拟机直连出网被拦,看「附录 A」。

Q: limactl start 报 403 / 下载镜像很慢? Rocky 官方源(dl.rockylinux.org)国内约 50KB/s;中科大镜像站的 WAF 会拦截 Lima 的多线程下载器。 按第 1 步的方法:curl 单线程手动下载 + 模板指向本地文件即可,约 1~2 分钟。

Q: 重启虚拟机后这些配置还在吗? 都在。本阶段的配置全部写入了系统文件,永久生效。 (limactl stop / limactl start 就是关机/开机。)


附录 A:网络分层排查实录(虚拟机无法出网时必读)

本节是一次真实排查的完整记录:在一台装有企业安全软件(深信服/微步)+ Clash 代理的 Mac 上, 虚拟机所有直连外网流量被拦截,最终通过"借 Mac 的代理出网"解决。排查方法通用。

A.1 分层排查法(自底向上,逐层缩小范围)

每层一条命令,在哪一层断,问题就在哪一层:

1
2
3
4
5
6
第1层  VM → 网关(Mac)        ping -c 2 -W 3 192.168.5.2
第2层  DNS 解析               getent hosts mirrors.ustc.edu.cn
第3层  VM → 外网纯 IP         ping -c 2 -W 3 223.5.5.5        # 阿里DNS,绕过域名
第4层  VM → 外网 TCP          curl -k --connect-timeout 6 https://110.242.68.66/
第5层  Mac → 外网             curl -I -m 8 https://mirrors.ustc.edu.cn/rocky/   # Mac 终端执行
第6层  VM 借 Mac 代理出网     curl -x http://192.168.5.2:7897 https://mirrors.ustc.edu.cn/rocky/ -sI

实测结果与推论:

层结果推论
VM→网关✅ 通虚拟网卡正常
DNS✅ 能解析DNS 由 Lima 网关在 Mac 侧代答,不依赖 VM 真实出网
VM→外网 IP❌ 100% 丢包与域名无关,IP 层就断了
VM→外网 TCP❌ 000 超时同上
Mac→外网✅ 200Mac 网络本身没问题
VM 经 Mac 代理✅ 200VM↔Mac 畅通,代理可作绕行方案

结论画像:Mac 正常、VM 到 Mac 正常、VM 出网(任意目标)全断 → 问题在 Mac 系统网络层对"虚拟机转发流量"的拦截。

补充命令——虚拟机有两块网卡两条默认路由,可分别强制指定出口测试:

1
2
3
4
5
ip route                                    # default via 192.168.64.1 (lima0, vzNAT, metric 100 优先)
                                            # default via 192.168.5.2  (eth0, usernet, metric 200)
curl --interface eth0  ...                  # 强制走 usernet 出口
curl --interface lima0 ...                  # 强制走 vzNAT 出口
# 两个都 000 → 不是单条链路问题,是系统级拦截

A.2 定位真凶:企业安全软件的网络扩展

先排除代理软件干扰(彻底退出 Clash Verge 并 limactl stop && limactl start 重启虚拟机,无效),再查系统扩展:

1
2
3
4
5
6
# Mac 终端执行:列出所有系统扩展
systemextensionsctl list

# 实测发现两个 activated+enabled 的企业安全组件:
#   cn.threatbook.Cardinal.net-extension   ← 微步在线(上网行为/威胁情报)
#   com.sangfor.auem.sfservice.extension   ← 深信服(终端安全/零信任)

这类安防客户端在 macOS 网络层挂内容过滤器:本机进程的流量识别放行,虚拟机 NAT 转发的流量 不是"本机认证进程"发出,全部丢弃——完美对上 A.1 的现象画像。

⚠️ 这类软件不要卸载或停用(公司管理制度,可能触发告警)。正确姿势是绕行。

其他辅助排查命令(排除干扰项时用,均在 Mac 执行):

1
2
3
4
ps aux | grep -iE 'clash|verge|mihomo' | grep -v grep   # 确认代理软件进程是否退干净
networksetup -getwebproxy Wi-Fi                          # 看系统代理开关状态
netstat -rn -f inet | head -8                            # 看默认路由是否被 VPN/TUN 劫持
/usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate   # macOS 应用防火墙状态

A.3 解决方案:虚拟机借 Mac 的代理出网

前提:Clash Verge 运行中,且开启"允许局域网连接"(Allow LAN)。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 虚拟机里,root 执行:

# dnf 走代理(dnf 不读环境变量,必须写配置;永久生效)
echo 'proxy=http://192.168.5.2:7897' >> /etc/dnf/dnf.conf

# curl 等命令行工具走代理(仅当前终端有效)
export http_proxy=http://192.168.5.2:7897
export https_proxy=http://192.168.5.2:7897

# 验证 → 显示响应头即通
curl -I -m 8 https://mirrors.ustc.edu.cn/rocky/

containerd 的代理配置是 systemd drop-in(它是不读环境变量的系统服务), 见 阶段 0(下) 第 6 步。

⚠️ 代理方案的善后(重要):哪天直连恢复了、或者你把 Clash 关了,这些代理配置会让 dnf/curl/containerd 全部连不上(指向一个不存在的代理)。恢复直连前必须清理:

1
2
3
4
5
sed -i '/^proxy=/d' /etc/dnf/dnf.conf        # 删 dnf 代理配置
unset http_proxy https_proxy                  # 清当前终端的代理变量
# 如果配过 containerd 代理,也要一并删掉:
rm -f /etc/systemd/system/containerd.service.d/proxy.conf
systemctl daemon-reload && systemctl restart containerd

一句话:代理配置和代理软件必须同开同关。这正是第 2 步「网络预检」第 ① 小步存在的原因。

为什么 192.168.5.2 可以写死在配置里:它是 Lima 源码内置的 usernet 网关常量(不经过任何 配置文件),语义是"Mac 本机"。虚拟机重启、Mac 重启、换 Wi-Fi、去公司都不会变。同理稳定: 虚拟机 eth0 的 192.168.5.15(按虚拟机 MAC 固定分配)、lima0 的 192.168.64.2。

A.4 Lima 网络拓扑速查

1
2
3
4
5
6
7
8
┌─ 物理网(家里/公司 Wi-Fi,Mac 的 en0)—— 这层会随地点变
│
├─ Lima usernet(192.168.5.0/24,Lima 内置默认,无需配置)
│   虚拟机 eth0 = 192.168.5.15,网关/DNS = 192.168.5.2(= Mac)
│
└─ macOS vzNAT(192.168.64.0/24,模板里 vzNAT: true 开启)
    虚拟机 lima0 = 192.168.64.2,网关 = 192.168.64.1(= Mac)
    ← Mac 浏览器访问 NodePort/Ingress 用这个 IP
1
2
3
4
5
6
7
8
9
# 区分"我在 Mac 还是虚拟机里":看提示符或问 hostname
#   wyf@MacBook-Pro %        → Mac(zsh,%)
#   [wyf@lima-k8s-rocky ~]$  → 虚拟机普通用户
#   [root@lima-k8s-rocky ~]# → 虚拟机 root
hostname                    # lima-k8s-rocky = 虚拟机

# Mac 上 Lima 的可选网络定义(shared/bridged/host,本教程未使用):
cat ~/.lima/_config/networks.yaml
# 注意:里面没有 192.168.5.x —— usernet 网段是编译进 Lima 源码的出厂默认值

目录挂载的实物证据:模板里 mounts: - location: "~" 开机后变成虚拟机 /etc/fstab 里的一行 lima-... /Users/wyf virtiofs ro,nofail,...(virtiofs 共享文件系统,ro 只读), 这就是虚拟机里能直接看到 Mac 主目录的原因。

A.5 排查命令总表

命令用途执行位置
ip route看默认路由/网卡/优先级VM
hostname -I看虚拟机所有 IPVM
ping -c 2 -W 3 <IP>测某层连通性VM
getent hosts <域名>测 DNS 解析VM
curl -I -m 8 <URL>测 HTTP 通不通VM/Mac
curl --interface eth0 <URL>强制指定网卡出口VM
curl -x http://192.168.5.2:7897 <URL>经 Mac 代理测试VM
systemextensionsctl list查系统网络/安全扩展Mac
networksetup -getwebproxy Wi-Fi查系统代理Mac
netstat -rn -f inet查 Mac 路由表是否被劫持Mac
ps aux | grep -iE 'clash|verge'确认代理进程状态Mac
limactl list / limactl shell <名字>查看/进入虚拟机Mac
cat ~/.lima/_config/networks.yaml看 Lima 可选网络定义Mac

动手练习

  1. 用 limactl shell k8s-rocky 以外的另一种方式进入 VM(提示:Lima 自动配置了 SSH,ssh 加端口和密钥,用 limactl show-ssh k8s-rocky 查看)。
  2. 用附录 A 的分层排查法,在虚拟机里依次执行第 1/2/5 层的命令,确认每层的输出你都看得懂。

下一步

➡️ 阶段 0(下):内核参数与容器运行时

使用 Hugo 构建
主题 Stack 由 Jimmy 设计