ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Firecracker 如何为同一快照的多个克隆 microVM 配置网络命名空间与 NAT 网络

Firecracker 如何为同一快照的多个克隆 microVM 配置网络命名空间与 NAT 网络 Firecracker 如何为同一快照的多个克隆 microVM 配置网络命名空间与 NAT 网络【免费下载链接】firecrackerSecure and fast microVMs for serverless computing.项目地址: https://gitcode.com/GitHub_Trending/fi/firecracker从一个 Firecracker 快照恢复多个克隆 microVM 时默认情况下这些克隆是恢复不出网络连接的Firecracker 保存并尝试恢复网络设备时使用的是最初配置的 TAP 名称而每个恢复出的 guest 都会带着完全相同的网络配置——尤其是同一个 IP 地址。本文基于仓库文档 docs/snapshotting/network-for-clones.md 给出的方案说明如何为每个克隆建立独立网络命名空间、用veth对把命名空间接入宿主机再用iptablesNAT 让所有克隆共用同一个内部 guest IP 访问外部网络。文档开头明确提示这套方案只是让你起步的示例官方不声称它是高性能或安全的配置。因此它适合先在测试环境跑通再按需加固。前提快照前的典型网络状态方案假设每台 VM 只挂一个网络接口。如果要给多个接口都建立完全连通性把下面流程中与每个接口相关的部分重复一遍即可。打快照之前VM 的典型状态是一个网络接口背后是 TAP 设备例如名为vmtap0TAP 设备上有 IP 地址文档称之为 TAP IP 地址例如192.168.241.1/29guest 内部对应的 virtio 设备上配置了 guest IP 地址例如192.168.241.2/29。这两个值在后面所有命令中都会用到。为每个克隆创建独立网络命名空间所有克隆都会尝试使用与原始 VM 同名的 TAP 设备默认情况下不允许重名共存所以每个克隆要放进各自的网络命名空间——只要 TAP 接口位于不同的命名空间就可以重名。以第一个克隆clone0为例先创建命名空间fc0--netnsjailer 参数要求的命名空间必须已存在所以要先用ip netns add建好sudo ip netns add fc0新命名空间是空的需要在其中创建与原快照一致的 TAP 接口sudo ip netns exec fc0 ip tuntap add name vmtap0 mode tapip netns exec ns_name command的作用是在指定命名空间的上下文中执行命令。接着把 TAP 接口配置成与快照中 guest 预期一致的状态sudo ip netns exec fc0 ip addr add 192.168.241.1/29 dev vmtap0 sudo ip netns exec fc0 ip link set vmtap0 upjailer 启动克隆时通过--netns参数指定该命名空间--netns接受一个网络命名空间 handle 的路径jailer 会用它加入对应命名空间参数说明见 docs/jailer.md。每个克隆对应一个命名空间clone0用fc0clone1用fc1以此类推。验证命名空间内基础连通性此时多个克隆虽然可以分别在自己的命名空间中启动但它们只有各自的 TAP 接口没有通往宿主机其余部分的连通性。文档给出的验证方式是从命名空间内部 ssh 到clone0的 guestsudo ip netns exec fc0 ssh root192.168.241.2能连通说明 TAP 配置与 guest 内部网络配置对上了。用 veth 对把命名空间接入宿主机要给克隆提供完整连通性需要先把命名空间接入宿主机再解决“所有克隆 guest IP 相同”的问题。前者用veth对完成——它是两个互为链路的虚拟接口任意一端发出的包会立即被另一端收到一端留在命名空间内另一端移入宿主机全局命名空间按网络配置决定包的流向。veth 两端要各配一个 IP。文档给出的分配规则是对克隆索引idx宿主机一侧用10.idx / 30.(idx % 30) * 8.1/24命名空间一侧用同一网段以2结尾的地址。clone0对应10.0.0.1宿主机侧和10.0.0.2命名空间侧。宿主机一侧的 veth 接口名必须唯一文档建议取veth(idx 1)即clone0用veth1。对命名空间fc0的完整命令如下# 在命名空间内创建 veth 对 sudo ip link add name veth1 type veth peer name veth0 netns fc0 sudo ip netns exec fc0 ip addr add 10.0.0.2/24 dev veth0 sudo ip netns exec fc0 ip link set dev veth0 up sudo ip addr add 10.0.0.1/24 dev veth1 sudo ip link set dev veth1 up # 把外侧端点设为离开命名空间流量的默认网关 sudo ip netns exec fc0 ip route add default via 10.0.0.1用 iptables NAT 规则给克隆出网最后一步是添加iptables规则在转发时改写源/目的 IP从而允许所有克隆共用同一个内部 IP# 找到宿主机的出口设备 UPSTREAM$(ip -j route list default |jq -r .[0].dev) # VM 出来的流量做地址 NAT ip netns exec fc0 iptables -t nat -A POSTROUTING -s 192.168.241.1/29 -o veth0 -j MASQUERADE iptables -t nat -A POSTROUTING -s 10.0.0.0/30 -o $UPSTREAM -j MASQUERADE # 默认放行转发 iptables -P FORWARD ACCEPT ip netns exec fc0 ip route add default via 10.0.0.1 ip netns exec fc0 iptables -P FORWARD ACCEPT注意第二行iptables -t nat -A POSTROUTING -s 10.0.0.0/30 ...中的10.0.0.0/30是文档原文给出的值与 veth 步骤中的/24网段不一致这里按文档原样保留实际使用前请结合自身配置确认。另外ip netns exec fc0 ip route add default via 10.0.0.1这一行在 veth 步骤中已经执行过属于文档内的重复如果已加过该默认路由可直接跳过这一行。配置完成后文档声明此时克隆应当已经具备对外连通性。为了让 guest 适应新环境还可以在 guest 内显式配置默认路由和 DNSip route default via 10.0.0.1 echo nameserver 8.8.8.8 /etc/resolv.conf以及清空 guest 的 ARP/邻居表否则 guest 发出的包最长可能在 arp 缓存超时时间内仍然使用旧的链路层地址超时之后即使不显式清理双向连通性也会恢复ip -family inet neigh flush any ip -family inet6 neigh flush any替代路径未用 jailer 或 TAP 设备来自设备池时重命名宿主机设备在不使用 jailer 的环境里恢复快照可能更棘手宿主机上的 TAP 设备可能与原始 VM 打快照时映射的 TAP 设备不同例如 TAP 设备来自一个设备池。这时可以使用快照恢复 API 的network_overrides参数指定 guest 网络设备与宿主机 TAP 设备的映射关系。例如快照中有一块名为eth0的网卡可以在恢复快照时把它重定向到宿主机设备vmtap01curl --unix-socket /tmp/firecracker.socket -i \ -X PUT http://localhost/snapshot/load \ -H Accept: application/json \ -H Content-Type: application/json \ -d { snapshot_path: ./snapshot_file, mem_backend: { backend_path: ./mem_file, backend_type: File }, network_overrides: [ { iface_id: eth0, host_dev_name: vmtap01 } ] }这条路径可能需要重新配置 VM 内部网络才能保持外部可路由。guest 内的典型网络配置可参考 docs/network-setup.md 中 In the guest 一节。如果你既不用网络命名空间也不使用 jailer就需要通过 vsock 或其他通道让 guest 知晓它必须重新配置网络以匹配 TAP 设备上的配置。文档给出的示例是新 TAP 设备如vmtap3配置的 guest 地址为172.16.3.2则快照恢复后在 guest 内执行# 在 guest 内 # 清掉之前的地址和路由 ip addr flush dev eth0 ip route flush dev eth0 # 配置新地址 ip addr add 172.16.3.2/30 dev eth0 ip route add default via 172.16.3.1/30 dev eth0可选为克隆添加入站连通性上述配置只提供出站egress连通性。如果还想让 guest 可被网络命名空间之外的网络访问入站ingress需要为该克隆选一个唯一的“克隆地址”作为代表文档示例从172.16.0.0/12中取172.16.0.1然后把发往该克隆地址的目的地址改写成 guest IPip netns exec fc0 iptables -t nat -A PREROUTING -i veth0 \ -d 172.16.0.1 -j DNAT --to 192.168.241.2再在宿主机上加一条路由让宿主机命名空间能访问到 guestip route add 172.16.0.1 via 10.0.0.2文档给出的验证方式ping 172.16.0.1 # 或 ssh root172.16.0.1能 ping 通或 ssh 登录说明入站路径已通。限制与下一步官方明确说明本文档中的整套配置只是起步示例不声称是高性能或安全方案每个克隆要占用一个独立网络命名空间veth 端点 IP 按idx计算宿主机侧接口名按veth(idx 1)保持唯一如果不用网络命名空间或 jailerguest 必须感知到宿主机侧 TAP 变化并自行重配网络否则恢复后可能不可路由文档最后指向社区讨论 this discussion 作为改进版入站/出站全连通配置的延伸阅读。【免费下载链接】firecrackerSecure and fast microVMs for serverless computing.项目地址: https://gitcode.com/GitHub_Trending/fi/firecracker创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表